Từ Điển Hàm
AmiBroker AFL
Tra cứu nhanh cú pháp, công dụng và cách sử dụng các hàm lập trình AFL phổ biến nhất. Viết code hệ thống giao dịch chưa bao giờ dễ dàng đến thế.
HHV() Giá trị
Highest High Value. Trả về giá trị cao nhất của một mảng trong N phiên gần nhất. Thường dùng để xác định đỉnh cũ, kháng cự hoặc code chiến lược vượt đỉnh (Breakout).
// Tìm giá cao nhất trong 20 phiên qua (Đỉnh 20 phiên) Dinh20Ngay = HHV( H, 20 ); // Mua khi giá đóng cửa vượt đỉnh 20 ngày Buy = C > Ref( Dinh20Ngay, -1 );
LLV() Giá trị
Lowest Low Value. Ngược lại với HHV, hàm này trả về giá trị thấp nhất trong N phiên. Dùng để xác định vùng hỗ trợ, đáy cũ hoặc tính điểm Cắt lỗ (Stoploss) đặt dưới đáy.
// Xác định vùng đáy của 50 phiên gần nhất Day50Ngay = LLV( L, 50 ); // Đặt Stoploss thủ công dưới đáy 10 phiên DiemCatLo = LLV( L, 10 );
Cross() Logic
Hàm giao cắt. Trả về True (1) khi đường Array1 cắt lên trên đường Array2. Đây là hàm quan trọng nhất để viết điều kiện Mua/Bán cơ bản.
// Mua khi MA20 cắt lên MA50 (Giao cắt Vàng) Buy = Cross( MA(C, 20), MA(C, 50) ); // Bán khi Giá cắt xuống MA20 Sell = Cross( MA(C, 20), C );
BarsSince() Logic
Đếm số nến. Trả về số lượng nến đã trôi qua kể từ khi điều kiện (condition) xảy ra lần cuối cùng. Rất hữu ích để viết các mẫu hình giá tích lũy kéo dài.
// Đếm xem đã bao nhiêu ngày kể từ lần cuối nổ Vol SoNgay = BarsSince( V > MA(V, 20) * 2 ); // Mua nếu nổ Vol và nền tích lũy đã kéo dài > 20 ngày Buy = (V > MA(V,20)*2) AND Ref(SoNgay, -1) > 20;
MACD() & Signal() Chỉ báo
Cặp hàm kinh điển xác định động lượng dòng tiền. Thường được sử dụng kết hợp để tìm điểm giao cắt MACD cắt lên Signal hoặc phân kỳ MACD.
// Khai báo MACD và Signal tiêu chuẩn DuongMACD = MACD( 12, 26 ); DuongSignal = Signal( 12, 26, 9 ); // Mua khi MACD cắt lên Signal dưới đường 0 Buy = Cross( DuongMACD, DuongSignal ) AND DuongMACD < 0;
RSI() Chỉ báo
Chỉ số sức mạnh tương đối. Đo lường tốc độ và sự thay đổi của giá. Vùng > 70 thường được coi là Quá mua (Overbought), vùng < 30 là Quá bán (Oversold).
// Lấy giá trị RSI 14 ngày ChiBaoRSI = RSI( 14 ); // Bắt đáy khi RSI nhúng xuống dưới 30 rồi vòng lên Buy = Cross( ChiBaoRSI, 30 );
BBandTop() & BBandBot() Chỉ báo
Hàm Bollinger Bands. Trả về dải trên (Top) và dải dưới (Bot) của dải băng. Rất hiệu quả để đánh Breakout khi dải băng thắt chặt (Squeeze).
// Khai báo dải Bollinger Bands 20, độ lệch 2 DaiTren = BBandTop( C, 20, 2 ); DaiDuoi = BBandBot( C, 20, 2 ); // Mua khi Giá bứt phá khỏi dải trên Buy = Cross( C, DaiTren );
Plot() Đồ thị
Hàm cốt lõi để hiển thị mọi thứ lên màn hình AmiBroker. Dùng để vẽ nến, vẽ đường MA, biểu đồ cột Volume, v.v.
// Vẽ biểu đồ nến Nhật màu tiêu chuẩn Plot( C, "Gia", colorDefault, styleCandle ); // Vẽ thanh Volume dưới dạng cột (Histogram) MauVol = IIf(C > O, colorGreen, colorRed); Plot( V, "Khoi Luong", MauVol, styleHistogram | styleOwnScale );
PlotShapes() Đồ thị
Vẽ các biểu tượng (Mũi tên, Ngôi sao, Chấm tròn...) lên biểu đồ. Chuyên dùng để đánh dấu trực quan các điểm Buy/Sell cho khách hàng dễ nhìn.
// Điều kiện mua bán Buy = Cross(C, MA(C,20)); // Vẽ mũi tên Xanh chỉ lên ở dưới nến khi có lệnh Mua PlotShapes( Buy * shapeUpArrow, colorGreen, 0, L, -15 );
Param() Đồ thị
Hàm tương tác giao diện cực xịn. Nó tạo ra một thanh kéo (Slider) trong bảng Parameters để người dùng có thể tự điều chỉnh thông số mà không cần sửa code.
// Tạo thông số Chu kỳ MA cho phép khách hàng tự chỉnh từ 5 đến 200 ChuKy = Param( "Chu ky MA", 20, 5, 200, 1 ); // Áp dụng thông số đó vào đường MA Plot( MA(C, ChuKy), "Duong MA", colorRed, styleLine );
ApplyStop() Hệ thống
Hàm quản trị rủi ro tự động khi Backtest. Cho phép thiết lập cắt lỗ (Stoploss), chốt lời (Take Profit) hoặc Trailing Stop cực kỳ mạnh mẽ theo % hoặc điểm số.
// Cắt lỗ tối đa 7% (Tính từ giá mua) ApplyStop( stopTypeLoss, stopModePercent, 7, True ); // Chốt lời tự động khi đạt Target 15% ApplyStop( stopTypeProfit, stopModePercent, 15, True );
SetPositionSize() Hệ thống
Quy định số tiền đi lệnh (Position Sizing) cho hệ thống Backtest. Có thể cấu hình mua theo % tổng vốn (Percent of Equity) hoặc mua theo số tiền cố định.
// Mỗi mã chỉ được mua tối đa 20% tổng số vốn đang có SetPositionSize( 20, spsPercentOfEquity ); // Mua theo cục tiền cố định: 50.000.000 VND mỗi mã SetPositionSize( 50000000, spsValue );
Hold() Logic
Hàm duy trì/lưu giữ tín hiệu. Nó sẽ giữ lại trạng thái True (1) trong N phiên liên tiếp kể từ khi điều kiện ban đầu xảy ra. Rất hữu ích khi các điều kiện Mua không xuất hiện cùng lúc trong một ngày.
// Tín hiệu Vol đột biến được "nhớ" trong 3 phiên VolDotBien = Hold( V > MA(V, 20) * 2, 3 ); // Mua khi Giá vượt đỉnh VÀ Vol đã đột biến trong 3 ngày qua Buy = Cross( C, HHV(H, 20) ) AND VolDotBien;
Flip() Logic
Công tắc Bật/Tắt (Toggle Switch). Trả về trạng thái Bật (1) khi Array1 đúng, và giữ nguyên trạng thái đó cho đến khi Array2 đúng thì mới Tắt (0). Ứng dụng để tô nền vùng giá đang nắm giữ.
// Bật trạng thái "Đang giữ hàng" khi Mua, tắt khi Bán DangGiuHang = Flip( Buy, Sell ); // Tô nền Chart màu xanh chừng nào còn đang giữ cổ phiếu MauNen = IIf( DangGiuHang, colorLightBlue, colorWhite ); Plot( C, "Gia", colorBlack, styleCandle, Null, Null, 0, 0, 1 );
Sum() Logic
Đếm số lần xảy ra. Khi áp dụng hàm tính tổng (Sum) cho một mảng Logic (True/False), nó biến thành hàm đếm xem điều kiện đó đã xuất hiện bao nhiêu lần trong N phiên gần nhất.
// Đếm số phiên nến xanh (C > O) trong 10 phiên qua SoPhienTang = Sum( C > O, 10 ); // Mua nếu cổ phiếu đang cực khỏe: 10 phiên có ít nhất 7 phiên tăng Buy = SoPhienTang >= 7;
HighestSince() & LowestSince() Logic
Kết hợp giữa Logic và Giá trị. Tìm mức giá cao nhất/thấp nhất kể từ thời điểm một điều kiện tín hiệu xảy ra. Dùng để xác định các đỉnh/đáy cục bộ sau khi có điểm giao cắt.
// Xác định thời điểm MACD cắt lên Signal DK_Mua = Cross( MACD(), Signal() ); // Tìm mức giá cao nhất kể từ lúc MACD cắt lên DinhGanNhat = HighestSince( DK_Mua, H, 1 );
LastValue() Logic
Lấy giá trị hiện tại (của nến cuối cùng) và áp đặt nó ngược về toàn bộ quá khứ. Cực kỳ hiệu quả để làm tham chiếu logic tĩnh hoặc kẻ các đường ngang kháng cự/hỗ trợ tự động.
// Lấy giá đóng cửa của phiên hôm nay (phiên cuối) GiaHienTai = LastValue( C ); // Kẻ một đường thẳng tắp nằm ngang tại mức giá hiện tại Plot( GiaHienTai, "Gia Hien Tai", colorYellow, styleLine );
ExRemSpan() Logic
Xóa tín hiệu trong N phiên. Khác với ExRem (xóa đến khi có tín hiệu ngược lại), hàm này sẽ "tắt" hoàn toàn các tín hiệu xuất hiện trong N ngày kể từ tín hiệu đầu tiên. Cực kỳ hoàn hảo để giả lập luật chờ hàng về T+2.5 tại Việt Nam!
// Mua khi giá vượt MA20 DK_Mua = Cross( C, MA(C, 20) ); // Sau khi mua, cấm hệ thống báo mua lại trong vòng 3 phiên (Đợi hàng T+ về) Buy = ExRemSpan( DK_Mua, 3 );
AlertIf() Logic
Hàm kích hoạt cảnh báo. Khi điều kiện đúng, nó có thể phát ra âm thanh, gửi Email, cảnh báo Popup trên màn hình hoặc ghi vào cửa sổ Alert Output. Không thể thiếu cho các bộ lọc Real-time.
// Báo Mua khi Giá cắt lên MA20 Buy = Cross(C, MA(C,20)); // Kích hoạt Popup và phát âm thanh Cảnh báo AlertIf( Buy, "SOUND C:\\Windows\\Media\\Ring01.wav", "CO DIEM MUA!", 1 );
Peak() & Trough() Logic
Xác định Đỉnh (Peak) và Đáy (Trough) cục bộ dựa trên tỷ lệ % đảo chiều (Tương tự nguyên lý của chỉ báo ZigZag). Rất mạnh để vẽ Trendline tự động hoặc đếm sóng Elliott.
// Tìm mức giá Đỉnh gần nhất (đảo chiều ít nhất 5%) Dinh1 = Peak( H, 5, 1 ); // Tìm mức giá Đỉnh trước đó nữa (Đỉnh thứ 2) Dinh2 = Peak( H, 5, 2 ); // Điều kiện: Đỉnh sau cao hơn Đỉnh trước (Up-trend) UpTrend = Dinh1 > Dinh2;
Nz() Logic
Null to Zero (Biến rỗng thành 0). Hàm bảo vệ chống lỗi. Trong AmiBroker, các phiên đầu tiên thường không đủ dữ liệu để tính MA (trả về Null). Nếu đem Null đi cộng trừ sẽ gây lỗi toàn bộ Chart. Nz() sẽ biến Null thành số 0 hoặc số bạn chỉ định.
// Tránh lỗi khi tính toán với mảng có thể chứa Null GiaTriMA = MA( C, 200 ); // Nếu MA200 bị Null (do chưa đủ 200 phiên), gán nó bằng Giá đóng cửa GiaTriAnToan = Nz( GiaTriMA, C );
Inside() & Outside() Logic
Hàm nhận diện mẫu hình nến cơ bản. Inside() trả về True nếu nến hôm nay nằm hoàn toàn trong nến hôm qua (Inside Bar). Outside() trả về True nếu nến hôm nay bao trùm hoàn toàn nến hôm qua (Engulfing / Outside Bar).
// Mua khi xuất hiện nến Nhấn chìm tăng (Bullish Engulfing) // Điều kiện: Nến hqua giảm, nến nay tăng, và là nến Outside bao trùm Buy = Ref(C < O, -1) AND (C > O) AND Outside();
Optimize() Hệ thống
Hàm dò tìm thông số "Chén thánh". Khi Backtest, thay vì thử từng chu kỳ MA bằng tay, hàm này sẽ tự động chạy thử hàng ngàn kịch bản (ví dụ từ MA10 đến MA100) để tìm ra con số mang lại lợi nhuận cao nhất cho một cổ phiếu.
// Yêu cầu hệ thống tự dò tìm chu kỳ MA tốt nhất từ 10 đến 50, bước nhảy 1 ChuKyToiUu = Optimize( "Chu Ky MA", 20, 10, 50, 1 ); // Mua khi giá vượt đường MA với thông số vừa dò được Buy = Cross( C, MA(C, ChuKyToiUu) );
PositionScore Hệ thống
Biến xếp hạng ưu tiên (Cực kỳ quan trọng!). Giả sử hệ thống báo Mua cùng lúc 10 mã, nhưng bạn chỉ có tiền mua 2 mã. Hệ thống sẽ dựa vào PositionScore để chọn ra 2 mã khỏe nhất (ví dụ: RSI cao nhất, hoặc thanh khoản đột biến nhất) để mua.
// Báo mua khi vượt đỉnh 20 phiên Buy = Cross( C, HHV(Ref(H,-1), 20) ); // Ưu tiên mua những mã có tỷ lệ tăng giá (Rate of Change) mạnh nhất PositionScore = ROC( C, 14 );
TimeNum() Giá trị
Hàm lấy thời gian thực trong phiên (Intraday). Kết quả trả về định dạng HHMMSS. Đây là "vũ khí tối thượng" của dân đánh Phái Sinh (VN30F1M) để viết lệnh tự động đóng vị thế trước giờ ATC nhằm tránh rủi ro.
// Bắt buộc BÁN (đóng lệnh Long) nếu thời gian lớn hơn hoặc bằng 14h:30p:00s DongLenhATC = TimeNum() >= 143000; // Gộp vào điều kiện bán Sell = Cross( MA(C, 20), C ) OR DongLenhATC;
Say() Logic
Hàm "Đọc lệnh bằng giọng nói". Sử dụng bộ đọc văn bản (Text-to-Speech) của Windows để phát ra âm thanh. Bạn có thể cho máy tính tự hô to tên Cổ phiếu và lệnh Mua/Bán mà không cần phải dán mắt vào màn hình.
// Báo mua khi Vol đột biến Buy = V > MA(V, 20) * 2 AND C > O; // Nếu có tín hiệu Mua, máy tính sẽ hô to: "Co diem mua [Tên mã]" if( LastValue( Buy ) ) { Say( "Co diem mua " + Name() ); }
StDev() Chỉ báo
Độ lệch chuẩn (Standard Deviation). Hàm Toán học - Thống kê dùng để đo lường mức độ biến động (Volatility) của giá. Đây là thành phần lõi để tự code ra dải Bollinger Bands hoặc tính toán biên độ nén nền của một cổ phiếu.
// Tính độ biến động của 20 phiên gần nhất BienDong = StDev( C, 20 ); // Tìm cổ phiếu cạn kiệt thanh khoản và thắt chặt nền (Biến động < 2%) NenSietChat = BienDong < (MA(C, 20) * 0.02); // Mua khi giá Breakout khỏi vùng nền thắt chặt đó Buy = Cross( C, HHV(Ref(H,-1), 20) ) AND Ref(NenSietChat, -1);
SetOption() Hệ thống
Cài đặt các thông số cốt lõi cho trình Backtest như: Số vốn ban đầu (InitialEquity), số lượng mã mở tối đa (MaxOpenPositions), phí giao dịch (CommissionMode, CommissionAmount). Giúp giả lập tài khoản y hệt thực tế.
// Đặt vốn ban đầu 500 triệu VND SetOption( "InitialEquity", 500000000 ); // Mua tối đa 5 mã cùng lúc, phí giao dịch 0.15% SetOption( "MaxOpenPositions", 5 ); SetOption( "CommissionMode", 1 ); SetOption( "CommissionAmount", 0.15 );
SetTradeDelays() Hệ thống
Quy định độ trễ của lệnh. Thông thường, khi tín hiệu xuất hiện ở cây nến hiện tại (Cuối ngày), ta sẽ khớp lệnh vào phiên tiếp theo (Độ trễ = 1). Nếu không có hàm này, kết quả Backtest sẽ bị ảo tưởng (Look-ahead bias).
// Tín hiệu Mua/Bán hnay, nhưng sáng hôm sau mới khớp lệnh SetTradeDelays( 1, 1, 0, 0 ); // Nếu dùng Intraday (Phái sinh) khớp ngay lập tức thì set là 0 SetTradeDelays( 0, 0, 0, 0 );
BuyPrice & SellPrice Giá trị
Biến hệ thống quy định Giá Khớp Lệnh. Mặc định AmiBroker lấy giá Close, nhưng trong thực tế, nếu bạn độ trễ 1 ngày, bạn phải khớp lệnh bằng giá Mở cửa (Open) của ngày hôm sau.
// Cấu hình khớp lệnh vào giá Mở cửa phiên sáng hôm sau (ATO) SetTradeDelays( 1, 1, 0, 0 ); BuyPrice = O; SellPrice = O; // Hoặc bắt dao rơi: Khớp ở giá Thấp nhất trong phiên BuyPrice = L;
Filter & AddColumn() Hệ thống
Bộ đôi "Sát thủ" dùng trong cửa sổ Analysis (Explore). Dùng để lọc ra danh sách các cổ phiếu thoả mãn điều kiện và in thành bảng Excel kèm theo các thông số bạn muốn xem (Giá, Khối lượng, RSI...).
// Lọc các mã nổ Vol hnay Filter = V > MA(V, 20) * 2; // Xuất ra bảng kết quả cột Giá đóng cửa và Cột Khối lượng hnay AddColumn( C, "Gia Dong Cua", 1.2, colorDefault, IIf(C>O, colorGreen, colorRed) ); AddColumn( V, "Khoi Luong", 1.0 );
Foreign() Giá trị
Hàm tham chiếu chéo. Cho phép lấy dữ liệu của một mã cổ phiếu/chỉ số khác (ví dụ VNINDEX) đưa vào đồ thị hiện tại. Rất mạnh để viết các chỉ báo Sức mạnh Tương đối (RS) - mua cổ khỏe hơn VnIndex.
// Lấy giá đóng cửa của VN-Index GiaVNI = Foreign( "VNINDEX", "C" ); // Tính sức mạnh: Giá hiện tại / Giá VNINDEX RS = C / GiaVNI; Plot( RS, "Suc Manh Tuong Doi", colorBlue, styleLine );
Status() Hệ thống
Lấy trạng thái vận hành của AmiBroker. Thường được dùng với Status("action") để phân nhánh code: Nếu AmiBroker đang chạy Lọc thì làm việc A, nếu đang vẽ Biểu đồ thì làm việc B. Giúp code nhẹ và tối ưu tốc độ hơn.
// Chỉ xuất cột (AddColumn) khi chạy chế độ Explore (Lọc) if( Status("action") == actionExplore ) { Filter = Buy; AddColumn( C, "Gia Mua" ); } // Nếu đang xem trên Chart thì vẽ Mũi tên if( Status("action") == actionIndicator ) { PlotShapes( Buy * shapeUpArrow, colorGreen ); }
TimeFrameSet() & Restore() Hệ thống
Hàm Đa Khung Thời Gian (Multi-Timeframe). Cho phép bạn đang ở chart Ngày (Daily) nhưng vẫn có thể ép hệ thống nhảy sang chart Tuần (Weekly) để tính toán MA Tuần, sau đó khôi phục lại. Bí kíp của các hệ thống Trend-following.
// Nhảy sang khung Tuần (Weekly) TimeFrameSet( inWeekly ); MACD_Tuan_DangTang = MACD() > Signal(); TimeFrameRestore(); // Khôi phục về khung Ngày // Đồng bộ dữ liệu Tuần về Ngày (Kéo giãn ra) MACD_Tuan_Sync = TimeFrameExpand( MACD_Tuan_DangTang, inWeekly ); // Mua khi MA20 Ngày cắt lên, VÀ Trend Tuần đang ủng hộ Buy = Cross( C, MA(C,20) ) AND MACD_Tuan_Sync;
Equity() Đồ thị
Tính toán và sinh ra mảng Đường cong Vốn (Equity Curve) dựa trên các lệnh Buy/Sell/Short/Cover bạn đã khai báo. Thường dùng để vẽ trực tiếp sự tăng giảm tài khoản ngay trên Chart đồ thị.
// Viết hệ thống giao dịch Buy = Cross( MA(C,10), MA(C,50) ); Sell = Cross( MA(C,50), MA(C,10) ); // Khởi tạo và vẽ đường biến động vốn DuongVon = Equity( 1, -1 ); Plot( DuongVon, "Tai khoan hien tai", colorGreen, styleArea );
StaticVarSet() & Get() Hệ thống
Biến tĩnh toàn cục. Các biến thông thường sẽ bị xóa khi AmiBroker tính toán xong 1 chart. Biến Tĩnh sẽ được lưu thẳng vào RAM máy tính, cho phép các Chart khác nhau hoặc các khung thời gian khác nhau trao đổi dữ liệu cho nhau. Rất hay dùng trong bắn lệnh Auto-Trading.
// Ở Chart 1: Tính toán VNINDEX và lưu vào RAM máy tính RSIVNI = Foreign("VNINDEX", "C"); StaticVarSet( "VNI_RSI", RSIa(RSIVNI, 14) ); // Ở Chart 2 (Chart cổ phiếu FPT): Gọi dữ liệu VNI từ RAM ra dùng RSI_Cua_VNI = StaticVarGet( "VNI_RSI" ); // Mua FPT nếu VNINDEX đang ở vùng quá bán (RSI VNI < 30) Buy = Cross(C, MA(C,20)) AND RSI_Cua_VNI < 30;
SetCustomBacktestProc() Hệ thống
Giao diện CBI (Custom Backtester Interface). Đây là hàm đỉnh cao nhất của AmiBroker. Nó cho phép bạn can thiệp trực tiếp vào từng vòng lặp của bộ máy Backtest để tùy chỉnh thuật toán phân bổ tiền, hedging, hoặc chốt lời từng phần phức tạp.
// Gọi CBI để tùy chỉnh SetCustomBacktestProc( "" ); if( Status("action") == actionPortfolio ) { bo = GetBacktesterObject(); bo.PreProcess(); // Chuẩn bị dữ liệu // ... Các đoạn code vòng lặp for can thiệp vốn động vào đây... bo.PostProcess(); // Xuất báo cáo }
EnableRotationalTrading() Hệ thống
Kích hoạt chế độ Giao dịch Luân chuyển. Thay vì dùng lệnh Buy/Sell cứng nhắc, hệ thống sẽ liên tục xếp hạng toàn bộ thị trường (thông qua biến PositionScore). Nếu một mã trong danh mục bị rớt hạng, nó sẽ tự động bị bán (đảo hàng) để nhường tiền mua mã đang vươn lên Top đầu. Đây là triết lý đánh sóng ngành cực đỉnh!
// 1. Bật chế độ Luân chuyển tự động EnableRotationalTrading(); // 2. Cấu hình danh mục chỉ giữ tối đa 5 mã SetOption( "MaxOpenPositions", 5 ); // 3. Chấm điểm sức mạnh bằng RSI // Hệ thống sẽ tự động mua 5 mã có RSI cao nhất thị trường PositionScore = RSI( 14 );
GapUp() & GapDown() Logic
Nhận diện khoảng trống giá (Gap). Trả về True (1) nếu giá mở cửa hôm nay nhảy vọt lên trên mức giá cao nhất hôm qua (Gap Up), hoặc rơi thẳng xuống dưới mức thấp nhất hôm qua (Gap Down). Rất hay dùng trong các chiến lược đánh Breakout sức mạnh.
// Tín hiệu mua siêu khỏe: Giá vượt đỉnh 20 phiên VÀ tạo Gap Up VuotDinh = Cross( C, HHV(Ref(H,-1), 20) ); Buy = VuotDinh AND GapUp(); // Bán hoảng loạn (Cắt lỗ dứt khoát) khi rơi mở Gap Down Sell = Cross( MA(C,20), C ) AND GapDown();
PeakBars() & TroughBars() Logic
Đếm số nến (thời gian) tính từ Đỉnh/Đáy gần nhất. Trả về khoảng cách thời gian kể từ khi tạo đỉnh/đáy. Dùng để giới hạn thời gian tìm kiếm mẫu hình (Ví dụ: Yêu cầu Đáy 2 không được cách Đáy 1 quá 20 phiên).
// Tính số nến kể từ lúc tạo đáy gần nhất (với biên độ đảo chiều 5%) SoNenTuDay = TroughBars( L, 5, 1 ); // Mua nếu giá đang bứt phá VÀ đáy vừa mới tạo cách đây <= 10 phiên // (Đảm bảo nền giá chưa chạy quá xa khỏi đáy) Buy = Cross( C, MA(C,20) ) AND SoNenTuDay <= 10;
DayOfWeek() Logic
Trả về ngày trong tuần (0 = Chủ nhật, 1 = Thứ Hai, ..., 5 = Thứ Sáu). Dùng để thiết lập các quy tắc giao dịch theo thời gian. Rất thiết thực cho thị trường T+2.5 tại Việt Nam khi bạn muốn tránh giải ngân vào cuối tuần.
// Trả về giá trị từ 1 đến 5 (Thứ 2 đến Thứ 6) NgayHienTai = DayOfWeek(); // Điều kiện Mua: Vượt MA20 NHƯNG cấm mua vào Thứ 6 (DayOfWeek = 5) // Để né rủi ro tin tức xấu ra vào hai ngày cuối tuần Buy = Cross( C, MA(C,20) ) AND NgayHienTai != 5;
Cum() Logic
Cộng dồn tích lũy (Cumulative). Tính tổng tất cả các giá trị (hoặc đếm tổng số lần xảy ra tín hiệu) từ khi cổ phiếu lên sàn đến hiện tại. Rất hữu ích để đếm tổng số lệnh đã giao dịch, hoặc tính toán tỷ lệ Win/Loss.
// Đếm tổng số phiên cổ phiếu đóng cửa Xanh (C > O) từ trước tới nay TongSoPhienXanh = Cum( C > O ); // Đếm tổng số lệnh Mua mà hệ thống đã phát ra TongSoLenhMua = Cum( Buy );
IsNull() & IsEmpty() Logic
Kiểm tra mảng dữ liệu Rỗng (Null). Khi một cổ phiếu mới lên sàn (hoặc tính MA200 khi chưa đủ 200 ngày), dữ liệu sẽ bị rỗng. Nếu đem rỗng đi cộng trừ sẽ làm hỏng toàn bộ công thức. Hàm này kết hợp với IIf() giúp bẫy lỗi và cứu hệ thống khỏi bị treo.
// Lấy giá đóng cửa của chỉ số VNINDEX tham chiếu GiaVNI = Foreign("VNINDEX", "C"); // Nếu ngày đó VNI nghỉ lễ (Trả về Null), thì thay bằng giá của mã hiện tại // Nếu có giá trị thì dùng GiaVNI bình thường GiaVNI_Chuan = IIf( IsNull(GiaVNI), C, GiaVNI );
ATR() Chỉ báo
Average True Range (Khoảng dao động thực tế trung bình). Thước đo kinh điển về độ biến động (Volatility) của cổ phiếu. Cực kỳ phổ biến để tính toán mức Cắt lỗ động (Trailing Stop) hoặc tính khối lượng đi lệnh (Position Sizing).
// Tính ATR 14 phiên BienDong = ATR( 14 ); // Đặt mức cắt lỗ (Stoploss) dưới giá đóng cửa 2 lần ATR MucCatLo = C - (2 * BienDong); Plot( MucCatLo, "Stoploss", colorRed, styleDashed );
ADX() Chỉ báo
Average Directional Index. Chỉ báo đo lường sức mạnh của xu hướng (không phân biệt tăng hay giảm). Khi ADX > 25, thị trường đang có Trend mạnh. Khi ADX < 20, thị trường đang đi ngang (Sideway).
// Lọc mã đang có xu hướng mạnh (ADX > 25) TrendManh = ADX( 14 ) > 25; // Mua khi có Trend mạnh và giá cắt lên MA20 Buy = Cross( C, MA(C,20) ) AND TrendManh;
PDI() & MDI() Chỉ báo
Positive/Negative Directional Indicator (+DI và -DI). Cặp bài trùng đi kèm với ADX. +DI đo sức mạnh phe Mua, -DI đo sức mạnh phe Bán. Giao cắt giữa +DI và -DI là tín hiệu xác nhận đổi Trend.
// Mua khi Phe Mua (+DI) áp đảo Phe Bán (-DI) Buy = Cross( PDI(14), MDI(14) ); // Bán khi Phe Bán mạnh hơn Phe Mua Sell = Cross( MDI(14), PDI(14) );
MFI() Chỉ báo
Money Flow Index (Chỉ số dòng tiền). Được ví như "RSI có tích hợp Khối lượng". Cực kỳ nhạy trong việc phát hiện dòng tiền lớn gom hàng hoặc phân phối đỉnh. >80 là Quá mua, <20 là Quá bán.
// Lọc các mã cạn cung, dòng tiền đang rục rịch vào lại đáy QuaBan = MFI( 14 ) < 20; // Mua khi MFI cắt lên vùng 20 Buy = Cross( MFI(14), 20 );
OBV() Chỉ báo
On Balance Volume. Chỉ báo kinh điển của phương pháp VSA. Cộng dồn Volume vào ngày tăng và trừ Volume vào ngày giảm. Phân kỳ giữa Giá và OBV là dấu hiệu nhận biết Cá mập đang gom/xả hàng ngầm.
// Vẽ đường OBV và đường MA của OBV để tìm giao cắt dòng tiền DongTien = OBV(); MaDongTien = MA( DongTien, 20 ); Plot( DongTien, "OBV", colorBlue, styleLine ); Plot( MaDongTien, "MA OBV", colorRed, styleDashed );
CCI() Chỉ báo
Commodity Channel Index. Đo lường sự sai lệch của giá so với mức trung bình thống kê. Thường dao động quanh trục 0. Vượt +100 báo hiệu xu hướng tăng mạnh, thủng -100 báo hiệu xu hướng giảm mạnh.
// Mua khi CCI bứt phá mốc +100 (Bắt đầu chân sóng) Buy = Cross( CCI(14), 100 ); // Bán khi CCI rơi xuống dưới mốc -100 Sell = Cross( -100, CCI(14) );
StochK() & StochD() Chỉ báo
Stochastic Oscillator. Chỉ báo dao động cho biết vị trí của giá đóng cửa so với biên độ giá trong N phiên. Cực kỳ nhạy bén trong các vùng giá Sideway để bắt đáy/bán đỉnh ngắn hạn.
// Thông số Stochastic chuẩn (14, 3, 3) K = StochK( 14, 3 ); D = StochD( 14, 3, 3 ); // Mua khi %K cắt %D ở vùng quá bán (< 20) Buy = Cross( K, D ) AND K < 20;
SAR() Chỉ báo
Parabolic SAR (Stop and Reverse). Hệ thống dấu chấm bám theo xu hướng giá. Rất phù hợp làm công cụ dời Stoploss (Trailing Stop). Khi giá xuyên qua các dấu chấm, xu hướng được coi là đã đảo chiều.
// Tính SAR với gia tốc chuẩn ChamSAR = SAR( 0.02, 0.2 ); // Vẽ các dấu chấm lên Chart Plot( ChamSAR, "PSAR", colorBlue, styleDots | styleNoLine ); // Mua khi Giá đóng cửa cắt lên trên dải chấm SAR Buy = Cross( C, ChamSAR );
ROC() Chỉ báo
Rate of Change (Tốc độ thay đổi). Đo phần trăm thay đổi của giá hiện tại so với giá của N phiên trước đó. Dùng để tìm kiếm các cổ phiếu có xung lực (Momentum) tăng giá nhanh nhất thị trường.
// Tính tỷ lệ thay đổi giá so với 10 ngày trước TocDoTang = ROC( C, 10 ); // Dùng ROC làm điểm số xếp hạng (PositionScore) để lọc mã khỏe nhất PositionScore = TocDoTang;
WMA() Chỉ báo
Weighted Moving Average. Trung bình động có trọng số. Cung cấp trọng số nặng hơn cho các dữ liệu giá gần nhất, giúp đường MA bám sát giá nhanh hơn so với MA thông thường (SMA).
// Khai báo đường WMA 20 phiên DuongWMA = WMA( C, 20 ); // So sánh vẽ cùng SMA để thấy WMA nhạy hơn Plot( MA(C,20), "SMA 20", colorBlue ); Plot( DuongWMA, "WMA 20", colorRed );
DEMA() Chỉ báo
Double Exponential Moving Average. Trung bình động hàm mũ Kép. Được thiết kế để triệt tiêu gần như toàn bộ độ trễ (Lag) của các đường MA truyền thống. Rất được ưa chuộng trong giao dịch phái sinh ngắn hạn.
// Mua ngay khi đường DEMA siêu nhạy hướng lên DuongDEMA = DEMA( C, 10 ); // Mua khi DEMA hôm nay lớn hơn DEMA hôm qua Buy = DuongDEMA > Ref( DuongDEMA, -1 );
TEMA() Chỉ báo
Triple Exponential Moving Average. Trung bình động hàm mũ Ba. Nhạy bén đến mức cực đoan, TEMA phản ứng ngay lập tức với các biến động giá nhỏ nhất. Cần kết hợp với hệ thống lọc nhiễu tốt.
// Tín hiệu mua sớm với TEMA giao cắt Buy = Cross( TEMA(C, 9), TEMA(C, 21) ); Plot( TEMA(C,9), "TEMA 9", colorGreen ); Plot( TEMA(C,21), "TEMA 21", colorRed );
TRIX() Chỉ báo
Triple Exponential Average Oscillator. TRIX lấy phần trăm thay đổi của đường EMA làm mượt 3 lần. Chỉ báo này loại bỏ xuất sắc các tín hiệu nhiễu và chỉ báo hiệu xu hướng chính trị của cổ phiếu.
// Tính TRIX và đường Signal của nó DuongTrix = TRIX( 15 ); SignalTrix = EMA( DuongTrix, 9 ); // Mua khi TRIX cắt lên Signal Buy = Cross( DuongTrix, SignalTrix );
LinRegSlope() Chỉ báo
Linear Regression Slope (Độ dốc hồi quy tuyến tính). Hàm toán học tính toán độ dốc của xu hướng giá. Nếu dốc > 0 là trend tăng, < 0 là trend giảm. Con số càng lớn xu hướng càng mạnh.
// Tính độ dốc của xu hướng trong 20 ngày qua DoDoc = LinRegSlope( C, 20 ); // Lọc các cổ phiếu có Trend tăng ổn định (Độ dốc > 0) Filter = DoDoc > 0; AddColumn( DoDoc, "Goc Tang", 1.2 );
Chaikin() Chỉ báo
Chaikin Oscillator. Kết hợp cả Giá và Khối lượng để đo lường áp lực Tích lũy (Gom hàng) hay Phân phối (Xả hàng) của dòng tiền tổ chức. Cắt lên 0 báo hiệu tiền vào, cắt xuống báo hiệu tiền rút ra.
// Vẽ biểu đồ Chaikin ChiBaoChaikin = Chaikin(); Mau = IIf(ChiBaoChaikin > 0, colorGreen, colorRed); Plot( ChiBaoChaikin, "Chaikin Osc", Mau, styleHistogram ); // Tín hiệu gom hàng cực mạnh Buy = Cross( ChiBaoChaikin, 0 );
Ultimate() Chỉ báo
Ultimate Oscillator. Chỉ báo hiếm hoi gộp sức mạnh của 3 khung thời gian khác nhau (mặc định 7, 14, 28) vào làm một để giảm thiểu tín hiệu phân kỳ giả. Tuyệt vời để xác định vùng bắt đáy cứng.
// Lấy giá trị Ultimate Osc Ult = Ultimate(); // Bắt đáy khi chỉ báo vượt ngưỡng quá bán (30) Buy = Cross( Ult, 30 ); Plot( Ult, "Ultimate Osc", colorBlue, styleLine );
VHF() Chỉ báo
Vertical Horizontal Filter. Bộ lọc giúp bạn trả lời câu hỏi sống còn: Thị trường đang có Trend hay đang Sideway? VHF cao nghĩa là thị trường có Trend mạnh, VHF thấp nghĩa là đang tích lũy đi ngang.
// Xác định trạng thái Trend hiện tại (28 phiên) TrangThai = VHF( C, 28 ); // Chuyển sang đánh Trend-following khi VHF cắt lên // Dùng MACD hiệu quả hơn khi thị trường có Trend Buy = Cross(MACD(), Signal()) AND TrangThai > Ref(TrangThai,-1);
WilliamsR() Chỉ báo
Williams %R. Dao động từ 0 đến -100. Chỉ báo này đo lường động lượng tương tự Stochastic nhưng đảo ngược. Đặc biệt nhạy trong việc phát hiện những pha quá bán cục bộ trong một Trend tăng dài hạn để mua gia tăng.
// Tìm điểm mua Pull-back (Rung lắc trong uptrend) W = WilliamsR( 14 ); // Cổ phiếu đang Trend tăng (Nằm trên MA50) // Nhưng bị chốt lời ngắn hạn (W < -80) -> Điểm gom hàng! Buy = C > MA(C,50) AND W < -80;
Zig() Chỉ báo
Chỉ báo ZigZag lọc nhiễu. Bỏ qua các biến động giá nhỏ hơn % thiết lập, nối thẳng các đỉnh đáy chính của chu kỳ. Lưu ý: Chỉ dùng để nhận diện sóng hoặc vẽ Trendline, tuyệt đối không dùng để Backtest vì hàm này nhìn trước tương lai (Look-ahead).
// Vẽ đường ZigZag nối các đỉnh đáy có biên độ > 5% DuongZigZag = Zig( C, 5 ); Plot( DuongZigZag, "ZigZag 5%", colorRed, styleThick );
KAMA() Chỉ báo
Kaufman's Adaptive Moving Average. Đường MA "thông minh" nhất. KAMA tự động nằm ngang không đổi khi thị trường Sideway (nhiễu), và dốc đứng bám sát giá ngay khi thị trường vào Trend tăng/giảm rõ rệt.
// Khai báo đường KAMA 10 phiên DuongKAMA = KAMA( C, 10 ); // Vẽ lên màn hình. Khi đi ngang nó giúp tránh điểm mua nhiễu Plot( DuongKAMA, "KAMA", colorGold, styleLine | styleThick ); Buy = Cross( C, DuongKAMA );
O, H, L, C, V Giá trị
Các mảng giá trị cốt lõi nhất của một cây nến. Tương ứng: Open (Mở cửa), High (Cao nhất), Low (Thấp nhất), Close (Đóng cửa) và Volume (Khối lượng).
// Lọc mã có giá đóng cửa lớn hơn mở cửa (Nến xanh) // VÀ khối lượng giao dịch trên 1 triệu cổ Filter = C > O AND V > 1000000;
Avg Giá trị
Giá trị trung bình của phiên (Typical Price). Bằng (High + Low + Close) chia 3. Đây là mức giá đại diện chính xác hơn cho toàn bộ phiên giao dịch so với việc chỉ dùng giá Đóng cửa.
// Tính MA20 dựa trên giá Trung bình thay vì giá Đóng cửa DuongMA_Chuan = MA( Avg, 20 ); Plot( DuongMA_Chuan, "Typical MA", colorBlue );
OpenInt (OI) Giá trị
Open Interest (Hợp đồng mở). Chỉ số cực kỳ quan trọng đối với dân đánh Phái Sinh (VN30F). Dùng để đo lường số lượng hợp đồng đang được nắm giữ qua đêm. OI tăng mạnh cho thấy xu hướng hiện tại rất bền vững.
// Vẽ biểu đồ Hợp đồng mở của Phái sinh KhoiLuongMo = OpenInt; Plot( KhoiLuongMo, "OI Phai Sinh", colorOrange, styleArea );
Highest() Giá trị
Trả về mức giá cao nhất TỪ TRƯỚC ĐẾN NAY (All-time High) của mã cổ phiếu tính từ lúc lên sàn. Rất mạnh để tìm các siêu cổ phiếu vượt đỉnh lịch sử.
// Mua khi giá đóng cửa hôm nay bằng với đỉnh lịch sử DinhLichSu = Highest( H ); Buy = C == DinhLichSu;
Lowest() Giá trị
Trả về mức giá thấp nhất TỪ TRƯỚC ĐẾN NAY (All-time Low). Thường dùng để đo lường xem cổ phiếu đã phục hồi được bao nhiêu % từ vùng đáy cùng cực.
// Tính tỷ lệ phục hồi từ đáy lịch sử DayLichSu = Lowest( L ); TyLePhucHoi = (C - DayLichSu) / DayLichSu * 100; AddColumn( TyLePhucHoi, "% Phuc Hoi", 1.2 );
HighestBars() Giá trị
Đếm số nến. Trả về khoảng cách (số phiên) tính từ mốc có giá trị cao nhất trong N phiên qua. Dùng để xem cổ phiếu tạo đỉnh cách đây bao lâu.
// Xem đỉnh 1 năm (250 phiên) vừa qua cách đây mấy phiên CachDinh = HighestBars( H, 250 ); // Mua nếu cổ phiếu mới tạo đỉnh trong vòng 1 tuần (5 phiên) Buy = CachDinh <= 5;
LowestBars() Giá trị
Đếm số nến. Trả về khoảng cách (số phiên) tính từ mốc có giá trị thấp nhất trong N phiên qua. Dùng để xem quá trình tạo đáy đã diễn ra đủ lâu chưa.
// Bắt đáy nếu cổ phiếu đã tạo đáy 52 tuần cách đây đúng 20 phiên // (Đã có thời gian tích lũy đi ngang sau khi rơi) CachDay = LowestBars( L, 250 ); Buy = CachDay >= 20 AND Cross( C, MA(C,20) );
DateNum() Giá trị
Trả về ngày tháng năm dưới dạng số nguyên (Format: YYMMDD). Ví dụ ngày 15/05/2026 sẽ là 1260515. Cực kỳ cần thiết khi bạn muốn hệ thống bắt đầu Backtest hoặc hiện tín hiệu từ một ngày cụ thể trong quá khứ.
// Chỉ mua cổ phiếu kể từ sau ngày 01/01/2026 (1260101) SauNgayNay = DateNum() >= 1260101; Buy = Cross(C, MA(C,20)) AND SauNgayNay;
Day(), Month(), Year() Giá trị
Tách lẻ Ngày (1-31), Tháng (1-12) và Năm. Cực kỳ lợi hại để viết các bộ lọc theo chu kỳ mùa vụ, ví dụ "Sell in May" (Bán vào tháng 5) hoặc chốt NAV vào cuối tháng 12.
// Ép hệ thống chốt lời toàn bộ danh mục vào tháng 12 hàng năm ThangHienTai = Month(); BanCuoiNam = ThangHienTai == 12; Sell = Cross(MA(C,20), C) OR BanCuoiNam;
Name() Giá trị
Trả về tên Ticker (Mã cổ phiếu) đang mở. Rất hay dùng để in tên cổ phiếu lên màn hình Chart hoặc loại trừ các mã rác không muốn giao dịch.
// Loại bỏ mã ROS và FLC ra khỏi bộ lọc mua LoaiMaRac = Name() != "ROS" AND Name() != "FLC"; Filter = Buy AND LoaiMaRac;
FullName() Giá trị
Trả về Tên công ty đầy đủ (Nếu bạn có nạp dữ liệu Information vào AmiBroker). Giúp bảng lọc Explore nhìn chuyên nghiệp và chi tiết hơn.
// Thêm cột Tên công ty vào bảng lọc AddTextColumn( FullName(), "Ten Doanh Nghiep", 1.0, colorWhite, colorDarkBlue, 200 );
GetRTData() Giá trị
Lấy dữ liệu Real-time trực tiếp từ sàn (Cần data feed hỗ trợ). Có thể lấy "Ask" (Giá bán rẻ nhất), "Bid" (Giá mua cao nhất), "AskSize" (Khối lượng dư bán). Siêu phẩm để tự code Bảng Điện Cá Nhân trong AmiBroker.
// Lấy khối lượng Dư Mua và Dư Bán giá 1 DuMua = GetRTData( "BidSize" ); DuBan = GetRTData( "AskSize" ); // Hiển thị lên màn hình Chart Title = "Du Mua: " + DuMua + " | Du Ban: " + DuBan;
GetFnData() Giá trị
Lấy dữ liệu Phân tích cơ bản (Fundamental Data). Cho phép lấy EPS, Book Value (BV), ROE, P/E. Đây là hàm bắt buộc phải có để code hệ thống đầu tư kết hợp Cơ bản & Kỹ thuật như CANSLIM của Mark Minervini.
// Lấy chỉ số EPS và P/E của doanh nghiệp EpsHienTai = GetFnData( "EPS" ); PeHienTai = C / EpsHienTai; // Chỉ mua các cổ phiếu có P/E nhỏ hơn 15 (Định giá rẻ) Buy = Cross(C, MA(C,20)) AND PeHienTai < 15;
SectorID() & IndustryID() Giá trị
Trả về Số ID đại diện cho Ngành cấp 1 (Sector) và Ngành cấp 2 (Industry) của cổ phiếu. Cực kỳ mạnh mẽ để viết các bộ lọc "Sóng Ngành" (Chỉ lọc các mã thuộc nhóm Ngân hàng hoặc Bất động sản).
// Giả sử Nhóm Ngân hàng có SectorID = 2 NhomNganHang = SectorID() == 2; // Chỉ lọc điểm Mua đối với các cổ phiếu dòng Ngân hàng Filter = Buy AND NhomNganHang;
CategoryGetName() Giá trị
Hàm chuyển đổi ID Ngành thành Text Tiếng Việt. Thay vì hiện số 1, 2, 3 khó hiểu, nó sẽ dịch ra thành "Bất động sản", "Ngân hàng", "Thép" để in ra bảng kết quả lọc.
// Lấy ID Ngành của cổ phiếu hiện tại IdNganh = SectorID(); // Dịch ID đó thành tên Ngành thực tế và in ra cột TenNganh = CategoryGetName( categorySector, IdNganh ); AddTextColumn( TenNganh, "Nhom Nganh", 1.0, colorWhite, colorBlue );
InWatchList() Giá trị
Kiểm tra cổ phiếu có nằm trong Watchlist (Danh sách theo dõi) số N hay không. Dành cho các Trader kỹ tính chỉ muốn hệ thống báo tín hiệu trên danh mục 20 mã "ruột" mà họ đã phân tích cơ bản kỹ lưỡng.
// Giả sử bạn lưu 20 mã ruột vào Watchlist số 1 MaRuot = InWatchList( 1 ); // Dù thị trường có 2000 mã, bộ lọc chỉ báo mua nếu mã đó nằm trong Watchlist 1 Filter = Buy AND MaRuot;
VarGet() Giá trị
Hàm lập trình nâng cao: Lấy giá trị của một Biến Động (Dynamic Variable) thông qua chuỗi tên biến. Cực kỳ mạnh mẽ khi kết hợp với vòng lặp For để tạo ra hàng trăm đường Hỗ trợ/Kháng cự cùng lúc.
// Lấy giá trị của biến "MucHoTro_1", "MucHoTro_2" tạo bởi vòng lặp for( i = 1; i <= 5; i++ ) { GiaTriHoTro = VarGet( "MucHoTro_" + i ); Plot( GiaTriHoTro, "Ho Tro " + i, colorGreen, styleLine ); }
StrToNum() & NumToStr() Giá trị
Chuyển đổi qua lại giữa dạng Số và dạng Chữ (Text). Rất thường dùng khi bạn muốn lấy một thông số giá (Số) để nhét vào dòng Title cảnh báo (Chữ) cho người dùng đọc.
// Chuyển giá trị Volume (Số) thành Text có dấu phẩy hàng ngàn (1.0) VolText = NumToStr( V, 1.0 ); Title = "Khoi luong hom nay la: " + VolText + " co phieu.";
ROC() Giá trị
Mặc dù là Chỉ báo, nhưng ROC được sử dụng cực nhiều như một hàm Giá trị để tính toán Tỷ lệ % thay đổi của bất kỳ mảng nào (Giá, Khối lượng, RSI...).
// Tính Volume hôm nay đột biến bao nhiêu % so với hôm qua VolDotBien = ROC( V, 1 ); // Lọc các mã có Volume tăng > 200% so với phiên trước Filter = VolDotBien > 200;
PercentRank() Giá trị
Xếp hạng bách phân vị. Hàm này cực dị: Nó so sánh giá trị hiện tại với N phiên quá khứ và trả về xem hôm nay mạnh hơn bao nhiêu % số phiên đó. Dùng để xếp hạng sức mạnh giá kiểu RS Rating của O'Neil.
// Xem giá đóng cửa hôm nay nằm ở Top bao nhiêu % trong 1 năm qua SucManhGia = PercentRank( C, 250 ); // Chỉ mua cổ phiếu đang nằm trong Top 10% đỉnh cao nhất (Rating > 90) Buy = Cross(C, MA(C,20)) AND SucManhGia > 90;
BarIndex() Giá trị
Trả về số thứ tự (Index) của cây nến trên biểu đồ, bắt đầu từ 0 cho cây nến cũ nhất. Đây là biến số đếm vị trí tuyệt đối (tọa độ trục X), cực kỳ quan trọng khi bạn muốn viết các vòng lặp phức tạp hoặc tính toán khoảng cách chính xác giữa 2 điểm bất kỳ trên Chart.
// Lấy mảng số thứ tự của toàn bộ nến ThuTuNen = BarIndex(); // Xác định vị trí của cây nến cuối cùng (hiện tại) trên Chart NenCuoiCung = ThuTuNen == LastValue( ThuTuNen ); // Tự động vẽ một mũi tên màu Vàng chỉ thẳng vào nến cuối cùng PlotShapes( NenCuoiCung * shapeDownArrow, colorYellow, 0, H, -25 );
PlotOHLC() Đồ thị
Vẽ nến tuỳ chỉnh. Thay vì dùng Plot() để vẽ nến mặc định của sàn, hàm này cho phép bạn vẽ ra các loại nến đặc biệt (Ví dụ: Nến Heikin Ashi mượt mà, hoặc nến được lọc nhiễu bởi thuật toán riêng).
// Công thức tính nến Heikin Ashi đơn giản HaClose = (O + H + L + C) / 4; HaOpen = AMA( Ref( HaClose, -1 ), 0.5 ); HaHigh = Max( H, Max( HaClose, HaOpen ) ); HaLow = Min( L, Min( HaClose, HaOpen ) ); // Vẽ nến Heikin Ashi lên biểu đồ MauHA = IIf(HaClose > HaOpen, colorGreen, colorRed); PlotOHLC( HaOpen, HaHigh, HaLow, HaClose, "Heikin Ashi", MauHA, styleCandle );
PlotText() Đồ thị
In một đoạn chữ trực tiếp lên đồ thị, bám theo tọa độ của từng cây nến. Rất hữu ích để đánh dấu các mốc đỉnh đáy quan trọng hoặc viết chữ "Mua"/"Bán" thay vì dùng mũi tên.
// Xác định điểm mua Buy = Cross( C, MA(C, 20) ); // In chữ "MUA" màu trắng, nền xanh lá ngay dưới chân cây nến Mua for( i = 0; i < BarCount; i++ ) { if( Buy[i] ) PlotText( "MUA", i, L[i], colorWhite, colorGreen, -20 ); }
PlotTextSetFont() Đồ thị
Phiên bản nâng cấp của PlotText. Cho phép bạn thay đổi phông chữ (Arial, Tahoma...) và kích thước chữ to nhỏ tùy ý. Giúp các chữ cảnh báo trên Chart trở nên rõ ràng và đồng bộ với giao diện.
// In chữ BÁN to đùng bằng font Arial, size 12, in đậm PlotTextSetFont( "BAN!", "Arial", 12, i, H[i], colorWhite, colorRed, 20 );
PlotVAPOverlay() Đồ thị
Volume At Price (Volume Profile). Vẽ biểu đồ khối lượng theo mức giá (nằm ngang) ngay trên màn hình chính. Đây là vũ khí tối thượng của VSA để tìm ra Vùng giá tích lũy/Phân phối có khối lượng giao dịch dày đặc nhất (POC).
// Vẽ Volume Profile chiếm 15% bề ngang màn hình, màu xám nhạt PlotVAPOverlay( 300, 15, ColorBlend(colorLightGrey, colorWhite, 0.8), 1 );
PlotGrid() Đồ thị
Kẻ các đường lưới ngang tĩnh bám theo trục Y. Cực kỳ tiện lợi khi vẽ các mốc 30, 70 cho RSI hoặc mốc 0 cho MACD mà không cần dùng đến hàm Plot() tốn tài nguyên.
// Vẽ biểu đồ RSI Plot( RSI(14), "RSI", colorBlue, styleLine ); // Kẻ sẵn 3 đường ngang làm mốc Quá mua/Quá bán/Cân bằng PlotGrid( 30, colorGreen, styleDashed ); PlotGrid( 50, colorGrey50, styleDashed ); PlotGrid( 70, colorRed, styleDashed );
SetBarFillColor() Đồ thị
Thay đổi màu phần "ruột" của cây nến. Bình thường Plot() chỉ đổi màu viền nến. Hàm này cho phép bạn tạo ra các loại nến Rỗng/Đặc hoặc nến đổ màu Gradien tuỳ theo sức mạnh dòng tiền.
// Nếu V > MA20 thì ruột nến đặc màu Vàng, ngược lại rỗng (đen) RuotVang = IIf( V > MA(V,20), colorYellow, colorBlack ); SetBarFillColor( RuotVang ); Plot( C, "Gia", colorWhite, styleCandle );
SetChartOptions() Đồ thị
Can thiệp sâu vào hiển thị của AmiBroker. Hàm này có thể bật/tắt hiển thị Tên mã, Tắt trục giá bên phải, Tắt ngày tháng bên dưới... Giúp tạo ra một không gian vẽ đồ họa hoàn toàn sạch sẽ.
// Ẩn đường lưới mặc định và ẩn luôn trục Y bên phải // Phù hợp khi vẽ các biểu đồ phụ (Dashboard) không cần giá SetChartOptions( 0, chartHideQuoteMarker, chartGridNone );
SetChartBkGradientFill() Đồ thị
Đổ màu nền chuyển sắc (Gradient) cho toàn bộ Chart đồ thị. Đây là cách nhanh nhất để làm cho bộ code của bạn trông sang trọng, hiện đại và bớt chói mắt hơn nền Trắng/Đen mặc định.
// Đổ nền Gradient từ màu Xanh đen (trên) xuống Đen tuyền (dưới) SetChartBkGradientFill( ColorRGB(15, 23, 42), colorBlack, colorWhite );
ColorRGB() & ColorBlend() Đồ thị
Mở khóa bảng màu vô hạn. Thay vì loanh quanh với 16 màu cơ bản (colorRed, colorBlue...), ColorRGB cho phép bạn tạo ra bất kỳ màu nào. ColorBlend giúp pha trộn (làm mờ) 2 màu với nhau, rất hữu ích để vẽ Mây Ichimoku mờ ảo.
// Pha màu Xanh Mint Pastel cực đẹp (R:16, G:185, B:129) XanhMint = ColorRGB( 16, 185, 129 ); // Làm cho màu Xanh Mint mờ đi 80% (Pha với nền Đen) XanhMienAo = ColorBlend( XanhMint, colorBlack, 0.2 ); Plot( C, "Gia", XanhMienAo, styleCloud );
Title Đồ thị
Biến hệ thống quan trọng bậc nhất. Kiểm soát toàn bộ dòng chữ hiển thị ở góc trên cùng bên trái màn hình đồ thị. Nơi bạn cho khách hàng thấy tên Cổ phiếu, Giá hiện tại, Khối lượng và các Lời khuyên Mua/Bán tự động.
// Định dạng dòng Tiêu đề góc trái siêu chuyên nghiệp Title = Name() + " - Ngay: " + Date() + " | Gia: " + C + " | Khoi luong: " + NumToStr(V, 1.0);
EncodeColor() Đồ thị
"Phép thuật" đổi màu chữ trong dòng Tiêu đề (Title). Chỉ cần nhét hàm này vào trước đoạn chữ nào, đoạn chữ đó sẽ lập tức đổi màu. Giúp hiển thị Khuyến nghị: MUA (màu Xanh) / BÁN (màu Đỏ) đập thẳng vào mắt người xem.
// Nếu Giá tăng (C>O) thì chữ màu Xanh, giảm thì chữ màu Đỏ MauGia = IIf( C > O, colorGreen, colorRed ); Title = "Trang thai: " + EncodeColor(MauGia) + WriteIf(C > O, "TANG GIA", "GIAM GIA") + EncodeColor(colorWhite) + " (Mau tro lai binh thuong)";
LineArray() Đồ thị
Hàm toán học vẽ đường thẳng (Trendline) nối từ điểm A (Toạ độ X0, Y0) đến điểm B (Toạ độ X1, Y1). Cực kỳ mạnh mẽ để code hệ thống tự động vẽ Kháng cự/Hỗ trợ chéo mà không cần tự kẻ bằng tay.
// Kéo đường Trendline từ Đỉnh của 20 phiên trước đến Đỉnh hiện tại BarHienTai = BarCount - 1; BarCu = BarHienTai - 20; DuongTrend = LineArray( BarCu, H[BarCu], BarHienTai, H[BarHienTai], 1 ); Plot( DuongTrend, "Trendline", colorYellow, styleLine );
GfxSelectFont() Đồ thị
Bắt đầu chuỗi Đồ họa Gfx. Hàm này thiết lập Phông chữ, Kích thước và Độ đậm nhạt cho các văn bản Gfx. Lưu ý: Mọi hình ảnh/chữ viết bằng Gfx sẽ đứng yên trên màn hình máy tính, bất kể bạn cuộn hay thu phóng biểu đồ nến!
// Chọn font Arial, size 16, in đậm (weight=700) GfxSelectFont( "Arial", 16, 700 );
GfxSelectSolidBrush() & GfxSelectPen() Đồ thị
Chọn công cụ Vẽ. Brush (Cọ tô) quyết định màu của phần Ruột hình (ví dụ ruột hình vuông). Pen (Bút kẻ) quyết định màu và độ dày của phần Viền ngoài.
// Chuẩn bị cọ tô ruột màu Xanh, viền ngoài màu Trắng dày 2px GfxSelectSolidBrush( colorGreen ); GfxSelectPen( colorWhite, 2 ); // Bây giờ hễ vẽ hình gì (vuông, tròn) thì nó sẽ ăn theo Cọ và Bút này
GfxRectangle() & GfxRoundRect() Đồ thị
Vẽ hình hộp chữ nhật (Rectangle) hoặc hình hộp bo góc (RoundRect) cố định trên màn hình. Đây là khung xương để tạo ra các bảng Báo cáo (Dashboard) sang trọng trôi nổi bên góc màn hình.
// Chọn màu nền hộp là Đen trong suốt (Pha màu) GfxSelectSolidBrush( ColorBlend(colorBlack, colorWhite, 0.9) ); // Vẽ một cái hộp bo góc ở góc trên bên phải màn hình // Toạ độ X1=10, Y1=10, X2=300, Y2=200, Bo góc=15px GfxRoundRect( 10, 10, 300, 200, 15, 15 );
GfxSetTextColor() & GfxTextOut() Đồ thị
Thiết lập màu chữ và In chữ lên màn hình theo tọa độ Pixel tuyệt đối. Chữ này sẽ nằm đè lên hộp Rectangle vừa tạo, không bao giờ bị lệch đi đâu khi bạn lăn chuột xem chart.
// Set màu chữ Vàng, in chữ "UPTRADING.VN" vào trong hộp GfxSetTextColor( colorYellow ); GfxTextOut( "HETHONG GIAO DICH UPTRADING", 20, 20 ); GfxSetTextColor( colorWhite ); GfxTextOut( "Gia hien tai: " + C, 20, 50 );
GfxSetBkMode() Đồ thị
Chỉnh chế độ nền cho chữ Gfx. Nếu không có hàm này, chữ GfxTextOut in ra sẽ bị dính một cái viền viền nền trắng trông rất xấu. Chỉnh mode = 1 (Trong suốt) để chữ hòa mượt mà vào màu hộp nền.
// Bắt buộc phải đặt hàm này TRƯỚC khi in chữ (GfxTextOut) // 1 = Transparent (Nền trong suốt) GfxSetBkMode( 1 ); GfxTextOut( "Chu nay khong bi vien trang", 10, 10 );
GfxSetOverlayMode() Đồ thị
Quyết định lớp vẽ (Layer) của Gfx. Bình thường các hình hộp Gfx sẽ bị chìm ra đằng sau các đường Plot() hoặc Nến. Đặt Mode = 1 (hoặc 2) để bắt hệ thống vẽ bảng Gfx đè lên trên tất cả mọi thứ, tránh bị nến che khuất.
// Ép toàn bộ các hàm Gfx vẽ đè lên trên cùng của Chart GfxSetOverlayMode( 1 ); // ... Sau đó mới dùng GfxRectangle, GfxTextOut ...
GfxMoveTo() & GfxLineTo() Đồ thị
Vẽ đường thẳng tự do trên không gian màn hình. Đầu tiên dùng MoveTo để di chuyển ngòi bút tới điểm A. Sau đó dùng LineTo để kéo một đường mực thẳng tắp tới điểm B. Dùng để chia bảng Dashboard thành các cột ngang/dọc gọn gàng.
// Chọn bút màu xám nét mảnh GfxSelectPen( colorLightGrey, 1 ); // Kẻ một đường thẳng ngăn cách trong bảng từ X=10 đến X=290 (tại vị trí Y=40) GfxMoveTo( 10, 40 ); GfxLineTo( 290, 40 );
RequestTimedRefresh() Đồ thị
Làm tươi bản vẽ (Real-time). Trong AmiBroker, bảng Gfx chỉ được vẽ lại khi có nến mới hoặc bạn click chuột. Nếu bạn in đồng hồ thời gian hoặc dữ liệu Bid/Ask bằng Gfx, bạn bắt buộc phải dùng hàm này để ép phần mềm vẽ lại liên tục mỗi 1 giây.
// Ép Chart Refresh tự động 1 giây / lần RequestTimedRefresh( 1 ); // In đồng hồ thời gian thực nhảy số liên tục lên Chart GfxTextOut( "Gio hien tai: " + Now(4), 10, 10 );
Correlation() Toán học
Tính hệ số tương quan (từ -1 đến 1) giữa 2 mảng. Nếu = 1 là 2 cổ phiếu chạy giống hệt nhau, -1 là chạy ngược chiều nhau. Cực kỳ quan trọng để đánh chiến lược Pairs Trading (Giao dịch theo cặp).
// Tìm độ tương quan giữa giá Cổ phiếu hiện tại và VNINDEX trong 50 ngày GiaVNI = Foreign( "VNINDEX", "C" ); TuongQuan = Correlation( C, GiaVNI, 50 ); Plot( TuongQuan, "Tuong quan VNI", colorBlue, styleLine );
Percentile() Toán học
Tính toán Bách phân vị. Dùng để tìm ra mức giá trị sao cho X% dữ liệu trong quá khứ nằm dưới mức này. Chuyên dùng để làm mượt các nhiễu loạn của giá thay vì dùng Max/Min tuyệt đối.
// Tìm mức giá đại diện cho Top 90% (Loại bỏ 10% râu nến nhiễu tột đỉnh) KhacCu90 = Percentile( H, 100, 90 ); Plot( KhacCu90, "Kháng cự bách phân vị", colorRed, styleLine );
LinearReg() Toán học
Giá trị Hồi quy tuyến tính. Nó dùng thuật toán bình phương tối thiểu để kẻ một đường thẳng tưởng tượng bám sát nhất với giá trong N phiên, sau đó trả về điểm cuối của đường thẳng đó. Mượt và nhanh hơn MA.
// Đường giá trị hồi quy tuyến tính 20 phiên DuongHoiQuy = LinearReg( C, 20 ); Plot( DuongHoiQuy, "Linear Reg", colorYellow, styleThick );
StdErr() Toán học
Sai số chuẩn. Thường dùng kết hợp với LinearReg để tạo ra dải băng Standard Error Bands (tương tự Bollinger Bands nhưng bám xu hướng chặt hơn).
// Tính dải trên của băng Hồi quy SaiSo = StdErr( C, 20 ); DaiTren = LinearReg( C, 20 ) + (2 * SaiSo); Buy = Cross( C, DaiTren );
Median() Toán học
Giá trị Trung vị. Nó sẽ sắp xếp dữ liệu N phiên từ thấp đến cao và lấy giá trị nằm đúng ở giữa. Median miễn nhiễm tuyệt đối với các cây nến giá trần/sàn đột biến (Gap), tốt hơn nhiều so với dùng hàm Trung bình (Average).
// Giá trung vị 20 phiên GiaTrungVi = Median( C, 20 ); Plot( GiaTrungVi, "Median 20", colorWhite, styleDashed );
Log10() & ln() Toán học
Logarit cơ số 10 và Logarit tự nhiên. Rất cần thiết khi bạn muốn đo lường sức mạnh của các cổ phiếu tăng bằng lần (x2, x3), vì đồ thị thường (Linear) sẽ làm các mức giá trong quá khứ bị bẹp dúm lại.
// Chuyển đổi giá đóng cửa sang đồ thị hệ Logarit GiaLog = Log10( C ); Plot( GiaLog, "Chart Log", colorGreen, styleLine );
Sqrt() Toán học
Tính Căn bậc hai. Một công cụ thuần toán học nhưng rất được giới Gann Trading (Lý thuyết chu kỳ W.D.Gann) ưa chuộng để tính các góc bình phương giá.
// Tính căn bậc hai của giá để dùng trong lý thuyết Gann GocGann = Sqrt( C ) + 1; MucKhangCuTiepTheo = GocGann ^ 2;
Round(), Ceil(), Floor() Toán học
Các hàm làm tròn số. Round làm tròn gần nhất (0.5 lên 1). Ceil ép làm tròn Lên trần (0.1 thành 1). Floor ép làm tròn Xuống sàn (0.9 thành 0). Cực cần thiết để tính chính xác khối lượng mua cổ phiếu chặn chẵn (lô 100).
// Vốn 100tr, mua giá 23.5 -> Được 4255 cổ SoCoPhieu = 100000000 / 23500; // Làm tròn xuống bội số của 100 (Mua lô chẵn: 4200 cổ) LoChan = Floor( SoCoPhieu / 100 ) * 100;
Max() & Min() Toán học
So sánh 2 giá trị và trả về số lớn nhất (Max) hoặc nhỏ nhất (Min). Cực kỳ hữu ích để giới hạn hoặc chặn rủi ro không cho biến số vượt quá một mức nào đó.
// Nếu lợi nhuận (Profit) bị âm thì gán bằng 0 (Không cho âm) LoiNhuanThucTe = Max( Profit, 0 ); // So sánh xem Giá Mở cửa hay Đóng cửa lớn hơn để vẽ thân nến DauThanNen = Max( C, O );
Random() Toán học
Tạo ra một số ngẫu nhiên. Mặc dù ít dùng trong giao dịch, nhưng lại là hàm "chén thánh" để giới Quant Trading kiểm tra mô hình Monte Carlo: Trộn ngẫu nhiên các lệnh giao dịch để xem hệ thống có thực sự thắng hay chỉ do may mắn.
// Giả lập hệ thống mua ngẫu nhiên (Nhắm mắt mua bừa) // So sánh với hệ thống thực tế xem có tốt hơn không Buy = Random() > 0.8; // 20% xác suất xuất hiện điểm Mua
StrFind() Chuỗi Text
Tìm kiếm một chuỗi con bên trong chuỗi lớn. Nếu tìm thấy, trả về vị trí của chữ đó (từ 1 trở lên), nếu không thấy trả về 0. Rất hay dùng để lọc mã ngành bằng Text.
// Tên đầy đủ: "Ngan hang TMCP Ngoai Thuong VN" TenCty = FullName(); // Bộ lọc: Chỉ mua các mã mà Tên công ty có chữ "Ngan hang" Filter = Buy AND StrFind( TenCty, "Ngan hang" ) > 0;
StrReplace() Chuỗi Text
Tìm và thay thế toàn bộ từ cũ bằng từ mới trong một câu. Chuyên dùng để làm sạch dữ liệu Tên công ty hoặc xóa các ký tự thừa thãi.
// Ví dụ: Xóa chữ "CTCP" ra khỏi tên cho gọn TenGoc = "CTCP FPT"; TenMoi = StrReplace( TenGoc, "CTCP ", "" ); Title = "Doanh nghiep: " + TenMoi; // In ra: "Doanh nghiep: FPT"
StrFormat() Chuỗi Text
Hàm định dạng Text quyền lực nhất (Giống lệnh printf trong C++). Nó cho phép bạn nhúng các biến số vào trong câu một cách siêu gọn gàng, có thể giới hạn số chữ số thập phân.
// In câu có số: %g (Số tự nhiên), %.2f (Làm tròn 2 chữ số) CauChao = StrFormat("Ma %g co gia: %.2f VND", Name(), C); GfxTextOut( CauChao, 10, 10 );
StrExtract() Chuỗi Text
Trích xuất (cắt) từng phần của một chuỗi đang bị ngăn cách bởi dấu phẩy (hoặc ký tự tự chọn). Đây là "chén thánh" để hệ thống tự động đọc và hiểu cấu trúc của một File Excel CSV (File tín hiệu).
// Giả sử bạn đọc 1 dòng từ file text: "FPT,MUA,95000" DongDuLieu = "FPT,MUA,95000"; // Cắt khúc số 0, 1, 2 cách nhau bởi dấu phẩy MaCoPhieu = StrExtract( DongDuLieu, 0 ); // FPT Lenh = StrExtract( DongDuLieu, 1 ); // MUA Gia = StrExtract( DongDuLieu, 2 ); // 95000
StrLen() Chuỗi Text
Đếm tổng số ký tự của một đoạn văn bản. Dùng để làm vòng lặp quét qua từng chữ cái hoặc để căn chỉnh lề (Cắt bớt chữ nếu Tên công ty quá dài vượt khỏi khung vẽ Gfx).
// Đếm độ dài tên công ty DoDai = StrLen( FullName() ); // Cảnh báo nếu tên dài quá 50 ký tự if( DoDai > 50 ) Title = "Ten cong ty nay qua dai!";
StrLeft() & StrRight() Chuỗi Text
Lấy N ký tự từ bên Trái qua (hoặc bên Phải qua). Chuyên dùng để phân loại tiền tố/hậu tố của Ticker cổ phiếu.
// Lọc Chứng quyền có mã bắt đầu bằng "C" (Ví dụ: CFPT2101) ChuDauTien = StrLeft( Name(), 1 ); // Lọc Phái sinh có đuôi hợp đồng "1M" (Ví dụ: VN30F2101M) ChuCuoiCung = StrRight( Name(), 2 ); Filter = ChuDauTien != "C"; // Loại bỏ toàn bộ chứng quyền
StrMid() Chuỗi Text
Cắt một đoạn chữ nằm ở giữa chuỗi (Tính từ vị trí start và lấy N ký tự). Rất hữu hiệu để tách lấy các con số nằm giấu giữa tên Ticker (như mã Phái sinh).
// Mã phái sinh VN30F2309 // Lấy năm và tháng đáo hạn (Tính từ vị trí số 5, lấy 4 ký tự "2309") KyHan = StrMid( Name(), 5, 4 );
StrToUpper() & StrToLower() Chuỗi Text
Ép biến toàn bộ đoạn Text thành IN HOA hoặc viết thường. Việc này cực kỳ quan trọng để "Chống ngu" cho hệ thống so sánh chữ (Tránh lỗi phân biệt hoa/thường gây sai lệnh lọc).
// Ép mọi tên gõ vào thành IN HOA trước khi so sánh TenMa = StrToUpper( Name() ); // Đảm bảo lọc đúng chữ FPT dù khách hàng có gõ fpt hay Fpt Filter = TenMa == "FPT";
StrTrim() Chuỗi Text
Cắt bỏ các ký tự dư thừa (như Dấu cách hoặc dấu chấm) nằm ở 2 đầu của câu. Dữ liệu tài chính nhập vào thường hay bị dư các dấu cách trống ở cuối câu gây lỗi công thức, StrTrim sẽ dọn dẹp nó.
// Chuỗi bị lỗi dư dấu cách ở 2 đầu: " VNINDEX " LoiTen = " VNINDEX "; // Xóa sạch dấu cách (Space) thừa TenChuan = StrTrim( LoiTen, " " ); // Kết quả: "VNINDEX"
DateTimeToStr() Chuỗi Text
Chuyển đổi số liệu Ngày tháng (Dạng máy tính hiểu) sang dạng Chữ (Text con người đọc được). Rất cần thiết khi bạn muốn in ngày tháng sinh tín hiệu Buy/Sell ra bảng lọc Explore.
// Lọc mã mua Filter = Buy; // In cột "Ngày báo mua" rõ ràng ra chữ NgayInRa = DateTimeToStr( DateTime() ); AddTextColumn( NgayInRa, "Ngay Bao Mua", 1.0 );
fopen() File
Mở một file trên máy tính Windows. Các chế độ (mode): "r" (Chỉ đọc), "w" (Ghi đè - xóa cũ), "a" (Append - Viết nối tiếp vào cuối file). Đây là lệnh mở cửa để thoát khỏi phần mềm.
// Mở file để viết thêm lệnh bắn tín hiệu Auto Trading fh = fopen( "C:\\AutoTrade\\Signals.txt", "a" );
fclose() File
Đóng file lại để lưu. CỰC KỲ QUAN TRỌNG! Nếu bạn dùng `fopen` mà quên `fclose`, hệ thống Windows sẽ treo file đó (không cho phần mềm khác đọc) và gây tràn RAM sập AmiBroker.
// Mở file -> Ghi -> Đóng liền tay fh = fopen( "C:\\log.txt", "a" ); if( fh ) { fputs( "Kiem tra OK!", fh ); fclose( fh ); // Khóa van lưu lại }
fputs() File
Đổ văn bản (chuỗi) vào trong file vừa mở. Đây chính là cách các thuật toán Auto Trade của các môi giới bắn lệnh sang bảng điện: Cứ Mua là xuất lệnh ghi vào file Text để Bot đọc.
// Nếu có điểm mua, ghi lệnh ra file Text if( LastValue( Buy ) ) { fh = fopen( "C:\\Bot\\Lenh.txt", "a" ); if( fh ) { // Ghi: Mã phái sinh, lệnh LONG, số lượng 10 fputs( "VN30F1M,LONG,10\n", fh ); fclose( fh ); } }
fgets() File
Đọc từng dòng văn bản bên trong File Text lên AmiBroker. Mỗi lần gọi hàm là nó sẽ đọc 1 dòng, gọi tiếp nó sẽ tự nhảy xuống đọc dòng dưới. Rất mạnh để tải dữ liệu danh sách mã cấm mua.
// Đọc dòng chữ đầu tiên trong file Note fh = fopen( "C:\\Blacklist.txt", "r" ); if( fh ) { DongMot = fgets( fh ); printf( "Ma cam mua: " + DongMot ); fclose( fh ); }
feof() File
End Of File (Kiểm tra xem đã đọc tới cuối file chưa). Trả về True nếu con trỏ đọc đã chạm đáy file. Thường kết hợp với vòng lặp While để quét hết một file Excel từ trên xuống dưới mà không bị treo.
// Đọc liên tục đến khi hết file thì dừng fh = fopen( "C:\\Data.txt", "r" ); if( fh ) { while( ! feof( fh ) ) { DongHienTai = fgets( fh ); } fclose( fh ); }
fdelete() File
Ra lệnh cho Windows xóa thẳng một tập tin. Thường dùng trong Auto-Trading: Phần mềm đọc xong lệnh Mua/Bán từ File sẽ dùng fdelete để xóa rỗng file đó đi, chờ ghi lệnh mới của ngày mai.
// Xóa sạch file lịch sử lệnh cũ trước khi chạy phiên mới if( TimeNum() == 084500 ) { fdelete( "C:\\Bot\\LenhHomQua.txt" ); }
fmkdir() & frmdir() File
Make Directory / Remove Directory. Yêu cầu Windows tự động tạo ra một thư mục (Folder) mới hoặc xóa thư mục. Rất ngầu khi bạn muốn hệ thống code tự động phân loại tạo thư mục xuất báo cáo riêng cho từng Tháng/Năm.
// Tự động tạo Folder báo cáo mang tên năm hiện tại ThuMucMoi = "C:\\BaoCao_" + Year(); fmkdir( ThuMucMoi );
fgetstatus() File
Lấy thông tin siêu dữ liệu (Metadata) của một File mà không cần mở nó. Có thể check xem File này nặng bao nhiêu Megabyte, tạo ra ngày nào, hoặc chỉnh sửa lần cuối lúc mấy giờ.
// Kiem tra dung luong file du lieu xem co cap nhat chua // what=1 la lay size cua file DungLuongFile = fgetstatus( "C:\\Data.csv", 1 ); if( DungLuongFile > 0 ) Title = "Du lieu da san sang!";
ftell() File
Trả về vị trí byte hiện tại của con trỏ chuột bên trong File. Công cụ chuyên dùng cho các thuật toán đọc các File nhị phân khổng lồ (Cơ sở dữ liệu giá Tick by Tick).
// Xem con trỏ chuột đang đọc tới Byte số mấy fh = fopen("C:\\BigData.txt", "r"); if( fh ) { fgets( fh ); // Đọc thử dòng 1 ViTriHienTai = ftell( fh ); fclose(fh); }
fseek() File
Dịch chuyển con trỏ chuột nhảy thẳng đến vị trí Byte mong muốn bên trong file. Chống lãng phí RAM thay vì phải quét đọc từng dòng từ đầu đến cuối.
// Nhảy thẳng đến giữa file (bỏ qua phần đầu) fh = fopen("C:\\BigData.txt", "r"); if( fh ) { // Nhảy đi 1024 bytes tính từ điểm bắt đầu (origin=0) fseek( fh, 1024, 0 ); fclose(fh); }
CategoryAddSymbol() Danh mục
Tự động thêm cổ phiếu vào danh sách. Hàm cực kỳ quyền lực trong Explore: Nếu cổ phiếu thỏa mãn điểm Mua, phần mềm sẽ tự động nhét mã đó vào Watchlist bạn chỉ định mà không cần click chuột thủ công.
// Lọc điểm mua vượt đỉnh lịch sử Buy = C == Highest( H ); // Nếu có điểm Mua, tự động thêm mã này vào Watchlist số 1 (Siêu Cổ) if( LastValue( Buy ) ) { CategoryAddSymbol( Name(), categoryWatchlist, 1 ); }
CategoryRemoveSymbol() Danh mục
Tự động loại bỏ cổ phiếu. Hoạt động ngược lại với AddSymbol. Thường dùng vào cuối ngày để "tỉa cỏ": Quét toàn bộ Watchlist Siêu Cổ, mã nào gãy Trend (Bán) thì tự động đuổi ra khỏi danh sách.
// Nếu giá rơi thủng MA50 (Báo động đỏ) Sell = Cross( MA(C, 50), C ); // Xóa ngay mã này khỏi Watchlist số 1 if( LastValue( Sell ) ) { CategoryRemoveSymbol( Name(), categoryWatchlist, 1 ); }
CategoryGetSymbols() Danh mục
Lấy ra một chuỗi Text dài ngoằng chứa TẤT CẢ các mã cổ phiếu đang nằm trong một Danh mục (cách nhau bởi dấu phẩy). Dùng để code hệ thống quyét liên mã (Ví dụ: Tính tổng khối lượng giao dịch của cả ngành Ngân hàng).
// Lấy toàn bộ mã thuộc Watchlist số 2 DanhSachMa = CategoryGetSymbols( categoryWatchlist, 2 ); // In ra màn hình: "FPT, MWG, PNJ, REE..." Title = "Cac ma trong list: " + DanhSachMa;
CategorySetName() Danh mục
Tự động đổi tên một Watchlist hoặc Group. Giúp phân loại danh mục một cách động. Bạn có thể code để đầu tháng hệ thống tự động tạo và đổi tên Watchlist thành "DanhMuc_Thang10".
// Đổi tên Watchlist số 10 thành "Mua Gom Tích Sản" CategorySetName( "Mua Gom Tich San", categoryWatchlist, 10 );
CategoryFind() Danh mục
Tìm kiếm ID của một Nhóm/Ngành bằng Tên của nó. Rất hữu ích khi bạn không nhớ "Ngành Thép" là ID số mấy, bạn chỉ cần ném chữ "Thép" vào hàm này, nó sẽ trả về số ID để bạn dùng cho các bộ lọc khác.
// Tìm xem Watchlist mang tên "VN30" đang nằm ở vị trí số mấy ViTriVN30 = CategoryFind( "VN30", categoryWatchlist ); // Nếu tìm thấy (ID >= 0) thì báo Mua các mã trong đó Filter = Buy AND InWatchList( ViTriVN30 );
GroupID() & MarketID() Danh mục
Lấy ID Nhóm hoặc Thị trường của cổ phiếu hiện tại. Tại Việt Nam, Market thường được chia thành 3 sàn: HOSE, HNX, UPCOM. Dùng hàm này để lọc bỏ các mã UPCOM biên độ 15% quá rủi ro ra khỏi danh mục đánh T+.
// Giả sử bạn quy định Market 1 là HOSE, 2 là HNX, 3 là UPCOM SanGiaoDich = MarketID(); // Lọc điểm mua nhưng cấm mua hàng UPCOM (Sàn 3) Filter = Buy AND SanGiaoDich != 3;
IsIndex() Danh mục
Kiểm tra xem Ticker hiện tại là một cổ phiếu hay là một Chỉ số (VNINDEX, VN30). Nếu là chỉ số sẽ trả về True. Rất tốt để bẫy lỗi, tránh việc hệ thống nhầm lẫn đè VNINDEX ra báo Mua/Bán như một cổ phiếu bình thường.
// Bộ lọc xuất điểm mua mọi cổ phiếu // NHƯNG loại trừ các chỉ số thị trường chung Filter = Buy AND NOT IsIndex();
GetBaseIndex() Danh mục
Lấy mã Chỉ số cơ sở (Base Index) được gắn với cổ phiếu hiện tại. AmiBroker cho phép gán mỗi cổ phiếu với một thị trường chung (VD FPT gán với VNINDEX). Hàm này trả về chữ "VNINDEX" để bạn tính toán tương quan Beta cực chuẩn.
// Tự động lấy tên chỉ số đại diện của mã này TenChiSo = GetBaseIndex(); // Lấy giá trị của chỉ số đó để so sánh RS GiaThiTruongChung = Foreign( TenChiSo, "C" ); SucManhRS = C / GiaThiTruongChung;
SetBaseIndex() Danh mục
Bắt ép ghi đè chỉ số cơ sở bằng Code thay vì dùng chuột chỉnh trong mục Information. Hàm này ép hệ thống tính Beta hoặc so sánh chuẩn với mã bạn chỉ định (VD ép tất cả so sánh với VN30 thay vì VNINDEX).
// Ép mọi biểu đồ Relative Performance so sánh với VN30 SetBaseIndex( "VN30" ); // Khi dùng các công cụ tính Beta tích hợp sẵn, nó sẽ lấy VN30 làm mốc
InList() Danh mục
(Hàm tự viết mô phỏng). Mặc dù AmiBroker không có sẵn `InList` (chỉ có `InWatchList`), các Coder thường tự viết một chuỗi kiểm tra `StrFind` để ép lọc điểm Mua chỉ trên đúng 3-4 mã họ quan tâm (Ví dụ đánh đúng bộ 3 Bank - Chứng - Thép).
// Chỉ muốn lọc tín hiệu Mua đối với 3 mã này MaQuanTam = ",FPT,MWG,PNJ,"; NamTrongList = StrFind( MaQuanTam, "," + Name() + "," ) > 0; Filter = Buy AND NamTrongList;
Matrix() Ma trận
Khởi tạo một Ma Trận (Mảng 2 chiều). Dành riêng cho dân Quant Trading! Thay vì một đường thẳng chứa các giá trị, Ma trận là một bảng chứa hàng và cột (Giống Excel) nằm gọn trong RAM để tính toán số liệu của 500 cổ phiếu cùng một lúc.
// Tạo một bảng số liệu rỗng gồm 10 hàng và 5 cột, điền sẵn số 0 BangDuLieu = Matrix( 10, 5, 0 );
mxIdentity() Ma trận
Tạo Ma trận Đơn vị (Identity Matrix). Đây là ma trận vuông có đường chéo chính là số 1, còn lại là 0. Nó tương đương với số "1" trong đại số thông thường, dùng làm mốc để nhân/chia các ma trận khác trong học máy (Machine Learning).
// Tạo ma trận vuông đơn vị 3x3 MaTranDonVi = mxIdentity( 3 );
mxTranspose() Ma trận
Chuyển vị Ma Trận. Biến hàng thành cột và biến cột thành hàng. Rất quan trọng khi bạn muốn xoay dọc một bảng số liệu ngang để nhân với một bảng dữ liệu Cổ phiếu khác.
// MaTranA có 3 hàng 5 cột (3x5) // Sau khi Transpose sẽ biến thành Ma trận 5 hàng 3 cột (5x3) MaTranXoay = mxTranspose( MaTranA );
mxMultiply() Ma trận
Nhân 2 Ma trận với nhau (Toán học tuyến tính cao cấp). Dùng để áp dụng một bộ "Trọng số" (Weights) vào bảng dữ liệu hàng trăm điểm mua của các cổ phiếu để chấm điểm AI (Trí tuệ nhân tạo) trực tiếp trên AmiBroker.
// Nhân bảng dữ liệu đầu vào (Input) với bảng Trọng số (Weights) // Kết quả trả về bảng Chấm điểm rủi ro (Output) của AI DiemSoAI = mxMultiply( BangInput, BangTrongSo );
mxInverse() Ma trận
Nghịch đảo Ma trận. Trong toán ma trận không có phép chia, thay vào đó bạn phải nhân với Ma trận nghịch đảo. Hàm này dùng để giải các phương trình cân bằng danh mục (Portfolio Optimization) theo thuyết Markowitz.
// Tìm ma trận nghịch đảo của bảng Hiệp phương sai rủi ro BangNghichDao = mxInverse( BangCovariance );
mxSolve() Ma trận
Giải hệ phương trình tuyến tính A * X = B cực nhanh. Thay vì code vòng lặp giải toán mất hàng phút, mxSolve dùng thuật toán C++ để giải quyết hàng trăm biến số chỉ trong 1 mili-giây. "Vũ khí" để tối ưu hóa tỷ trọng vốn cho từng mã.
// Giải hệ phương trình rủi ro để tìm mảng Tỷ trọng vốn (X) tối ưu nhất TyTrongVon = mxSolve( MaTranRuiRo, MaTranLoiNhuan );
mxGetSize() Ma trận
Kiểm tra kích thước của Ma trận. Dim = 0 là lấy số Hàng, Dim = 1 là lấy số Cột. Rất cần thiết để cấu hình giới hạn (Limit) cho các vòng lặp quét qua bảng dữ liệu để không bị lỗi tràn RAM.
// Lấy số hàng và số cột của bảng Dữ liệu SoHang = mxGetSize( BangDuLieu, 0 ); SoCot = mxGetSize( BangDuLieu, 1 );
mxGetBlock() Ma trận
Cắt lấy một khối nhỏ (Sub-matrix) từ một bảng Ma trận khổng lồ. Rất hữu ích khi bạn có dữ liệu toàn thị trường nhưng chỉ muốn bóc tách ra dữ liệu của 10 mã ngành Ngân hàng để tính toán riêng.
// Cắt lấy khối dữ liệu từ Hàng 1 đến 5, và Cột 1 đến 3 BangDuLieuNho = mxGetBlock( BangTong, 1, 1, 5, 3 );
mxSetBlock() Ma trận
Ghép một Ma trận nhỏ vào trong một Ma trận lớn (Dán đè lên). Dùng để tổng hợp dữ liệu: Sau khi tính toán riêng lẻ từng nhóm ngành, bạn dán kết quả của chúng vào chung một Bảng Tổng để xuất báo cáo File.
// Đưa bảng Dữ liệu Nhỏ (block) chèn vào Bảng Tổng // Bắt đầu chèn từ tọa độ Hàng 10, Cột 0 mxSetBlock( BangTong, BangDuLieuNho, 10, 0 );
mxToString() Ma trận
Biến toàn bộ bảng Ma trận Toán học khó hiểu thành một chuỗi Văn bản (Text) siêu đẹp mắt. Đây là cầu nối hoàn hảo để bạn lấy kết quả Quant Trading in lên màn hình (bằng GfxTextOut) hoặc xuất ra file Excel bằng hàm fputs.
// Chuyển kết quả tính toán thành chuỗi có format gọn gàng ChuoiKetQua = mxToString( MaTranRuiRo ); printf( "Day la bang rui ro:\n" + ChuoiKetQua );
if... else Vòng lặp
Cấu trúc rẽ nhánh kinh điển. "NẾU điều này đúng THÌ làm việc A, CÒN KHÔNG thì làm việc B". Lưu ý trong AmiBroker, if chỉ hoạt động với biến đơn (mỗi lần 1 giá trị), không hoạt động trực tiếp với mảng giá trị (Array) trên toàn bộ Chart.
// Nếu Vốn lớn hơn 1 Tỷ thì mua 5 mã, nhỏ hơn thì mua 3 mã VonHienTai = 1500000000; if( VonHienTai >= 1000000000 ) { SetOption("MaxOpenPositions", 5); } else { SetOption("MaxOpenPositions", 3); }
for Vòng lặp
Vòng lặp "Tối thượng". Cho phép bạn quét qua TỪNG CÂY NẾN MỘT trên biểu đồ từ quá khứ đến hiện tại để xử lý các logic siêu phức tạp (như vẽ Fibonacci, đếm sóng, hoặc dời Stoploss thủ công) mà các hàm Array có sẵn không làm được.
// Tính tổng Volume của toàn bộ các nến trên Chart TongVol = 0; for( i = 0; i < BarCount; i++ ) { TongVol = TongVol + V[i]; // Cộng dồn Vol từng nến vào tổng }
while Vòng lặp
Vòng lặp "Chờ đợi". Hệ thống sẽ liên tục làm một việc LẶP ĐI LẶP LẠI chừng nào mà điều kiện vẫn còn đang Đúng. Cực kỳ phổ biến để dùng đọc File Text: "Chừng nào chưa đọc đến cuối file (feof) thì cứ tiếp tục đọc dòng tiếp theo".
// Đọc File Text từ trên xuống dưới fh = fopen( "C:\\DanhSach.txt", "r" ); if( fh ) { // Trong khi chưa tới cuối file thì cứ lặp tiếp while( ! feof( fh ) ) { DongHienTai = fgets( fh ); } fclose( fh ); }
do... while Vòng lặp
Biến thể của While. Khác biệt ở chỗ: Nó sẽ nhắm mắt "Làm thử" việc đó ít nhất 1 lần đầu tiên, rồi sau đó mới kiểm tra Điều kiện xem có nên lặp tiếp hay không. Rất hay dùng để bẫy lỗi các hàm bắt buộc phải chạy 1 lần.
// Biến đếm x x = 0; do { x = x + 1; // Luôn chạy dòng này lần đầu tiên dù x là bao nhiêu } while( x < 5 );
switch... case Vòng lặp
Hộp điều phối luồng logic (Ngã tư đường). Thay vì viết hàng chục dòng "if... else if... else if" nhìn rất rối mắt, cấu trúc Switch cho phép bạn bắt các trường hợp Giá trị một cách cực kỳ gọn gàng và thẩm mỹ.
// Tùy thuộc vào Tháng hiện tại để hiển thị thông báo Mùa vụ switch( Month() ) { case 1: Title = "Thang 1: Mua KQKD Quy 4"; break; case 5: Title = "Thang 5: Sell in May!"; break; case 12: Title = "Thang 12: Chot NAV cuoi nam"; break; default: Title = "Thang binh thuong"; }
break Vòng lặp
Phanh khẩn cấp. Lệnh này ép hệ thống phải lập tức Thoát Ngay khỏi vòng lặp For/While hiện tại dù điều kiện lặp vẫn còn đúng. Thường dùng khi đã tìm thấy thứ cần tìm, không muốn lãng phí RAM chạy tìm tiếp nữa.
// Quét ngược từ nến cuối cùng về quá khứ để tìm Phiên Trần gần nhất for( i = BarCount - 1; i >= 0; i-- ) { if( C[i] == H[i] AND C[i] > Ref(C,-1)[i] * 1.065 ) { ViTriTran = i; break; // Đã tìm thấy thì thoát vòng lặp ngay lập tức! } }
continue Vòng lặp
Lệnh Bỏ Qua (Skip). Khi gặp lệnh này, vòng lặp For/While sẽ bỏ qua toàn bộ code bên dưới nó, lập tức nhảy sang vòng lặp tiếp theo. Dùng để bẫy lỗi các dữ liệu bị Rỗng (Null) hoặc các nến nghỉ lễ để tránh treo máy.
// Quét dữ liệu 100 nến for( i = 1; i < 100; i++ ) { // Nếu Vol = 0 (Nến nghỉ lễ/Không giao dịch) thì bỏ qua, ko tính if( V[i] == 0 ) continue; TongTien = TongTien + (C[i] * V[i]); }
function ... return Vòng lặp
Khai sinh Hàm Tùy Chỉnh (Custom Function). Đây là nấc thang cao nhất của Coder. Bạn có thể tự đóng gói một tổ hợp công thức siêu dài của riêng mình thành 1 hàm ngắn gọn mang tên bạn, và gọi nó ra dùng lại ở hàng trăm Chart khác nhau.
// Tự tạo một Hàm tính Trung bình đặc biệt của riêng bạn function MA_SieuMien( mangDuLieu, chuKy ) { tam = EMA( mangDuLieu, chuKy ) * 1.5; return tam / 2; // Trả kết quả ra ngoài } // Bắt đầu gọi Hàm riêng ra dùng GiaTriCuaToi = MA_SieuMien( C, 20 );
procedure Vòng lặp
Thủ tục (Procedure) là một biến thể của Function. Khác biệt lớn nhất là Thủ tục thực thi hàng loạt các hành động (Vẽ nến, In bảng, Ghi File) NHƯNG không bao giờ dùng lệnh return để trả về mảng dữ liệu. Chuyên dùng để đóng gói hệ thống Dashboard Gfx.
// Đóng gói lệnh vẽ Bảng Cảnh Báo góc màn hình procedure VeBangCanhBao( MauNen ) { GfxSetOverlayMode(1); GfxSelectSolidBrush( MauNen ); GfxRoundRect(10, 10, 200, 100, 5, 5); } // Gọi thủ tục chạy thử VeBangCanhBao( colorRed );
global & local Vòng lặp
Quy định Vùng Phủ Sóng của biến (Scope). Khi bạn dùng biến local, nó chỉ tồn tại bên trong Hàm đó và biến mất khi Hàm chạy xong (Tiết kiệm RAM). Biến global thì tồn tại xuyên suốt từ đầu đến cuối đoạn code, dùng để truyền dữ liệu đi khắp nơi.
// Khai báo biến Toàn cục (Có thể bị gọi ở bất cứ đâu) global HeSoRuiRo; HeSoRuiRo = 1.5; function TinhStopLoss( GiaMua ) { // Biến Cục bộ (Chỉ sống bên trong cái ngoặc nhọn này) local KhoangCach; KhoangCach = 2 * HeSoRuiRo; return GiaMua - KhoangCach; }
Không tìm thấy hàm AFL nào phù hợp với từ khóa của bạn.