Thứ Năm, 05/11/202605/11/2026

CÁCH THÊM CHỈ SỐ DO NGƯỜI DÙNG ĐỊNH NGHĨA VÀO BÁO CÁO KIỂM TRA / TỐI ƯU HÓA TRONG AMIBROKER

thumbnail (20)
thumbnail (20)
Mục lục
Mục lục

AmiBroker phiên bản
BETA 4.67.x / 4.68.x
giới thiệu một
giao diện lập trình Backtester danh mục đầu tư hoàn toàn mới
, cho phép người dùng kiểm soát toàn diện quá trình kiểm tra chiến lược ở
giai đoạn thứ hai (Portfolio-level Backtest)
. Với hệ thống mở rộng này, người dùng không chỉ thực hiện kiểm tra thông thường, mà còn có thể thêm vào
các chỉ số tùy chỉnh
, truy cập dữ liệu vốn, danh sách giao dịch, và thực hiện các thao tác phức tạp như điều chỉnh kích thước vị thế theo vốn danh mục.

🔧 Những khả năng chính được hỗ trợ:

  • Thêm
    chỉ số do người dùng định nghĩa (Custom Metrics)
    : xuất hiện trong kết quả kiểm tra, tối ưu hóa, báo cáo thống kê và bảng giao dịch.

  • Truy cập
    giá trị vốn theo thời gian thực
    , cho phép điều chỉnh kích thước vị thế theo vốn.

  • Đọc/ghi vào
    tiền mặt danh mục
    .

  • Truy cập danh sách
    giao dịch đang mở / đã đóng
    , bao gồm các thuộc tính như MAE, MFE, số nến đã qua, lợi nhuận, v.v.

  • 3 cấp độ can thiệp:

  • Cấp cao
    :

    Backtest()

    - lý tưởng để thêm chỉ số tuỳ chỉnh.

  • Cấp trung
    :

    PreProcess()

    ,

    ProcessTradeSignal()

    ,

    PostProcess()

    - tốt cho xử lý tín hiệu.

  • Cấp thấp
    : kiểm soát toàn bộ quá trình với các hàm

    EnterTrade()

    ,

    ExitTrade()

    ,

    HandleStops()

    …

🧮 Ví dụ 1: Thêm Expectancy ($) vào báo cáo kiểm tra

Expectancy

là chỉ số thể hiện lợi nhuận kỳ vọng trung bình trên mỗi giao dịch. Công thức đơn giản:

ini

Copy code

Expectancy = (% Win * Lợi nhuận trung bình) + (% Loss * Lỗ trung bình)


🔤 Mã AFL:

afl

Copy code

SetCustomBacktestProc("");

if (Status(“action”) == actionPortfolio)

{

bo = GetBacktesterObject();

bo.Backtest();

st = bo.GetPerformanceStats(0);

expectancy = st.GetValue(“WinnersAvgProfit”) * st.GetValue(“WinnersPercent”) / 100

+ st.GetValue(“LosersAvgLoss”) * st.GetValue(“LosersPercent”) / 100;

bo.AddCustomMetric(“Expectancy ($)”, expectancy);

}

// Hệ thống giao dịch

fast = Optimize(“fast”, 12, 5, 20, 1);

slow = Optimize(“slow”, 26, 10, 25, 1);

Buy = Cross(MACD(fast, slow), Signal(fast, slow));

Sell = Cross(Signal(fast, slow), MACD(fast, slow));

✅ Kết quả:

  • Chỉ số “Expectancy ($)” xuất hiện trong tab báo cáo và danh sách kết quả tối ưu.

  • Có thể sắp xếp theo chỉ số này, và hiển thị đồ thị 3D trong cửa sổ tối ưu hóa.

🧮 Ví dụ 2: Expectancy tính theo lợi nhuận % trên mỗi $100 đầu tư

Phương pháp trước có thể không chính xác nếu sử dụng
kích thước vị thế biến thiên
. Giải pháp là tính kỳ vọng lợi nhuận
tính trên mỗi $100 đầu tư
.

🔤 Mã AFL:

afl

Copy code

SetCustomBacktestProc("");

if (Status(“action”) == actionPortfolio)

{

bo = GetBacktesterObject();

bo.Backtest();

SumProfitPer100Inv = 0;

NumTrades = 0;

for (trade = bo.GetFirstTrade(); trade; trade = bo.GetNextTrade())

{

SumProfitPer100Inv += trade.GetPercentProfit();

NumTrades++;

}

for (trade = bo.GetFirstOpenPos(); trade; trade = bo.GetNextOpenPos())

{

SumProfitPer100Inv += trade.GetPercentProfit();

NumTrades++;

}

expectancy2 = SumProfitPer100Inv / NumTrades;

bo.AddCustomMetric(“Expectancy (per $100 inv.)”, expectancy2);

}

// Hệ thống giao dịch

fast = Optimize(“fast”, 12, 5, 20, 1);

slow = Optimize(“slow”, 26, 10, 25, 1);

Buy = Cross(MACD(fast, slow), Signal(fast, slow));

Sell = Cross(Signal(fast, slow), MACD(fast, slow));

✅ Kết quả:

  • Expectancy thực tế hơn trong các hệ thống có tái đầu tư hoặc quản lý vốn linh hoạt.

🧮 Ví dụ 3: Expectancy theo rủi ro (R-multiple)

Theo
Van Tharp
, expectancy nên tính theo lợi nhuận kỳ vọng trên mỗi
đơn vị rủi ro (1R)
, trong đó:

ini

Copy code

1R = số tiền tối đa bạn có thể mất trong giao dịch đó.

Ví dụ: nếu bạn đặt dừng lỗ tại 10%, thì 1R = 10% * vốn đầu tư vào giao dịch.

🔤 Mã AFL:

afl

Copy code

SetCustomBacktestProc("");

MaxLossPercentStop = 10;

if (Status(“action”) == actionPortfolio)

{

bo = GetBacktesterObject();

bo.Backtest(1);  // 1 = không tạo danh sách giao dịch mặc định

SumProfitPerRisk = 0;

NumTrades = 0;

for (trade = bo.GetFirstTrade(); trade; trade = bo.GetNextTrade())

{

Risk = (MaxLossPercentStop / 100) * trade.GetEntryValue();

RMultiple = trade.GetProfit() / Risk;

trade.AddCustomMetric(“Rủi ro ban đầu $”, Risk);

trade.AddCustomMetric(“R-Multiple”, RMultiple);

SumProfitPerRisk += RMultiple;

NumTrades++;

}

expectancy3 = SumProfitPerRisk / NumTrades;

bo.AddCustomMetric(“Expectancy (theo rủi ro)”, expectancy3);

bo.ListTrades();

}

// Hệ thống giao dịch

ApplyStop(stopTypeLoss, stopModePercent, MaxLossPercentStop);

fast = Optimize(“fast”, 12, 5, 20, 1);

slow = Optimize(“slow”, 26, 10, 25, 1);

Buy = Cross(MACD(fast, slow), Signal(fast, slow));

Sell = Cross(Signal(fast, slow), MACD(fast, slow));

✅ Kết quả:

  • Thêm 2 chỉ số
    theo từng giao dịch
    : Rủi ro ban đầu, R-Multiple.

  • Expectancy cuối cùng phản ánh chính xác hơn hiệu quả của chiến lược theo quan điểm quản lý rủi ro.

📌 Tổng kết

Loại ExpectancyĐơn vị tínhPhù hợp với
Expectancy ($)USD/giao dịchKích thước vị thế cố định
Expectancy trên $100 đầu tư%Vốn linh hoạt, gộp lãi
Expectancy theo R-multipleR/giao dịchQuản lý rủi ro chặt chẽ (Van Tharp)

👉 Giao diện kiểm tra danh mục mới trong AmiBroker là một bước tiến lớn, mở rộng khả năng kiểm tra, phân tích, và tùy chỉnh. Việc thêm các chỉ số định nghĩa bởi người dùng không chỉ hỗ trợ đo lường chiến lược chính xác hơn mà còn giúp bạn tối ưu hóa tốt hơn theo các tiêu chí riêng biệt.

Thông tin trong bài chỉ mang tính tham khảo, không phải khuyến nghị mua bán. Giao dịch phái sinh có rủi ro cao do sử dụng đòn bẩy; nhà đầu tư tự chịu trách nhiệm với quyết định của mình.

Nguyễn Hà Anh

Biên tập viên mảng thị trường phái sinh, theo dõi VN30F1M và dòng tiền khối ngoại hằng ngày.

AMI X BY DNSE
100 CHIẾN THUẬTmiễn phí khi tải Ami X

Tự động đặt lệnh theo tín hiệu AmiBroker thẳng vào tài khoản chứng khoán.

* Phần mềm chạy trên máy tính Windows. Giao dịch tự động vẫn có rủi ro mất vốn.