Kinh nghiệm xử lý điều kiện lọc cổ phiếu
Hôm nay mình sẽ giới thiệu và giải thích một số hàm hay dùng để xử lý bộ lọc cổ phiếu trong Amibroker. Khi code trên Amibroker người lập trình nên có tư duy về xử lý với mảng, hạn chế dùng vòng lặp để xử lý vì sẽ làm chậm hệ thống và code cũng sẽ rất dài và khó hiểu hơn, chỉ sử dụng vòng lặp khi thật cần thiết. Trước khi tiến hành code điều kiện nào đó nên tìm trong phần help đã có hàm sẵn hay không.
If-else: Phân biệt với IIF và WriteIf
Hàm điều kiện if else sẽ xử lý với từng phần tử trong mảng do đó kết quả trả về sẽ là một phần tử. Hàm if không xử lý trực tiếp cho mảng được.
if( array[ BarCount - 1 ] > 0 )
{
// xử lý
}
Hàm IIF (ImmediateIf) làm hàm xử lý điều kiện tương tự như if nhưng nó xử lý so sánh điều kiện và trả về kết quả là một mảng số. Trong code xây dựng bộ lọc cổ phiếu hàm IIF sẽ được sử dụng khá nhiều.
Lưu ý hàm IIF sẽ bị lỗi nếu đưa vào mảng kiểu chuỗi.
Nếu muốn xử lý điều kiện để trả kết quả về kiểu chuỗi (string) thì ta dùng hàm WriteIf
IIf( Điều kiện, Mảng số nếu đúng, Mảng số nếu sai)
WriteIf( Điều kiện, Chuỗi nếu đúng, Chuỗi nếu sai)
Ref: lấy giá trị quá khứ / tương lai của 1 mảng
Ref( Mảng, phiên)
//Lấy giá đóng cửa phiên trước
Ref( C, -1)
//Lấy giá đóng cửa của 5 phiên trước
Ref( C, -5)
ValueWhen: Lấy giá trị một mảng khi thoả điều kiện
ValueWhen(Điều kiện, mảng)
//Ví dụ: lấy giá cao nhất tại điểm bùng nổ
DiemNo =
Close>Open //Gia dong cua lon hon gia mo cua
AND
Close >= 1.02 * Ref(Close,-1) //Gia tang 2%
AND
Volume*Close >1.2*Ref(Volume*Close,-1) //Gia Tri tang 20%
;
DiemnoHigh = ValueWhen(DiemNo,H);
BarIndex: trả về vị trí của phiên giao dịch
Ví dụ tính số phiên (bar) giao dịch từ nến có Điểm Nổ đến bar đang xử lý
SoPhienGD = BarIndex() - ValueWhen(DiemNo , BarIndex());
BarsSince: Tính số phiên giao dịch từ điểm thoả điều kiện
SoPhienGD = BarsSince(DiemNo);
SetForeign: Xử lý với dữ liệu giao dịch của mã chứng khoán khác
SetForeign("VN30",True,True);
//Xử lý với dữ liệu giao dịch của chỉ số VN30
RestorePriceArrays();
Lấy giá trị lớn nhất / bé nhất trong mảng (HHV LLV)
//Lấy giá trị lớn nhất
HHV( Mảng, chu kỳ)
//Lấy giá trị bé nhất
LLV( Mảng, chu kỳ)
//Lấy giá lớn nhất 5 phiên
GiaVuot1W = Close>Ref(HHV(High,5),-1);
//Lấy giá bé nhất 5 phiên
GiaThap1W = Close<Ref(LLV(Low,5),-1);
So sánh 2 mảng (Min Max)
//Lấy mảng lớn hơn
Max( Mảng 1, Mảng 2 )
//Lấy mảng nhỏ hơn
Min( Mảng 1, Mảng 2)
Cross: Kiểm tra điểm cắt nhau giữa 2 đường
Cross( Đường 1, Đường 2)
//Kiểm tra điểm cắt giữa 2 đường MA20 và MA50
DiemCat = Cross(MA(C,20),MA(C,50));
Lưu ý: Cross(MA(C,20),MA(C,50)) sẽ khác với Cross(MA(C,50),MA(C,20))
Cross(MA(C,20),MA(C,50)): đường MA20 sẽ nằm trên MA50 và ngược lại
Sum: Tính tổng giá trị thoả điều kiện trong 1 chu kỳ
Sum( Mảng, chu kỳ)
//Tính tổng khối lượng khớp lệnh trong 5 ngày
Sum( V, 5)
//Tính tổng phiên tăng giá trong 10 ngày
Sum( C>Ref(C,-1), 10)
//Lưu ý: trong Amibroker giá trị True tương đương 1, False tương đương 0
ExRem: Loại bỏ tín hiệu trùng lắp
ExRem( Mảng 1, Mảng 2)
//Loại bỏ tín hiệu mua liên tục cho tới khi có tín hiệu bán và ngược lại
buy = ExRem( buy, sell );
sell = ExRem( sell, buy );
Kiểm tra giá giao dịch có hở Gap không
//Kiểm tra tăng hở Gap
GapUp()
//Kiểm tra giảm hở Gap
Gapdown()
Inside: Kiểm tra nến trong nến
//Kiểm tra nến biến động trong nến hôm qua
Inside()
//Kiểm tra nến biến động ngoài nến hôm qua
outside()