Thư viện AFL
Thư viện AFL
Mã màu động trong bảng lợi nhuận của Amibroker: Một cách tiếp cận trực quan hấp dẫn

Mã màu động trong bảng lợi nhuận của Amibroker: Một cách tiếp cận trực quan hấp dẫn

Bảng lợi nhuận là công cụ có giá trị để các nhà giao dịch và nhà đầu tư phân tích hiệu quả chiến lược giao dịch của các khoản đầu tư của họ theo thời gian. Tuy nhiên, cách trình bày truyền thống của các bảng này, với màu sắc mặc định, có thể gây nhàm chán về mặt hình ảnh và khó diễn giải. Nhập mã màu động – một cách đơn giản nhưng mạnh mẽ để nâng cao khả năng đọc và sự hấp dẫn trực quan của bảng lợi nhuận trong Amibroker.

Bảng lợi nhuận động – Báo cáo backtesting của Amibroker

Tại sao phải mã hóa màu động trong bảng lợi nhuận?

Khả năng đọc nâng cao:

Bảng lợi nhuận được mã hóa màu giúp người dùng dễ dàng xác định các mẫu và xu hướng trong dữ liệu hơn. Màu sắc tương phản cho phép mắt người phân biệt nhanh chóng giữa các giá trị dương và âm, giúp dễ dàng phát hiện các tháng hoặc năm có hiệu suất cao và kém hiệu quả.

Sự hấp dẫn trực quan:

Mã màu động sẽ thêm một lớp thú vị trực quan vào các bảng lợi nhuận đơn điệu. Các sắc thái và màu sắc khác nhau làm cho bảng trở nên hấp dẫn và thú vị hơn khi phân tích.

Ra quyết định nhanh hơn:

Việc trình bày dữ liệu trực quan rõ ràng cho phép các nhà giao dịch và nhà đầu tư đưa ra quyết định nhanh hơn và sáng suốt hơn. Định dạng dễ hiểu giúp người dùng phát hiện nhanh các cơ hội và rủi ro mà không cần phải mất thời gian giải mã dữ liệu thô.

Các bước cài đặt Bảng lợi nhuận (Mã màu)

  1. Sao chép mã AFL bên dưới. Đi tới Tệp Amibroker -> Mới -> Công thức và lưu công thức dưới dạng
  1. Bảng lợi nhuận (Mã màu)

.

fl

và lưu tệp trong thư mục //Amibroker//Formulas//Reports.

  1. Kiểm tra lại Chiến lược giao dịch mà bạn chọn và bây giờ hãy xem phần Báo cáo kiểm tra lại -> Biểu đồ để trực quan hóa bảng lợi nhuận động ngay bên dưới bảng lợi nhuận thuần túy.

Mã hóa màu động – Mã AFL Amibroker

Liên quan

Mã nguồn (.afl)
EnableTextOutput( 3 ); // enable HTML output into report (Version 5.84 or higher!)

eq = C;

yr = Year();
mo = Month();

YearChange = yr != Ref( yr, 1 );
MonChange = mo != Ref( mo, 1 );

FirstYr = 0;
LastYr = 0;

startbar = 0;

////////////////////////////
// SKIP non-trading bars
////////////////////////////

for ( i = 0; i < BarCount; i++ )
{
    if ( eq[ i ] )
    {
        startbar = i;
        break;
    }
}

////////////////////////////
// collect yearly / monthly changes in equity
// into dynamic variables
////////////////////////////

LastYrValue = eq[ startbar  ];
LastMoValue = eq[ startbar  ];
MaxYrProfit = MinYrProfit = 0;
MaxMoProfit = MinMoProfit = 0;

for ( i = startbar + 1; i < BarCount; i++ )
{
    if ( YearChange[ i ] || i == BarCount - 1 )
    {
        Chg = 100 * ( -1 + eq[ i ] / LastYrValue );
        VarSet( "ChgYear" + yr[ i ], Chg );

        MaxYrProfit = Max( MaxYrProfit, Chg );
        MinYrProfit = Min( MinYrProfit, Chg );

        if ( FirstYr == 0 )
            FirstYr = yr[ i ];

        LastYr = yr[ i ];

        LastYrValue = eq[ i ];
    }

    if ( MonChange [ i ] || i == BarCount - 1 )
    {
        mon = mo[ i ];

        Chg = 100 * ( -1 + eq[ i ] / LastMoValue );

        VarSet( "ChgMon" + yr[ i ] + "-" + mon, Chg );
        VarSet( "SumChgMon" + mon, Chg + Nz( VarGet( "SumChgMon" + mon ) ) );
        VarSet( "SumMon" + mon, 1 + Nz( VarGet( "SumMon" + mon ) ) );

        MaxMoProfit = Max( MaxMoProfit, Chg );
        MinMoProfit = Min( MinMoProfit, Chg );

        LastMoValue = eq[ i ];
    }
}



MonthNames = "Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec";

function NumToHex( num )
{
    hexVal = "";
    hexChars = "0123456789ABCDEF";

    while (num > 0)
    {
        remainder = num % 16;
        hexVal = StrMid(hexChars, remainder, 1) + hexVal;
        num = int(num / 16);
    }

    while (StrLen(hexVal) < 2)
    {
        hexVal = "0" + hexVal;
    }

    return hexVal;
}

function ColorBasedOnPercent( Chg )
{


    if (Chg > 0)
    {
        greenIntensity = 255-Min(255, (Chg*25));
        //_TRACE("Green Intensity:"+greenIntensity);
        hexColor = "#" + NumToHex(int(greenIntensity)) + "FF" + NumToHex(int(greenIntensity));

    }
    else if (Chg < 0)
    {
        redIntensity = 255-Min(255, (Chg*-25) );
        hexColor = "#" + "FF" + NumToHex(int(redIntensity)) + NumToHex(int(redIntensity));

        
    }
    else
    {
        hexColor = "#FFFFFF";
    }
    
    //_TRACE("hexColor: "+hexColor);

    return hexColor;
}






function GenProfitTableHTML( )
{
    printf( "<table border='1' bordercolor='#000000' cellspacing='0' cellpadding='3'style='border-collapse:collapse;'>\n" );

    printf( "<tr bgcolor='#eeffee' >\n" );

    Header = "Year," + MonthNames + ",Yr%%";

    for ( Col = 0; ( Colname = StrExtract( Header, Col ) ) != ""; Col++ )
    {
        printf( "<td><b>" + Colname + "</b></td>" );
    }

    printf( "</tr>\n" );

    for ( y = FirstYr; y <= LastYr; y++ )
    {
        if ( y % 2 )
            printf( "<tr bgcolor='#ffffff'>\n<td bgcolor='#eeffff'>" );
        else
            printf( "<tr bgcolor='#ffffee'>\n<td bgcolor='#eeffee'>" );

        printf( "<b>%g</b></td>", y );

        for ( m = 1; m <= 12; m++ )
        {
            Chg = VarGet( "ChgMon" + y + "-" + m );

            if ( NOT IsNull( Chg ) )
            {
                printf( "<td nowrap bgcolor='" + ColorBasedOnPercent( Chg ) + "'>%.1f%%</td>", Chg );
            }
            else
                printf( "<td>N/A</td>" );
        }

        x = VarGet( "ChgYear" + y );

        if ( y % 2 )
            printf( "<td nowrap bgcolor='" + ColorBasedOnPercent( x ) + "'>" );
        else
            printf( "<td nowrap bgcolor='" + ColorBasedOnPercent( x ) + "'>" );

        printf( "<b>%.1f%%</b></td>", x );

        printf( "</tr>\n" );
    }

    printf( "<tr bgcolor='#eeffee' >\n" );

    printf( "<td><b>Avg</b></td>" );

    for ( m = 1; m <= 12; m++ )
    {
        x = Nz( VarGet( "SumChgMon" + m ) / VarGet( "SumMon" + m ) );

        printf( "<td nowrap bgcolor='" + ColorBasedOnPercent( x ) + "'><b>%.1f%%</b></td>", x );
    }

    printf( "<td> </td>" );

    printf( "</tr></table>\n" );
}



///////////////////////////
// This function checks if currently selected symbol
// is portfolio equity
//////////////////////////
function CheckSymbol()
{
    if ( Name() != "~~~EQUITY" AND Name() != "~~~OSEQUITY" )
    {
        printf( "For accurate results switch to ~~~EQUITY symbol<br>" );
    }
}

CheckSymbol();

////////////////////////////
// Main program
////////////////////////////
GenProfitTableHTML();

Hướng dẫn: Copy đoạn mã trên, mở AmiBroker Formula Editor, dán vào và lưu lại với tên tương ứng.