trungnghia
Moderator
Dù đối với đa số VCers Amibroker không không còn mới mẻ, việc sử dụng Amibroker, code trong Amibroker và cả việc lọc cổ phiếu không là vấn đề gì! Tuy nhiên, vẫn có một số bạn có ý tưởng nhưng không biết cách ứng dụng trong Amibroker để lọc cổ phiếu cho mình. Nhân có câu hỏi về vấn đề này, tôi trình bày một cách đơn giản để dùng Scan hoặc Explorer (trong AutoAnalysis của Amibroker) để lọc cổ phiếu.
I. Dùng Scan:
1. Thành phần tối thiểu:
Có thể lọc bằng Scan với cấu trúc code đơn giản nhất, gồm một hay nhiều dòng trong các dòng sau đây:
Buy = <điều kiện 1>;
Sell = <điều kiện 2>;
Short = <điều kiện 3>;
Cover = <điều kiện 4>;
Các thành phần trong cặp ngoặc nhọn <điều kiện> là biểu thức lôgích theo cú pháp code được Amibroker quy định.
2. Thí dụ:
a. Một thí dụ đơn giản nhất:
Buy = Close> MA(Close, 200);
hoặc:
Buy = Cross(EMA(C,13), MA(C,21)) AND V>50000;
Cũng với ý tưởng trên, đoạn code có thể được sử dụng phức tạp hơn (nhằm tạo được nhiều tùy chọn hơn khi sử dụng):
//Long MA
P = ParamField("Price field",-1);
Periods = Param("Periods", 100, 2, 400, 1 );
Buy = Close> MA( P, Periods );
b. Thí dụ dùng nhiều lệnh điều kiện với điều kiện phức tạp :
r1 = Param("Fast avg", 12, 2, 200, 1);
r2 = Param("Slow avg", 26, 2, 200, 1);
r3 = Param("Signal avg", 9, 2, 200, 1);
ml = MACD(r1, r2);
sl = Signal(r1, r2, r3);
Buy=Cross(ml, sl);
Sell = Cross(sl, ml);
hay:
LongMA = EMA(C, Param("Long Period", 50, 30, 100, 5));
ShortMA = EMA(C, Param("Short Period", 5, 3, 50, 1));
Buy = Cross(ShortMA, LongMA );
Sell = Cross(LongMA, ShortMA );
3. Kết quả:
Với:
Buy = Close> MA(Close, 200);
Có kết quả:
Ticker,Trade,Date,Close,
AGF,Buy,2015/04/10,20.7000
BBC,Buy,2015/04/10,57.0000
BIC,Buy,2015/04/10,16.9000
BID,Buy,2015/04/10,19.0000
BMI,Buy,2015/04/10,17.3000
BMP,Buy,2015/04/10,81.0000
...
Với:
Buy = Cross(EMA(C,13), MA(C,21)) AND V>50000;
Kết quả nhận được:
Ticker,Trade,Date,Close,
BSI,Buy,2015/04/10,11.0000
JVC,Buy,2015/04/10,21.7000
VHC,Buy,2015/04/10,40.2000
VIS,Buy,2015/04/10,7.7000
Còn với:
LongMA = EMA(C, Param("Long Period", 50, 30, 100, 5));
ShortMA = EMA(C, Param("Short Period", 5, 3, 50, 1));
Buy = Cross(ShortMA, LongMA );
Sell = Cross(LongMA, ShortMA );
Kết quả sẽ có:
Ticker,Trade,Date,Close,
ABT,Sell,2015/04/10,51.0000
BCI,Sell,2015/04/10,20.8000
CYC,Buy,2015/04/10,3.9000
DQC,Buy,2015/04/10,57.5000
GTA,Buy,2015/04/10,16.0000
...
4. Thành phần kết quả được xuất ra có điểm chung: Gồm các cột mặc định: Ticker, Trade, Date và Close
II. Dùng Explorer:
Để dùng Explorer, trong code không dùng các dòng lệnh với Buy, Sell, Short hay Cover mà dùng Filter:
Filter = <điều kiện>;
<điều kiện> cũng là biểu thức lôgích.
Explorer đi kèm với tối thiểu 1 lệnh khai báo cột thông tin xuất ra và cho phép xuất ra các cột dữ liệu như ý muốn. Để xuất ra các cột thông tin, thường có thể dùng thêm các câu lệnh: AddColumn (được dùng xuất dữ liệu số) hoặc AddTextColumn (được dùng xuất dữ liệu chuỗi - text).
AddColumn(<Tên Dữ liệu>,<Tên cột>,<format>);
<Tên Dữ liệu> - Biến hoặc các biểu thức chứa dữ liệu dạng số muốn xuất ra.
<Tên cột> - Tiêu đề của cột sẽ được hiển thị.
<format> - dạng dữ liệu được xuất ra
AddTextColumn(<Tên Dữ liệu>,<Tên cột>);
Thí dụ:
Filter = Cross(EMA(C, 13), MA(C,21)) AND V>50000;
AddColumn(EMA(C, 13),"EMA-13",1.2);
AddColumn(MA(C, 21),"MA-21",1.2);
AddColumn(Ref(C, -4),"Close-4",1.2);
AddColumn(C,"Close",1.2);
Kết quả xuất ra:
Ticker,Date/Time,EMA-13,MA-21,Close-4,Close,
BIC,2015/04/09,16.06,16.02,15.80,17.20
BID,2015/04/08,17.91,17.88,17.90,18.50
BSI,2015/04/10,10.81,10.81,10.50,11.00
CCL,2015/04/09,4.04,4.03,4.00,4.10
CII,2015/04/07,18.57,18.53,18.20,19.30
GTN,2015/04/09,15.99,15.97,15.80,16.40
...
Hai cột đầu Ticker và Date/Time là mặc định (luôn luôn xuất hiện). Trong đó, Date/Time có format phụ thuộc vào khai báo trong Region and Language (Control Panel).
Các cột còn lại EMA-13, MA-21, Close-4 và Close là do 4 lệnh AddColumn đã khai báo ở trên.
Một trong những ứng dụng mà tôi đã dùng để xuất file EOD Upto ....txt là đoạn code sau:
Filter = 1;
AddColumn(O,"Open");
AddColumn(H,"High");
AddColumn(L,"Low");
AddColumn(C,"Close");
AddColumn(V,"Volume", 1.0);
.
I. Dùng Scan:
1. Thành phần tối thiểu:
Có thể lọc bằng Scan với cấu trúc code đơn giản nhất, gồm một hay nhiều dòng trong các dòng sau đây:
Buy = <điều kiện 1>;
Sell = <điều kiện 2>;
Short = <điều kiện 3>;
Cover = <điều kiện 4>;
Các thành phần trong cặp ngoặc nhọn <điều kiện> là biểu thức lôgích theo cú pháp code được Amibroker quy định.
2. Thí dụ:
a. Một thí dụ đơn giản nhất:
Buy = Close> MA(Close, 200);
hoặc:
Buy = Cross(EMA(C,13), MA(C,21)) AND V>50000;
Cũng với ý tưởng trên, đoạn code có thể được sử dụng phức tạp hơn (nhằm tạo được nhiều tùy chọn hơn khi sử dụng):
//Long MA
P = ParamField("Price field",-1);
Periods = Param("Periods", 100, 2, 400, 1 );
Buy = Close> MA( P, Periods );
b. Thí dụ dùng nhiều lệnh điều kiện với điều kiện phức tạp :
r1 = Param("Fast avg", 12, 2, 200, 1);
r2 = Param("Slow avg", 26, 2, 200, 1);
r3 = Param("Signal avg", 9, 2, 200, 1);
ml = MACD(r1, r2);
sl = Signal(r1, r2, r3);
Buy=Cross(ml, sl);
Sell = Cross(sl, ml);
hay:
LongMA = EMA(C, Param("Long Period", 50, 30, 100, 5));
ShortMA = EMA(C, Param("Short Period", 5, 3, 50, 1));
Buy = Cross(ShortMA, LongMA );
Sell = Cross(LongMA, ShortMA );
3. Kết quả:
Với:
Buy = Close> MA(Close, 200);
Có kết quả:
Ticker,Trade,Date,Close,
AGF,Buy,2015/04/10,20.7000
BBC,Buy,2015/04/10,57.0000
BIC,Buy,2015/04/10,16.9000
BID,Buy,2015/04/10,19.0000
BMI,Buy,2015/04/10,17.3000
BMP,Buy,2015/04/10,81.0000
...
Với:
Buy = Cross(EMA(C,13), MA(C,21)) AND V>50000;
Kết quả nhận được:
Ticker,Trade,Date,Close,
BSI,Buy,2015/04/10,11.0000
JVC,Buy,2015/04/10,21.7000
VHC,Buy,2015/04/10,40.2000
VIS,Buy,2015/04/10,7.7000
Còn với:
LongMA = EMA(C, Param("Long Period", 50, 30, 100, 5));
ShortMA = EMA(C, Param("Short Period", 5, 3, 50, 1));
Buy = Cross(ShortMA, LongMA );
Sell = Cross(LongMA, ShortMA );
Kết quả sẽ có:
Ticker,Trade,Date,Close,
ABT,Sell,2015/04/10,51.0000
BCI,Sell,2015/04/10,20.8000
CYC,Buy,2015/04/10,3.9000
DQC,Buy,2015/04/10,57.5000
GTA,Buy,2015/04/10,16.0000
...
4. Thành phần kết quả được xuất ra có điểm chung: Gồm các cột mặc định: Ticker, Trade, Date và Close
II. Dùng Explorer:
Để dùng Explorer, trong code không dùng các dòng lệnh với Buy, Sell, Short hay Cover mà dùng Filter:
Filter = <điều kiện>;
<điều kiện> cũng là biểu thức lôgích.
Explorer đi kèm với tối thiểu 1 lệnh khai báo cột thông tin xuất ra và cho phép xuất ra các cột dữ liệu như ý muốn. Để xuất ra các cột thông tin, thường có thể dùng thêm các câu lệnh: AddColumn (được dùng xuất dữ liệu số) hoặc AddTextColumn (được dùng xuất dữ liệu chuỗi - text).
AddColumn(<Tên Dữ liệu>,<Tên cột>,<format>);
<Tên Dữ liệu> - Biến hoặc các biểu thức chứa dữ liệu dạng số muốn xuất ra.
<Tên cột> - Tiêu đề của cột sẽ được hiển thị.
<format> - dạng dữ liệu được xuất ra
AddTextColumn(<Tên Dữ liệu>,<Tên cột>);
Thí dụ:
Filter = Cross(EMA(C, 13), MA(C,21)) AND V>50000;
AddColumn(EMA(C, 13),"EMA-13",1.2);
AddColumn(MA(C, 21),"MA-21",1.2);
AddColumn(Ref(C, -4),"Close-4",1.2);
AddColumn(C,"Close",1.2);
Kết quả xuất ra:
Ticker,Date/Time,EMA-13,MA-21,Close-4,Close,
BIC,2015/04/09,16.06,16.02,15.80,17.20
BID,2015/04/08,17.91,17.88,17.90,18.50
BSI,2015/04/10,10.81,10.81,10.50,11.00
CCL,2015/04/09,4.04,4.03,4.00,4.10
CII,2015/04/07,18.57,18.53,18.20,19.30
GTN,2015/04/09,15.99,15.97,15.80,16.40
...
Hai cột đầu Ticker và Date/Time là mặc định (luôn luôn xuất hiện). Trong đó, Date/Time có format phụ thuộc vào khai báo trong Region and Language (Control Panel).
Các cột còn lại EMA-13, MA-21, Close-4 và Close là do 4 lệnh AddColumn đã khai báo ở trên.
Một trong những ứng dụng mà tôi đã dùng để xuất file EOD Upto ....txt là đoạn code sau:
Filter = 1;
AddColumn(O,"Open");
AddColumn(H,"High");
AddColumn(L,"Low");
AddColumn(C,"Close");
AddColumn(V,"Volume", 1.0);
.