• 26ºC, Rain
  • Saturday, 14th February, 2026
  • Trang Chủ
  • Bộ Lọc
  • Nhận Định Thị Trường
  • Phân Tích Doanh Nghiệp
  • Amibroker
    • Code AFL
    • Tự học Amibroker
  • Kiến Thức Đầu Tư
    • Chỉ Báo Kỹ Thuật
    • Phân Tích Cơ Bản
    • Phương Pháp Sóng Elliot
    • Phương Pháp Wyckoff/VSA
    • Vĩ Mô Liên Thị Trường
  • Liên hệ
  • Giới Thiệu
Mới Nhất
  • Phân tích VN-Index ngày 11/08
  • Phân tích HAH
  • Bài 46: Trở thành nhà giao dịch chuyên nghiệp
  • Bài 45: GFX Functions – Bảng trạng thái giao dịch Amibroker
  1. Trang chủ
  2. Amibroker
  3. Tự học Amibroker
  4. Bài 31: BackTesting – Chiến Lược Giao Dịch Trong Phiên
Bài 31: BackTesting – Chiến Lược Giao Dịch Trong Phiên

Xem nhanh:

  • Chiến Lược Giao Dịch “Trong Phiên” (Interval Strategies) Trong Amibroker AFL: Xây Dựng và Backtest
  • 1. Giới Thiệu Chiến Lược EMA Crossover “Touch-Based”
  • 2. Lập Trình Chiến Lược Trong Amibroker AFL
  • 3. Backtesting “Interval Strategies” và Những Lưu Ý

Chiến Lược Giao Dịch “Trong Phiên” (Interval Strategies) Trong Amibroker AFL: Xây Dựng và Backtest

Chào các bạn! Trong các bài viết trước, chúng ta đã tìm hiểu về các chiến lược dựa trên giá đóng cửa của thanh nến. Tuy nhiên, thị trường không chỉ hoạt động vào cuối ngày. Hôm nay, chúng ta sẽ đi sâu vào chiến lược giao dịch trong phiên (Interval Strategies) – những chiến lược cho phép chúng ta vào lệnh trước khi nến đóng cửa, dựa trên sự vi phạm một mức giá cụ thể. Đây là loại chiến lược thường được gọi là chiến lược “chạm” (touch-based strategies).

1. Giới Thiệu Chiến Lược EMA Crossover “Touch-Based”

Chúng ta sẽ xây dựng một chiến lược crossover đơn giản nhưng áp dụng khái niệm “touch-based” để vào lệnh ngay lập tức khi một điều kiện được thỏa mãn.

Logic chiến lược:

  • Chỉ báo sử dụng: Bốn đường Trung bình động lũy thừa (EMA) với chu kỳ: EMA 8, EMA 13, EMA 21, EMA 55.
  • Tín hiệu MUA (Buy Signal):
    1. EMA 21 cắt lên EMA 55.
    2. Đồng thời, EMA 8 lớn hơn EMA 13.
    3. Lưu lại giá cao nhất (High) của thanh nến xuất hiện tín hiệu này.
    4. Điều kiện vào lệnh: Lệnh MUA sẽ được kích hoạt ngay khi giá chạm hoặc vượt qua mức giá cao nhất đã lưu trên bất kỳ thanh nến tiếp theo nào.
  • Tín hiệu BÁN (Sell Signal):
    1. EMA 21 cắt xuống EMA 55.
    2. Đồng thời, EMA 8 nhỏ hơn EMA 13.
    3. Lưu lại giá thấp nhất (Low) của thanh nến xuất hiện tín hiệu này.
    4. Điều kiện vào lệnh: Lệnh BÁN sẽ được kích hoạt ngay khi giá chạm hoặc thấp hơn mức giá thấp nhất đã lưu trên bất kỳ thanh nến tiếp theo nào.

2. Lập Trình Chiến Lược Trong Amibroker AFL

Để hiện thực hóa logic “touch-based”, chúng ta cần sử dụng các hàm như ValueWhen() và kết hợp điều kiện Cross() với giá High hoặc Low thay vì Close hoặc Open của nến tín hiệu.

// Phần 1: Cài đặt Biểu đồ và EMA
GraphSpace = Param("Graph Space", 0, -100, 100, 1);
Plot(C, "Candlestick", colorBlack, styleCandle);

// Định nghĩa các đường EMA
EMA8 = EMA(Close, 8);
EMA13 = EMA(Close, 13);
EMA21 = EMA(Close, 21);
EMA55 = EMA(Close, 55);

// Vẽ các đường EMA
Plot(EMA8, "EMA 8", colorGreen, styleLine);
Plot(EMA13, "EMA 13", colorBlue, styleLine);
Plot(EMA21, "EMA 21", colorRed, styleLine);
Plot(EMA55, "EMA 55", colorOrange, styleLine);

// Phần 2: Định nghĩa Điều kiện Tín hiệu Gốc (Chưa kích hoạt lệnh ngay)
// Sử dụng biến riêng để lưu điều kiện tín hiệu, không phải lệnh Buy/Sell cuối cùng
BuyConditionRaw = Cross(EMA21, EMA55) AND EMA8 > EMA13;
SellConditionRaw = Cross(EMA55, EMA21) AND EMA8 < EMA13;

// Sử dụng Flip để xác định khoảng thời gian tín hiệu Buy/Sell còn hiệu lực
// Flip(BuyConditionRaw, SellConditionRaw) trả về True từ BuyConditionRaw đầu tiên đến SellConditionRaw đầu tiên
BuyContinuous = Flip(BuyConditionRaw, SellConditionRaw);
SellContinuous = Flip(SellConditionRaw, BuyConditionRaw);

// Phần 3: Lưu Giá tham chiếu (Reference High/Low) khi tín hiệu xuất hiện
// ValueWhen(condition, source) trả về giá trị source khi condition đúng và giữ giá trị đó
// cho đến khi condition đúng lần nữa.
ReferenceHigh = ValueWhen(BuyConditionRaw, High);
ReferenceLow = ValueWhen(SellConditionRaw, Low);

// Phần 4: Định nghĩa Lệnh MUA/BÁN cuối cùng (kích hoạt khi chạm giá tham chiếu)
// Lệnh mua chỉ kích hoạt khi BuyContinuous đang True VÀ giá High hiện tại vượt ReferenceHigh
Buy = BuyContinuous AND Cross( High, ReferenceHigh); 
// Lệnh bán chỉ kích hoạt khi SellContinuous đang True VÀ giá Low hiện tại dưới ReferenceLow
Sell = SellContinuous AND Cross( ReferenceLow, Low);

// Phần 5: Định nghĩa Giá Mua/Bán (Entry/Exit Price)
// Giá vào lệnh chính là ReferenceHigh hoặc ReferenceLow đã được lưu
BuyPrice = ValueWhen(Buy, ReferenceHigh);  
SellPrice = ValueWhen(Sell, ReferenceLow);

// Phần 6: Lọc tín hiệu trùng lặp (đảm bảo chỉ có 1 lệnh Buy/Sell tại 1 thời điểm)
// ED (Entry Detected) là một hàm nội bộ hữu ích để lọc tín hiệu
Buy = ExRem(Buy, Sell);
Sell = ExRem(Sell, Buy);

// Phần 7: Vẽ các tín hiệu Mua/Bán trên biểu đồ
PlotShapes(IIf(Buy, shapeUpArrow, shapeNone), colorGreen, 0, Low, 0);
PlotShapes(IIf(Sell, shapeDownArrow, shapeNone), colorRed, 0, High, 0);
Ví dụ

Ví dụ

Kết quả

Kết quả

Giải thích các hàm quan trọng:

  • Flip(EntryCondition, ExitCondition): Hàm này trả về True từ khi EntryCondition đầu tiên xuất hiện cho đến khi ExitCondition đầu tiên xuất hiện. Nó cực kỳ hữu ích để xác định một “vùng” mà tín hiệu đang hoạt động liên tục, hoặc một trạng thái thị trường cụ thể.
  • ValueWhen(condition, source): Hàm này ghi lại giá trị source tại thời điểm condition là True và giữ nguyên giá trị đó cho đến khi condition là True một lần nữa. Đây là chìa khóa để lưu trữ ReferenceHigh và ReferenceLow một cách chính xác.
  • ExRem(Entry, Exit): Hàm này giúp loại bỏ các tín hiệu mua/bán không cần thiết. Nó đảm bảo rằng chỉ khi vị thế trước đó được thoát, thì tín hiệu mới có thể xuất hiện. Ví dụ: Bạn chỉ có thể có tín hiệu Buy nếu hiện tại không có vị thế mở hoặc vị thế Sell vừa đóng. Điều này rất quan trọng để tránh vào nhiều lệnh cho cùng một hướng.

3. Backtesting “Interval Strategies” và Những Lưu Ý

Khi backtest các chiến lược “touch-based” này, bạn cần thiết lập Backtesting Settings như sau:

  • Costs (Chi phí): Luôn bao gồm phí môi giới và slippage. Đối với các chiến lược nhạy cảm với giá như “touch-based”, slippage có thể ảnh hưởng lớn đến lợi nhuận. Hãy đặt một mức phí trượt giá thận trọng (ví dụ: 0.045% cho cổ phiếu, hoặc cao hơn cho các tài sản ít thanh khoản).
  • Delays (Độ trễ): Đảm bảo không có độ trễ Buy/Sell (Delay = 0). Vì đây là chiến lược “touch-based”, chúng ta muốn lệnh được kích hoạt ngay lập tức khi giá chạm mức tham chiếu.
  • Exit Strategies (Chiến lược thoát lệnh): Nếu bạn không định nghĩa các lệnh thoát trong code, hãy sử dụng các tùy chọn dừng lỗ/chốt lời mặc định của Amibroker (Profit Target, Stop Loss, Trailing Stop, N-Bar Stop). Tuy nhiên, việc định nghĩa chúng trong code AFL sẽ mang lại sự kiểm soát chính xác nhất.

Lưu ý quan trọng về Repainting: Một trong những lợi thế của chiến lược “touch-based” này là nó ít bị repainting hơn so với các chiến lược chỉ dựa vào giá đóng cửa. Bởi vì lệnh được kích hoạt khi giá chạm một mức cụ thể (High hoặc Low của nến trước), tín hiệu này không biến mất ngay cả khi nến đó đóng cửa dưới mức cao nhất của nó. Miễn là bạn lưu trữ giá cao/thấp tham chiếu từ thanh nến ĐÃ ĐÓNG CỬA, thì tín hiệu sẽ ổn định.

Phân tích kết quả: Trong ví dụ này, sau khi backtest 11 năm dữ liệu trên nhiều mã cổ phiếu, chiến lược EMA Crossover “Touch-Based” cho thấy không có lợi nhuận đáng kể. Điều này là bình thường và quan trọng là chúng ta học cách:

  • Đọc báo cáo backtest (Net Profit, Drawdown, CAGR, Win Rate,…).
  • Phân tích từng giao dịch cụ thể để hiểu tại sao chiến lược vào/ra lệnh như vậy.
  • Nhận ra rằng không phải mọi chiến lược đều sinh lời, và mục tiêu là phát triển kỹ năng để tự mình kiểm thử và cải tiến.

Việc hiểu và thực hành các chiến lược Interval sẽ mở rộng khả năng của bạn trong việc xây dựng các hệ thống giao dịch tự động phức tạp và hiệu quả hơn trong Amibroker AFL. Hãy tự mình thử nghiệm và điều chỉnh logic để tìm ra những gì phù hợp nhất!

  • trancotam
❮ Prev Next ❯
Chia sẻ: Facebook WhatsApp Twitter
Chia sẻ với ứng dụng khác

Tin Xem Nhiều

Bài 1: Chiến Lược Bảo Vệ Vốn Hiệu Quả Khi Đầu Tư (Phần 1)
Chỉ Báo Kỹ Thuật
Bài 1: Chiến Lược Bảo Vệ Vốn Hiệu Quả Khi Đầu Tư…
21 Tháng 5, 2025
Phân tích BFC
Phân Tích Doanh Nghiệp
Phân tích BFC
14 Tháng 7, 2025
Bài 46: Trở thành nhà giao dịch chuyên nghiệp
Tự học Amibroker
Bài 46: Trở thành nhà giao dịch chuyên nghiệp
22 Tháng 6, 2025
Phân tích HAH
Phân Tích Doanh Nghiệp
Phân tích HAH
15 Tháng 7, 2025
Phân tích ANV
Phân Tích Doanh Nghiệp
Phân tích ANV
14 Tháng 7, 2025
Donation
Phóng to ảnh

TADOSO là nền tảng chia sẻ kiến thức và kinh nghiệm đầu tư tài chính, đặc biệt trong lĩnh vực chứng khoán, nhằm kết nối và nâng cao tư duy cho nhà đầu tư cá nhân tại Việt Nam. Với triết lý "Tạo dựng – Đồng hành – Sở hữu", TADOSO hướng đến xây dựng cộng đồng học hỏi minh bạch, trung lập, không bị chi phối bởi tổ chức tài chính nào.

Newsletter

Hãy để lại mail để chúng tôi có thể phục vụ bạn tốt hơn

Donation - Buy me a coffee

Donation

Copyright © All rights reserved | This template is made with by Tran Co Tam

  • Terms of use
  • Privacy Policy
  • Contact
Zalo Messenger
×

Liên hệ