Chuyển đến nội dung chính

Tổng hợp một số kiến thức lập trình về Amibroker

Giới thiệu về Amibroker

Amibroker theo developer Tomasz Janeczko được xây dựng dựa trên ngôn ngữ C. Vì vậy bộ code Amibroker Formula Language sử dụng có syntax khá tương đồng với C, ví dụ như câu lệnh #include để import hay cách gói các object, hàm trong các block {} và kết thúc câu lệnh bằng dấu “;”.
AFL trong Amibroker là ngôn ngữ xử lý mảng (an array processing language). Nó hoạt động dựa trên các mảng (các dòng/vector) số liệu, khá giống với cách hoạt động của spreadsheet trên excel.

Cách Amibroker lưu trữ dữ liệu


Các hàm thường dùng trong AmiBroker

Các ký hiệu thường dùng trong viết code:

C: close giá đóng cửa/ giá hiện tại trong phiên

O: Open giá mở cửa

H: giá cao trong phiên

L: giá thấp trong phiên

V: volume, khối lượng

ma(c,30) bình quân giá đóng cửa 30  phiên giao dịch

ma(v,30) bình quân khối lượng giao dịch 30 phiên

ref(c,-1)  giá đóng cửa của ngày hôm qua hoặc 1 phiên trước đó

ref(c,-2) giá đóng cửa của ngày hôm kia hoặc cách đó 2 phiên

ref(v,-1)  khối lượng của ngày hôm qua/ khối lượng của 1 phiên trước đó

HHV(C,15)  giá trị cao nhất của giá đóng cửa 15 phiên gần nhất

hhv(h,30) giá cao nhất của giá cao 30 phiên gần nhất

LLV(L,30) giá thấp nhất của giá thấp trong vòng 30 phiên

LLV(C,30) giá thấp nhất của giá đóng cửa trong vòng 30 phiên

C*V: Giá nhân với khối lượng = giá trị giao dịch

C>=1.02*Ref(C,-1)    => giá  lớn hơn 2% so với giá ngày hôm qua

V >= 1.3*MA(V,15)   => khối lượng lớn hơn hoặc bằng 130% so với bình quân khối lượng 15 phiên

RSI(14)  <=35               => tìm ra các mã có RSI <35
ROC:  percentage rate of change

ValueWhen(EXPRESSION, ARRAY, n = 1) : get value of the array when condition met: lấy giá trị khi dữ liệu thỏa điều kiện Expression


CROSS: trả về 1 khi Array 1 cắt Array 2 theo chiều hướng đi lên 

EXREM: trả về 1 khi lần đầu tiên xuất hiện tín hiệu "true" trong Array 1, sau đó trả về 0 cho đến khi Array 2 là true ngay cả khi có tín hiệu "true" trong Array 1. Hàm này hữu ích khi bạn muốn loại bỏ nhiều điểm BUY hoặc SELL xuất hiện liên tiếp nhau.

Các hàm trong AFL

Plot( array, name, color/barcolor, style = styleLine, minvalue = {empty}, maxvalue = {empty}, XShift = 0, Zorder = 0, width = 1 )

  • array – mảng dữ liệu được vẽ, vd: RSI(16), Close, MA(Close,20),…
  • name - đại diện cho tên của đồ thị
  • color - dùng để thể hiện màu sắc cho đồ thị (nếu tham số thứ 3 là số) hoặc động (khi tham số thứ 3 là 1 array).
  • style: định nghĩa dạng đồ thị được vẽ

styleLine = 1 - normal (line) chart (default): đường kẻ liền
styleHistogram = 2 - histogram chart : Biểu đồ tần suất
styleThick =4 - fat (thick): đường kẻ đậm
styleDots = 8 - include dots: đường kẻ chấm
styleNoLine = 16 - no line
styleDashed = 32 - dashed line style:  đường kẻ gạch đứt
styleCandle = 64 - candlestick chart: nến
styleBar = 128 - traditional bar chart…
Tham khảo: https://www.amibroker.com/guide/afl/plot.html
Min value và max value - (chỉ được sử dụng bởi đồ thị styleOwnScale) xác định giá trị tối thiểu và tối đa của đồ thị (ranh giới dưới và trên cho trục Y).
XShift - cho phép chuyển biểu đồ qua thanh cuối cùng một cách trực quan.
ZOrder - xác định vị trí trục Z của ô đã cho. Giá trị mặc định là 0. Zorder = 0 cũng có nghĩa là đặt nơi "lưới".

shift object sang phải hoặc sang trái = số bar đã input
width - xác định pixel hoặc chiều rộng phần trăm của ô đã cho. Mặc định là 1 pixel
tham số Zshift có tác dụng shift object sang phải hoặc sang trái = số bar đã input, ở trường hợp này là 10.
Ví dụ:
// Example 20-bar Moving average shifted 10 bars into the future past the last bar:
Plot(Close,"Close",colorBlack,styleCandle);
Plot(MA(Close,20), "Shifted MA", colorRed, styleLine, Null, Null, -10 );
// Note that shift occurs during plotting AND does NOT affect source array
Một điểm khá hay cần lưu ý đó là khả năng thay đổi màu sắc (Dynamic Color) khi các object (indicator, price,…) thỏa mãn một số điều kiện cho trước (sử dụng hàm Iff )
dynamic_color = IIf(MACD() > 0 , colorBlue, colorRed);
Plot(MACD(), "My MACD", dynamic_color, styleHistogram | styleThick)

Param
- add user user-definable numeric parameter
SYNTAX     

Param( ''name'', defaultval, min, max, step, sincr = 0 )
Return: number
Thêm một tham số mới do người dùng xác định, sẽ có thể truy cập được qua hộp thoại Tham số: nhấp chuột phải vào ngăn biểu đồ và chọn "Tham số" hoặc nhấn Ctrl + R cho phép thay đổi thông số biểu đồ - các thay đổi được phản ánh ngay lập tức.

  • "name"
  • defaultval: giá trị mặc định cho biến
  • min, max – giá trị lớn nhất và nhỏ nhất
  • step - defines minimum increase of the parameter via slider in the Parameters dialog
  • sincr - automatic section increment value (used by drag-drop interface to increase default values for parameters) 

Buy và Sell

 Đây là 2 danh sách quan trọng trong Amibroker, chứa điểm mua và điểm bán

VD:

Buy= Cross(EMA(Close,13), EMA(Close,26) ); 
Sell= Cross(EMA(Close,26), EMA(Close,13)  ); 

Buy sẽ chứa 3 loại giá trị: 

  1. NULL (không xác định) 
  2. 1: Khi EMA 13 cắt đi lên EMA 26
  3. 0: Khi EMA 13 không cắt EMA 26

 Tương tự với Sell:

  1. NULL (không xác định) 
  2. 1: Khi EMA 26 cắt đi lên EMA 13
  3. 0: Khi EMA 26 không cắt EMA 13

Hàm vẽ biểu tượng trong Amibroker: PlotShapes

Cú pháp:

PlotShapes( shape, color, layer = 0, yposition = graph0, offset = -12, XShift = 0 );


shape: Hình dạng
VD: shapeUpArrow, shapeDownArrow, shapeHollowUpArrow, shapeHollowDownArrow, shapeSmallUpTriangle, shapeSmallDownTriangle, shapeHollowSmallUpTriangle, shapeHollowSmallDownTriangle, shapeUpTriangle, shapeDownTriangle, shapeHollowUpTriangle, shapeHollowDownTriangle, shapeSmallSquare, shapeHollowSmallSquare, shapeSquare, shapeHollowSquare, shapeSmallCircle, shapeHollowSmallCircle, shapeCircle, shapeHollowCircle, shapeStar, shapeHollowStar, shapeDigit0, shapeDigit1, shapeDigit2, shapeDigit3, shapeDigit4, shapeDigit5, shapeDigit6, shapeDigit7, shapeDigit8, shapeDigit9
color: Màu sắc, vd ColorGreen, ColorRed

layer: defines layer number on which shapes are plotted
yposition: defines Y-position where shapes are plotted (by default they are plotted 'around' graph0 (first indicator) line)
offset - (or distance) parameter (by default -12 ), Offset is expressed in SCREEN pixels. Negative offsets shift symbols down, positive offsets shift symbol up. To place the shape exactly at ypostion, specify 0 as offset
(new in 5.66) XShift - allows to visually shift the the shapes by the specified number of bars (even past the last bar).  

Đoạn code dưới đây cho điểm mua và bán sử dụng EMA. Ở mỗi điểm mua hoặc bán, sẽ có 1 mũi tên minh họa kèm theo
Plot(Close,"Close", colorAqua,styleCandle); 
Plot(EMA(Close,13), "EMA13", colorBlue, styleLine, Null, Null);
Plot(EMA(Close,26), "EMA26", colorOrange, styleLine, Null, Null);
Plot(EMA(Close,52), "EMA52", colorRed, styleLine, Null, Null);

Buy= Cross(EMA(Close,13), EMA(Close,26) ); 
Sell= Cross(EMA(Close,26), EMA(Close,13)  );                     
PlotShapes(IIf(Buy, shapeUpArrow, shapeNone), colorGreen, 0,L, Offset=-45);                     
PlotShapes(IIf(Sell, shapeDownArrow, shapeNone), colorRed, 0,H, Offset=-45);


Nhatkyhoctap's blog


Nhận xét

  1. Debug in Amibroker https://tradingtuitions.com/how-to-debug-amibroker-afl-code/

    Trả lờiXóa
    Trả lời
    1. Ad có code chỉ hiện đồ thị nến của vnindex hay vn30 k ạ?

      Xóa
    2. Bạn đăng ký account ở FireAnt hoặc Fialda, để xem đồ thị nến của vnindex nha. Còn về vn30 thì mình ko biết nguồn lấy data.
      Bạn có thể tìm thêm code free ở đây: https://www.wisestocktrader.com/amibroker-afl-formulas-indicators

      Xóa
  2. Chào ad, mong ad tư vấn, mình muốn tạo một chỉ báo RSI nhưng muốn thay đổi nguồn cấp dữ liệu tính toàn đầu vào ko phải giá đóng cửa mà muốn thay vào đó là giá trị của một chỉ báo trước đó . VD là RSI (5) với dữ liệu đầu vào là giá trị của RSI (14) thì làm như nào vậy ad. Cảm ơn ad

    Trả lờiXóa
    Trả lời
    1. Mình không rành về code AFL, nên viết thế này, bạn xem thử xem có đúng ý bạn ko:
      Cú pháp: RSIa( array, periods = 14 )

      _SECTION_BEGIN("RSIa");

      RP = Param("RSI",7,2,20,1);
      UL= Param("Upper Limit",70,0,100,1);
      LL= Param("Lower Limit",30,0,100,1);
      PlotGrid(UL,colorBlue);
      PlotGrid(LL,colorBlue);
      RSI14 = RSI(14);
      R= RSIa(RSI14, 5);
      Plot(R, "MODIFIED RSI", colorLime, styleThick);

      Plot(RSI14, "MODIFIED RSI", colorBlue, styleThick);

      _SECTION_END();

      Xóa
    2. Cảm ơn ad ah, tuyệt vời. Mìn tự mày mò về Ambiroker đôi khi sửa lại các ý tưởng của bản thân , nhưng hay gặp nhiều lỗi. Cảm ơn ad nhiệt tình chia sẻ kiến thức và hỗ trợ giải đáp

      Xóa
    3. ad có code để Ambibroker tự động chạy và mua bán theo chiến thuật, hay chạy thử chiến thuật ( các thiết lập mình đặt ra và đưa ra tính khả thi của chiến thuật không vậy. Cảm ơn ad.

      Xóa
    4. Bạn vào trang http://kakata.vn/ rồi tìm các bài viết liên quan tới Amibroker nha. Trên đây họ đều đưa sẵn các code theo các chiến thuật rồi. Mình chỉ tìm hiểu thôi chứ ko viết nổi thuật toán đâu :D

      Xóa
    5. Cảm ơn ad nhiều ah. Mong chờ các bài viết chia sẻ của ad :)

      Xóa
  3. Tham khảo vẽ mũi tên: https://chibaodautu.com/plot-ve-do-thi-trong-amibroker/

    Trả lờiXóa
  4. Bạn ơi bạn có bộ lọc Ami để lọc ra danh sách các cổ phiếu đang phân kỳ RSI đỉnh và đáy không ? Có thể giúp mình với

    Trả lờiXóa

Đăng nhận xét

Bài đăng phổ biến từ blog này

[ASP.NET MVC] Authentication và Authorize

Một trong những vấn đề bảo mật cơ bản nhất là đảm bảo những người dùng hợp lệ truy cập vào hệ thống. ASP.NET đưa ra 2 khái niệm: Authentication và Authorize Authentication xác nhận bạn là ai. Ví dụ: Bạn có thể đăng nhập vào hệ thống bằng username và password hoặc bằng ssh. Authorization xác nhận những gì bạn có thể làm. Ví dụ: Bạn được phép truy cập vào website, đăng thông tin lên diễn đàn nhưng bạn không được phép truy cập vào trang mod và admin.

ASP.NET MVC: Cơ bản về Validation

Validation (chứng thực) là một tính năng quan trọng trong ASP.NET MVC và được phát triển trong một thời gian dài. Validation vắng mặt trong phiên bản đầu tiên của asp.net mvc và thật khó để tích hợp 1 framework validation của một bên thứ 3 vì không có khả năng mở rộng. ASP.NET MVC2 đã hỗ trợ framework validation do Microsoft phát triển, tên là Data Annotations. Và trong phiên bản 3, framework validation đã hỗ trợ tốt hơn việc xác thực phía máy khách, và đây là một xu hướng của việc phát triển ứng dụng web ngày nay.