Bài viết này sẽ giúp bạn tìm hiểu ý nghĩa của từng dòng lệnh ngôn ngữ AFL của phần mềm Amibroker. Hy vọng sẽ giúp bạn đủ tự tin để xây dựng một chiến thuật cho riêng mình.
Đầu tiên, hãy bắt đầu với 1 file chiến thuật với MACD tại đây.
_SECTION_BEGIN( "MACD AFL" );
SetChartOptions( 0, chartShowArrows | chartShowDates );
Plot( C, "Close", ParamColor( "Color", colorBlack ), styleNoTitle | ParamStyle( "Style" ) | GetPriceStyle() );
SetBarsRequired( 100000, 0 );
per1 = Param( "MACD Fast", 20, 1, 100, 1 );
per2 = Param( "MACD Slow", 50, 1, 100, 1 );
per3 = Param( "Signal Line", 40, 1, 100, 1 );
per4 = 20;
per5 = 1;
bbtop = BBandTop( C, per4, per5 );
bbot = BBandBot( C, per4, per5 );
SetPositionSize( 1, spsShares );
MACD1 = MACD( per1, per2 );
sig = Signal( per1, per2, per3 );
Buy = MACD1 > 0 AND MACD1 > sig AND L > bbtop AND MACD1 > 25 ;
Sell = MACD1 < 0 OR MACD1 < sig;
Buy = ExRem( Buy, Sell );
Sell = ExRem( Sell, Buy );
Short = MACD1 < 0 AND MACD1 < sig AND H < bbot AND MACD1 < -25 ;
Cover = MACD1 > 0 OR MACD1 > sig;
Short = ExRem( Short, Cover );
Cover = ExRem( Cover, Short );
Title = NumToStr( DateTime(), formatDateTime ) + " O " + O + " H " + H + " L " + L + " C " + C
;
PlotShapes( IIf( Buy, shapeSquare, shapeNone ), colorGreen, 0, L, Offset = -40 );
PlotShapes( IIf( Buy, shapeSquare, shapeNone ), colorLime, 0, L, Offset = -50 );
PlotShapes( IIf( Buy, shapeUpArrow, shapeNone ), colorWhite, 0, L, Offset = -45 );
PlotShapes( IIf( Sell, shapeDownArrow, shapeNone ), colorRed, 0, H, Offset = -45 );
PlotShapes( IIf( Short, shapeSquare, shapeNone ), colorRed, 0, H, Offset = 40 );
PlotShapes( IIf( Short, shapeSquare, shapeNone ), colorOrange, 0, H, Offset = 50 );
PlotShapes( IIf( Short, shapeDownArrow, shapeNone ), colorWhite, 0, H, Offset = -45 );
PlotShapes( IIf( Cover, shapeUpArrow, shapeNone ), colorBlue, 0, L, Offset = -45 );
_SECTION_END();
Chiến thuật trong file Amibroker trên dựa trên chỉ báo MACD (Moving Average Convergence Divergence – Chỉ báo Hội tụ và Phân kỳ của Đường Trung bình Động). Dưới đây là tổng quan và giải thích về các thành phần và chiến thuật chính của chiến lược này:
- Tùy chọn Biểu đồ và Vẽ biểu đồ: Chiến lược bắt đầu bằng việc thiết lập tùy chọn biểu đồ và vẽ giá đóng cửa của cổ phiếu hoặc chứng khoán. Nó sử dụng màu đen cho biểu đồ giá đóng cửa và thiết lập biểu đồ để hiển thị mũi tên và ngày.
- Thiết lập Tham số: Chiến lược định nghĩa các tham số cho việc tính toán MACD:
per1
: Chu kỳ Nhanh của MACD (mặc định 20, phạm vi 1-100)per2
: Chu kỳ Chậm của MACD (mặc định 50, phạm vi 1-100)per3
: Chu kỳ của Đường tín hiệu (mặc định 40, phạm vi 1-100)
- Tính toán Bollinger Bands: Mã cũng bao gồm các tham số cho Bollinger Bands (
bbtop
vàbbot
), được sử dụng để xác định ranh giới trên và dưới của biến động giá. - Kích thước Vị thế: Chiến lược thiết lập kích thước vị thế là một số cổ phiếu cố định.
- Tính toán MACD: Các giá trị MACD được tính toán sử dụng các chu kỳ đã định nghĩa.
- Tín hiệu Giao dịch: Chiến lược có khả năng bao gồm logic để tạo ra tín hiệu mua và bán dựa trên MACD và có thể là Bollinger Bands. Tuy nhiên, điều kiện cụ thể cho những tín hiệu này không hiển thị trong phần mã được xem trước.
Chiến lược giao dịch này dựa trên phân tích kỹ thuật thông thường, tập trung vào các chỉ báo động lượng như MACD và chỉ báo biến động như Bollinger Bands. Hiệu quả của chiến lược này phụ thuộc vào điều kiện thị trường và mức độ phù hợp của các chỉ báo này với biến động giá của tài sản.
Dưới đây là giải thích từng dòng lệnh, giúp bạn tìm hiểu về ngôn ngữ AFL một cách dễ dàng hơn.
_SECTION_BEGIN( "MACD AFL" );
: Bắt đầu một phần mới trong mã AFL (Amibroker Formula Language) và đặt tên cho nó là “MACD AFL”.SetChartOptions( 0, chartShowArrows | chartShowDates );
: Thiết lập các tùy chọn cho biểu đồ. Ở đây,0
có thể là một tham số chỉ định loại biểu đồ, vàchartShowArrows | chartShowDates
kích hoạt hiển thị mũi tên và ngày trên biểu đồ.Plot( C, "Close", ParamColor( "Color", colorBlack ), styleNoTitle | ParamStyle( "Style" ) | GetPriceStyle() );
: Vẽ biểu đồ giá đóng cửa (C
đại diện cho giá đóng cửa) với màu sắc và phong cách được xác định bởi người dùng hoặc mặc định.SetBarsRequired( 100000, 0 );
: Xác định số lượng bars (biểu đồ cột) tối thiểu cần thiết cho việc tính toán. Trong trường hợp này, nó yêu cầu ít nhất 100,000 bars.per1 = Param( "MACD Fast", 20, 1, 100, 1 );
: Thiết lập tham số cho chu kỳ nhanh của MACD, với giá trị mặc định là 20, phạm vi từ 1 đến 100, và bước nhảy là 1.per2 = Param( "MACD Slow", 50, 1, 100, 1 );
: Tương tự, thiết lập chu kỳ chậm của MACD.per3 = Param( "Signal Line", 40, 1, 100, 1 );
: Thiết lập chu kỳ cho đường tín hiệu của MACD.per4 = 20;
: Đặt giá trị cho một tham số, có thể sử dụng trong việc tính toán sau này (chưa rõ mục đích cụ thể ở đây).per5 = 1;
: Đặt giá trị cho một tham số khác.bbtop = BBandTop( C, per4, per5 );
: Tính giá trị trên cùng của Bollinger Band dựa trên giá đóng cửa và các tham sốper4
vàper5
.bbot = BBandBot( C, per4, per5 );
: Tính giá trị dưới cùng của Bollinger Band.SetPositionSize( 1, spsShares );
: Thiết lập kích thước vị thế cho giao dịch. Ở đây,1
có thể đại diện cho số lượng cổ phiếu cố định được mua hoặc bán trong mỗi giao dịch.MACD1 = MACD( per1, per2 );
: Tính toán giá trị MACD sử dụng hai chu kỳ đã được thiết lập trước đó (per1
vàper2
).sig = Signal( per1, per2, per3 );
: Tính toán đường tín hiệu của MACD sử dụng các chu kỳ đã định nghĩa.Buy = MACD1 > 0 AND MACD1 > sig AND L > bbtop AND MACD1 > 25 ;
: Xác định điều kiện mua. Một tín hiệu mua được tạo ra khi giá trị MACD lớn hơn 0, lớn hơn đường tín hiệu, giá thấp nhất trong ngày (L
) lớn hơn giá trị trên cùng của Bollinger Band và giá trị MACD lớn hơn 25.Sell = MACD1 < 0 OR MACD1 < sig;
: Xác định điều kiện bán. Một tín hiệu bán được tạo ra khi giá trị MACD nhỏ hơn 0 hoặc nhỏ hơn đường tín hiệu.Buy = ExRem( Buy, Sell );
: Loại bỏ các tín hiệu mua lặp lại cho đến khi có một tín hiệu bán. Điều này giúp tránh các tín hiệu mua liên tiếp mà không có tín hiệu bán giữa chúng.Sell = ExRem( Sell, Buy );
: Tương tự như trên, loại bỏ các tín hiệu bán lặp lại cho đến khi có một tín hiệu mua.Short = MACD1 < 0 AND MACD1 < sig AND H < bbot AND MACD1 < -25 ;
: Đây là điều kiện để vào vị thế bán khống (short selling). Một tín hiệu bán khống được tạo ra khi giá trị MACD nhỏ hơn 0, nhỏ hơn đường tín hiệu, giá cao nhất trong ngày (H
) nhỏ hơn giá trị dưới cùng của Bollinger Band và giá trị MACD nhỏ hơn -25.Cover = MACD1 > 0 OR MACD1 > sig;
: Điều kiện để đóng vị thế bán khống. Một tín hiệu đóng vị thế bán khống được tạo ra khi giá trị MACD lớn hơn 0 hoặc lớn hơn đường tín hiệu.Short = ExRem( Short, Cover );
: Loại bỏ các tín hiệu bán khống lặp lại cho đến khi có một tín hiệu đóng vị thế bán khống.Cover = ExRem( Cover, Short );
: Tương tự như trên, loại bỏ các tín hiệu đóng vị thế bán khống lặp lại cho đến khi có một tín hiệu bán khống.Title = NumToStr( DateTime(), formatDateTime ) + " O " + O + " H " + H + " L " + L + " C " + C
: Thiết lập tiêu đề cho biểu đồ, bao gồm ngày giờ hiện tại và giá trị mở cửa (O
), cao nhất (H
), thấp nhất (L
), và đóng cửa (C
) của ngày.PlotShapes( IIf( Buy, shapeSquare, shapeNone ), colorGreen, 0, L, Offset = -40 );
: Vẽ hình vuông màu xanh dưới giá thấp nhất (L
) nếu có tín hiệu mua. Điều này giúp người dùng dễ dàng nhận biết các tín hiệu mua trên biểu đồ.PlotShapes( IIf( Buy, shapeSquare, shapeNone ), colorLime, 0, L, Offset = -50 );
: Vẽ hình vuông màu lục ở mức giá thấp nhất (L
) với độ lệch -50 nếu có tín hiệu mua. Điều này giúp tăng cường hiển thị tín hiệu mua trên biểu đồ.PlotShapes( IIf( Buy, shapeUpArrow, shapeNone ), colorWhite, 0, L, Offset = -45 );
: Vẽ mũi tên hướng lên màu trắng ở mức giá thấp nhất (L
) với độ lệch -45 để chỉ ra tín hiệu mua.PlotShapes( IIf( Sell, shapeDownArrow, shapeNone ), colorRed, 0, H, Offset = -45 );
: Vẽ mũi tên hướng xuống màu đỏ ở mức giá cao nhất (H
) với độ lệch -45 để chỉ ra tín hiệu bán.PlotShapes( IIf( Short, shapeSquare, shapeNone ), colorRed, 0, H, Offset = 40 );
: Vẽ hình vuông màu đỏ ở mức giá cao nhất (H
) với độ lệch 40 nếu có tín hiệu bán khống.PlotShapes( IIf( Short, shapeSquare, shapeNone ), colorOrange, 0, H, Offset = 50 );
: Tương tự như trên, vẽ hình vuông màu cam để chỉ ra tín hiệu bán khống.PlotShapes( IIf( Short, shapeDownArrow, shapeNone ), colorWhite, 0, H, Offset = -45 );
: Vẽ mũi tên hướng xuống màu trắng ở mức giá cao nhất (H
) với độ lệch -45 để chỉ ra tín hiệu bán khống.PlotShapes( IIf( Cover, shapeUpArrow, shapeNone ), colorBlue, 0, L, Offset = -45 );
: Vẽ mũi tên hướng lên màu xanh ở mức giá thấp nhất (L
) với độ lệch -45 để chỉ ra tín hiệu đóng vị thế bán khống._SECTION_END();
: Kết thúc phần mã AFL này.
Quay lại với việc ứng dụng code này vào việc giao dịch thực tế chứng khoán phái sinh Việt Nam với phần mềm AmiDNSE và tài khoản chứng khoán tại DNSE. Bạn sẽ cần bổ sung thêm các câu lệnh sau:
if (Buy[BarCount-1]==true) {ih = InternetOpenURL( “http://127.0.0.1:5000/place_order?symbol=VN30F2311&action=NB&quantity=10&orderType=LO&price=”+C ); InternetClose(ih);}
if (Sell[BarCount-1]==true) {ih = InternetOpenURL( “http://127.0.0.1:5000/place_order?symbol=VN30F2311&action=NS&quantity=10&orderType=MTL&price=”+C ); InternetClose(ih);}
if (Short[BarCount-1]==true) {ih = InternetOpenURL( “http://127.0.0.1:5000/place_order?symbol=VN30F2311&action=NS&quantity=10&orderType=LO&price=”+C ); InternetClose(ih);}
if (Cover[BarCount-1]==true) {ih = InternetOpenURL( “http://127.0.0.1:5000/place_order?symbol=VN30F2311&action=NB&quantity=10&orderType=MTL&price=”+C ); InternetClose(ih);}
Lưu ý: Giá mở vị thế BUY/SHORT sẽ là giá đóng cửa của nến xảy ra tín hiệu) và đặt loại lệnh LO. Còn lệnh đóng vị thế SELL / COVER sẽ dùng loại lệnh MTL để đóng vị thế cho nhanh (với lệnh MTL, bạn có thể không cần truyền tham số price). Bạn có thể điều chỉnh các thông số này bằng cách sửa link trên.
Hãy chia sẻ kết quả của bạn trên group Zalo này nhé.