Tải bản đầy đủ

Hướng dẫn code đơn giản amibroker p1

Hướng dẫn code đơn giản Amibroker (P1)
Chào mọi người, em xin chia sẻ chút ít mà em có tự mày mò được về vấn đề trên. Vì em tìm hiểu, cóp
nhặt công thức linh ta linh tinh nên bài viết sơ sài và thiếu chính thống. Em sẽ cố gắng đơn giản và dễ
hiểu nhất. Đêm hôm rảnh rỗi các bác đọc dòng nào nhảm thì lướt qua phần đầu, xem 3 cái hình với
chú thích thôi, nhé!
Trước tiên em xin phép lan man tí: Vì sao em lại biết đến cái trò cốt kiếc này? Lúc mới sử dụng Ami, em
bị dị ứng màu trắng. Mà các bác cũng biết mấy phiên bản Ami trước đây thì phông toàn màu trắng, nên
em phải đổi sang phông đen. Các in đi cầy tơ thì màu sắc nó lại phù hợp với màu trắng, mỗi lần kéo ra
kéo vô lại phải chỉnh. Em bực mình google mấy hồi thì ra cái này, chính là cái chỉnh sửa nội dung
indicator. Hay quá đỡ phải chỉnh màu mỗi lần kéo ra kéo vô.
À, nếu muốn chỉnh sửa một con cầy tơ có sẵn, lích phải vào nó rồi edit

Ồ nó hiện ra cái bảng này. Em éo thích màu xích lô, em sửa thành vàng, để style đậm đà (styleThick) cho
phong cách, nhìn cho rõ. Xong save lại là lần sau có màu vàng phong cách rồi.

Còn nếu bác nào muốn nuôi một em cầy tơ mới để thử phương pháp trading, thì thế này. Các bác tìm cái
búa Người phán xử nhé. Nó cũng lòi ra cái cửa số giống hình trên nhưng mà còn trinh nguyên.


Em lan man thế hết xừ một trang Microsoft doc rồi. Thôi giờ đi vào mấy khái niệm.
Ngôn ngữ Amibroker, Amibroker Formula Language hay AFL. Bác nào rảnh cứ Google code afl amibroker

ra đầy một lũ. Nhưng không có chén thánh đâu nhé. Nhìn thì hay nhưng biết nó hoạt động thế nào vẫn
hơn.
À còn một hình nữa là xong thủ tục giới thiệu cửa sổ code nhé các anh em yêu quý

Các mảng cơ bản
Trước tiên là giá và khối lượng. Bọn lập trình nó gọi là Mảng hay Array. Thôi mình dân chứng cháo cứ giá
và vol là ok.
O là Open – giá mở cửa trong ngày
H là High – giá cao nhất trong ngày
L là Low – giá thấp nhất trong ngày
C là Close – giá đóng cửa
V là Volumne – khối lượng giao dịch ngày
Giá cao nhất trong 10 ngày: HHV(H,10); (Cao nhất trong 10 mức giá cao)
Giá thấp nhất trong 10 ngày: LLV(L,10); (Thấp nhất trong 10 mức giá thấp)
Giá đóng cửa thấp nhất trong 10 ngày: LLV(C,10);

Tham chiếu và Tham số
Cái này tôi thấy hay dùng (không xưng em với các bác nữa).


Hàm tham chiếu (Reference): công thức Ref( ARRAY, period );
Ví dụ Giá đóng cửa ngày hôm qua gán cho biến C1. Tên biến đặt thế nào cũng được. Ví dụ:
À các bác mở trên Menu Analysis -> Formula Editor hình cái búa như tôi đã nói ở trên nhé.

Có nghĩa là nếu em “nói” (viết công thức) là C>EmLan; nghĩa là giá hôm nay lớn hơn em Lan (Giá đóng
hôm qua). Còn nếu giá hôm trước thì là -2, hôm trước nữa là -3, hôm kía hôm kìa thì tiếp tục..
Anh em để ý là nếu viết đúng, Ami sẽ tự nhận ra ngôn ngữ của nó và làm cho chữ đổi màu, chuyển đậm,
để phân biệt với những tên hay thông số mà người dùng tự đặt.

Chú ý: Dấu chấm phẩy. Dấu chẩm phẩy là quan trọng. Cứ hỏi bọn lập trình
Dấu chấm phẩy CUỐI DÒNG là rõ nó phiền thế nào nếu chót quên.
Hàm tham số (Parameters): Công thức
Anh em xem trang dưới nhé, trang này chật rồi.


Param( ''name'', defaultval, min, max, step);
Lần lượt: Tên, giá trị mặc định, giá trị nhỏ nhất, giá trị lớn nhất, bước nhảy (ví dụ đặt 1 thì là từ 1
lên 2, đặt là 2 thì từ 1 lên 3, đặt là 10000000 thì là từ 1 lên giời. Thôi các bạn cứ đặt là 1. Còn đặt cao là
để đỡ mất thời gian nếu muốn Optimized – tối ưu hóa code, mình sẽ trình bày sau!)
Ví dụ: Thoigian = Param("Loi cu ta ve",-15,-100,100,1);
Các bác viết tiếp như hình, đặt tên rồi Save lại. Ở phần Custom, chuột phải vào cái mình vừa tạo
rồi Insert hoặc cứ kéo trực tiếp vào.

Như vậy là đặt mặc định là Thoigian 15 phiên trước hôm nay. Em Lan (giá đóng cửa) trở thành
người cũ thứ 15 (âm 15 là 15 phiên kế trước). Em Lan còn có thể là người tình 100 phiên trước đó (giá trị
nhỏ nhất) hoặc là 100 phiên sau. Chắc các huynh đệ cũng quen với cái bảng chỉnh thông số mỗi khi kéo
đường MA hay Volume vào đồ thị rồi.
Thoigian là biến, EmLan cũng là biến, được sử dụng trong quá trình code.
Loi cu ta ve là tên hiển thị, như trong hình đó. Vậy có thể chỉnh sửa Lối cũ ta về thành âm mười
lăm (-15) hay 10 hay 100 trong khi sử dụng. Mặc định là -15.

Hiển thị Chart
Công thức:
Plot( array, name, color, style, minvalue, maxvalue, XShift);
Giải thích


Array: Mảng cần hiển thị. Chút nữa các bác sẽ hiểu
Name: Tên mình đặt. Sẽ hiển thị trên phần ti tồ (title) ở góc trái trên của chart. Lưu ý tên phải trong
ngoặc kép.
Color: cách viết: ColorYellow colorred Colorgreen - thích màu gì cho màu đó đằng sau chữ color. Nếu
viết đúng thì chữ tự chuyển đậm.
Style: cách viết: styleLine (đường nét liền mảnh), styleThick (đường nét liền đậm), styledashed (đường
đứt đoạn)
Min và max value: Bỏ qua nhé! Viết thành số 0
Dấu chấm phẩy cuối câu nhé!
Ví dụ đây, ví dụ đây!
Plot(C,"Chikou Span",colorLime,styleLine,0,0,-26);
Tôi viết đường Chikou Span theo tinh thần Ichimoku nhé. Đó là đường giá nhưng lùi lại 26 phiên
so với thời điểm hiện tại. Như vậy: Plot(Giá, “đặt tên Chikou Span”, màu xanh chanh, kiểu đường mảnh,
âm 26 nghĩa là lùi 26 phiên);
Các cụ viết như trên rồi Save lần nữa. Kéo vào đồ thị giá. Kết quả như hình:

Ví dụ 2: Cổ phiếu vượt đỉnh phá đáy.
Các anh em còn nhớ công thức HHV và LLV (Higher high value và Lower low value) mà tôi để ở
phần đầu? Tôi sẽ tạo một đường đỉnh và đáy trong 60 ngày (khoảng 3 tháng) nhé.


EmQuynh=HHV(H,60);
EmChi=LLV(L,60);
Plot(EmQuynh,"Dinh cao voi voi",colorWhite,styleDashed);
Plot(EmChi,"Vuc sau muon trung",colorWhite,styleDashed);

Giải thích: Em Quỳnh là Đỉnh cao vời vợi (60 ngày) còn Em Chi là vực sâu muôn trùng (đáy thấp
nhất của các mức giá thấp nhất – 60 ngày).
Plot (hiển thị) 2 em ý lên đồ thị (tên biến, tên tiêu đề, màu trắng trinh nguyên, kiểu nét đứt);
Các bạn lại save vào và kéo vào đồ thị giá như các bước trên ví dụ trước nhé. À 2 dấu gạch // ở
plot Chikou Span để biến dòng đấy thành Comment, không hiển thị nữa. Tôi sẽ nói về vấn đề Comment ở
bài sau.

Chúng ta đã có một cái khung hay đường band trên dưới hiển thị 2 mức giá cao thấp trong 60
ngày. Nhưng để hiển thị rõ rang hơn, tôi sẽ sửa lại 2 dòng code:
EmQuynh=HHV(Ref(H,-1),60);
EmChi=LLV(Ref(L,-1),60);
Như vậy, Em Quỳnh trở thành vực cao của 60 ngày liền trước TÍNH TỪ ngày hôm qua, có thể
hôm nay tôi đã chinh phục được em rồi. Chúng ta chú ý việc để hàm Ref(H,-1) là giá cao nhất ngày hôm
qua lồng trong hàm HHV thay cho chỉ một biến H (giá cao). Cẩn thận mấy dấu ngoặc phải đầy đủ với
nhau. Lưu lại rồi cùng so sánh 2 đồ thị sau khi sửa code.


Lưu ý rằng ở hình trên (sau khi sửa) chúng ta nhìn thấy rõ Vnindex đã phá xuống dưới mức Em Chi, còn
bên dưới (Chưa sửa) thì Em Chi chính là vực sâu của giá ngày hôm đó nên khó phát hiện hơn.

Đường MA
Chúng ta hãy kết thúc bằng một đường quen thuộc là đường trung bình. Tất nhiên nó có sẵn trong Ami
rồi. nhưng trong quá trình tự phát triển các ý tưởng của bản thân, chúng ta vẫn nên sử dụng hàm này.
MA( ARRAY, periods);
Ví dụ: Tôi sẽ lấy đường trung bình động của Khối lượng trong 20 ngày trừ Khối lượng trung bình động 50
ngày.
Nhung_ngay_ben_em_Nhi = Param("T1",20,1,200,1);
Nhung_ngay_ben_em_Ha = Param("T2",50,1,200,1);
EmNhi=MA(V,Nhung_ngay_ben_em_Nhi);
EmHa=MA(V,Nhung_ngay_ben_em_Ha);
Chenhlech=(EmNhi-EmHa)/EmHa;
Plot(Chenhlech,"Dong tien",colorWhite,styleHistogram|styleOwnScale);
Plot(EmNhi,"MA Volume 20",colorGreen,styleLine);
Plot(EmHa,"MA Volume 50",colorRed,styleLine);

Như vậy, tôi vừa tạo ra một công cụ theo phong cách MACD của khối lượng, giúp thấy rõ hơn sự chuyển
động của khối lượng giao dịch trung bình. Chúng ta có thể thay đổi 2 thông số 20 và 50 ngày khi sử dụng.


Diễn giải phần code: 2 dòng đầu đặt thông số thời gian trung bình. Tiếp theo là công thức MA của khối
lượng. Chú ý rằng có thể thay MA (đường trung bình động thường) thành EMA đường trung bình động
lũy thừa. Chenhlech chính là mức tang giảm của khối lượng trung bình. Phần dưới Plot hiển thị hình ảnh
chart.
Chú ý đoạn styleHistogram|styleOwnScale dấu | với chức năng kết hợp kiểu style. StyleOwnScale: vì
chênh lệch tính với công thức như trên chỉ loanh quanh số 0, nhưng khối lượng trung bình lại là vài ngàn
đến vài triệu nên để cùng với nhau trên một biểu đồ, ta phải yêu cầu Chenhlech một Quy mô riêng
(StyleOwnScale). Bạn có thể xóa đoạn styleHistogram|styleOwnScale và thay bằng chỉ có styleHistogram
để hiểu thêm.

Hướng dẫn Code Amibroker cơ bản - P2
Chia đoạn và commnet
Nói một chút về vần đề này!
Ở phần trước, tôi có nhắc đến việc comment. Những dòng comment trong đoạn mã của chúng ta thực ra
rất quan trọng trong quá trình làm việc. Chúng ta muốn tạo ra một cái gì đó hiệu quả và dễ hiểu. Vấn đề
là chúng ta sẽ thường xuyên sửa đổi và đọc đi đọc lại đoạn mã gồm những ký hiệu phức tạp trong quá
trình tối ưu hóa nó.
Điều đó phức tạp đối với bộ não của chúng ta. Đoạn code là để máy tính đọc, còn anh em ta thích đọc
những câu như “Hôm nay tăng ác đấy” hay “múc con đấy nhiệt tình vào” hoặc là “Tây lông bán ác quá”.


Ví dụ đoạn mã ở trên, nếu mỗi lần cần phải sửa đổi, sẽ lại phải căng mắt tìm lại từng dòng, không biết
rằng cái thằng mình – 5 phút trước – vừa viết cái khỉ ho gì. Nếu chị em lại đưa nó cho anh chàng hàng
xóm nhờ xem hộ vấn đề tại sao “nó” tăng ầm ầm mà con robot của em lại báo mua đúng đỉnh, anh
chàng cũng sẽ bối rối với mớ bòng bong của bạn. Nếu các bạn còn nhớ đoạn code xác định đáy và đỉnh
hôm qua:
Chúng ta thêm comment nội dung sau dấu
//
xem chúng ta đang làm gì ở đoạn đó.
Anh em cũng để ý thấy phần đầu và cuối mỗi đoạn với cú pháp:
_section_begin(“ghi tên section”);
Nội dung
_section_end();
Ok nó giúp phân đoạn dễ dàng hơn. Nhưng nếu thắc mắc rằng việc phân đoạn thì comment như trên là
được rồi, phải gõ thêm 2 dòng kia làm gì mất công. Chúng ta hãy làm một thử nghiệm nhỏ. Chỉnh sửa
đoạn code trên một chút, như thế này:


Thêm cú pháp phân đoạn vào để phân đoạn hiển thị em Quỳnh và em Chi. Save lại và kéo sang biểu đồ
giá.

Nhấp chuột phải, chọn Delete Indicator và đá em Quỳnh ra khỏi cuộc đời mình. Bằng cách phân tách các
Section, chúng mình đã tạo ra các Indicator riêng rẽ để có thể làm việc tốt hơn với chart.
Cuối cùng, hãy so sánh trên và dưới. Đoạn văn rõ ràng và mạch lạc hơn so với để trần một cục như đoạn
dưới.


Tập mổ xẻ, phanh thây và học hỏi các tiền bối
Nền y học của thế giới sẽ không phát triển như hiện tại nếu không có những thí nghiệm vô nhân tính
trên chính con người của những nhà khoa học điên thời cổ. Họ sẵn sàng mổ phanh một người sống chỉ
để xem có gì bên trong cơ thể người. Có những người bị kết cho tội phù thủy và bị thiêu sống sau đó.
May mắn thay, chúng ta cũng có thể học tập theo cách đó. Trừ phần vô nhân tính.
Vọc code của các tiền bối là một cách tích lũy kinh nghiệm thật hữu hiệu.

Quý vị google rồi bấm vào link như trên. http://www.wisestocktrader.com/indicators/1180-ichimokuwith-buy-sell
Vào trang web, kéo xuống phần FORMULA, ấn Copy and Paste Friendly. Nó đưa mình sang trang mới. Ấn
Ctrl + A chọn toàn bộ. Ctrl+C để copy. Chuyển sang Amibroker, mở cửa sổ code mới (tìm hình cái búa
hoặc vào Menu Analysis => Formula Editor). Ctrl+P để dán toàn bộ đoạn vừa Copy vào. Đặt tên rồi Save
lại.


Nào cùng nhau phân tích đoạn code Ichimoku nổi tiếng.
Trước khi tiếp tục, xin nói thêm một thủ tục là kiểm tra. Sau mỗi đoạn code hoàn thành, chúng ta sẽ click
vào nút này để kiểm tra sản phẩm của mình. Chương trình sẽ báo lỗi nếu phát hiện sai lỗi cú pháp và chỉ
vị trí để dễ dàng sửa lại.

Tiếp tục với Ichimoku nhé.
Đầu tiên xin cảm ơn tác giả!
Đầu tiên, lại đầu tiên chúng ta hãy lướt qua một đoạn từ trên xuống dưới. Chúng mình có thể nhận ra
tác giả trình bày từng đoạn một rất gọn gàng ngăn nắp. Có comment ở từng phần nội dung (Tuy rằng
hình như có lỗi phông chữ).

Đọc từng đoạn code ICHIMOKU
Phần đầu: Thiết lập các thông số cơ bản.

Trên đây là quy tắc cấu tạo các bộ phân trong Ichimoku. Các chị em anh em chịu khó tìm hiểu thêm quy
tắc Ichimoku nhé! Còn đây là phần code


Đoạn thứ nhất, n1 n2 n3 quy định 3 mốc thời gian là 9, 26, 52.
Đoạn thứ 2 là viết công thức theo quy tắc ở trên.
Ví dụ đường Tenkan = trung bình của giá cao nhất và giá thấp nhất trong 9 phiên có công thức:

Đường Senkou Span A

Các bạn tự đọc những dòng còn lại. Đoạn SpA, SpB và DL tôi không hiểu ý của tác giả và có xuất hiện ở
bên dưới. Sau bài viết mọi người có thể suy nghĩ thêm!

Đoạn điều kiện
Từ phần Cond1 Cond2 đến hết vòng lặp for{} (kết thúc ngay trước Alert). Các điều kiện ở phần này làm
tiền đề cho những điều kiện và hành động ở sau.
Tôi sẽ thử đọc vài dòng.
Cond2 = Ref(Close < Min(SenkouSpanA,SenkouSpanB),-1);
Ref(...,-1) nghĩa là điều kiện dựa trên dữ liệu phiên liền trước.
So sánh giá đóng cửa của phiên đó phải nhỏ hơn giá trị nhỏ nhất (Min) giữa SenkouSpanA và
SenkouSpanB của phiên đó.


Cond3 = Ref(Cross(TenkanSen,KijunSen),-1);
Ở đây, xuất hiện công thức Cross. Cross (cắt qua) có công thức là
Cross( ARRAY1, ARRAY2 ): Array 1 cắt lên trên Array2
Ví dụ: Cross(C,MA(C,20)) có nghĩa là Giá đóng cửa CẮT LÊN TRÊN đường MA20
Nếu giá đóng CẮT XUỐNG DƯỚI thì sẽ đặt C ở sau MA(C,20): Cross(MA(C,20),C)
Như vậy, điều kiện Cond3 là ở phiên liền trước, đường Tenkan đã cắt lên trên đường Kijun
Nhân tiện đây cũng nói thêm: Trong quá trình mổ xẻ các code đã có sẵn của các tiền bối chúng ta sẽ gặp
nhiều công thức hay cấu trúc rất lạ. Và câu trả lời cho hầu hết tình huống thường là:

CÔNG NGHỆ TÌM KIẾM THẬT TUYỆT VỜI!!!
 Tiếp nào
Cond7 = Ref(Cross (Close , Max(SenkouSpanA,SenkouSpanB)),-1);
Ở công thức này anh em có thể đọc dễ dàng sau khi đã biết cách đọc 2 công thức bên trên.
Tại phiên liền trước, giá đóng cửa đã cắt lên trên giá trị cao nhất của SenkouSpanA và B. Ví dụ:
đường SenkouSpanA đang ở trên SenkouSpanB ở phiên đó, và giá đó cửa sẽ cắt lên trên đường
SenkouSpanA – suy ra là nếu thỏa mãn điều kiện này, giá sẽ thoát khỏi đám mây Kumo theo
chiều tăng!
Cond9 và Cond10: 3 điều kiện kết hợp với nhau bởi (bọn lập trình nó gọi là toán tử logic) AND.
Nghĩa là điều kiện để bố mua gấu cho là con phải được điểm trên 8 cả môn toán AND tiếng việt
AND tiếng anh nhé.
RemCond9=ExRem(Cond9,NOT Cond9);
RemCond10=ExRem(Cond10,NOT Cond10);
Điều kiện RemCond9 và RemCond10: Lần đầu tiên xảy ra điều kiện Cond9 đúng và lần đầu tiên
điều kiện Cond10 đúng. Phần này phức tạp hơn chút ít, ở bài khác tôi sẽ nói thêm về Exrem.
Từ phần ColSenk đến hết vòng lặp for (ngay trên dòng Alert) là các điều kiện quy định màu sắc.
Ở đây, có công thức IIF là để đặt giá trị theo điều kiện. Cấu trúc điều kiện If và Cấu trúc vòng lặp
for, các bác sẽ thấy giải thích ở các bài sau.


Tôi chỉ nói về IIF.
IIF dùng để đặt giá trị thỏa mãn một điều kiện nhất định
Ví dụ:
Trump = iif(C>O,1,0); nghĩa là ông Trump có giá trị = 1 nếu giá đóng>giá mở, nếu < hoặc = thì
Trump sẽ = 0
Obama = iif(Cond1,colorblack,colorred); nghĩa là ông Obama sẽ là da đen nếu thỏa mãn điều
kiện Cond1, không thỏa mãn thì da đỏ.
Ví dụ hiển thị đường MA trên màn hình:
Plot(MA(C,20),”MA20”,Obama,styleline);
Như vậy, sau khi thay biến màu sắc Obama đã đặt ở trên vào vị trí của color (màu) trong câu lệnh
Plot thì đường MA sẽ màu đen khi thỏa mãn điều kiện Cond1, và màu vàng khi không thỏa mãn
Cond1. Có thể ghi trực tiếp câu lệnh iif lồng trong Plot như sau:
Plot(MA(C,20),”MA20”, iif(Cond1,colorblack,colorred),styleline);
Trong một câu lệnh có nhiều đoạn phải mở đóng ngoặc, chúng ta nên cẩn thận.
ColSenk =IIf (Cond1,colorGreen, IIf(Cond2,colorRed,colorLightGrey));
Như trong câu lệnh trên, ColSenk chỉ là tên mà tác giả đặt, chắc có ý đồ sử dụng ở phía dưới.
Chúng ta dễ thấy câu lệnh IIf quy định màu sắc (tương tự Obama) và có 2 câu lệnh lồng vào
nhau. Các huynh hãy thử diễn giải ý nghĩa trước khi đọc tiếp nhé.
Nếu thỏa mãn điều kiện Cond1 thì ColSenk là màu xanh lục, nếu không thỏa mãn Cond1 mà thỏa
mãn Cond2 thì đỏ, còn không thỏa mãn đk nào thì màu xám trắng.
Flat = TenkanSen == Ref(TenkanSen,-1) OR (NOT(Cond1) AND NOT(Cond2)) ;
Điều kiện Flat: thỏa mãn khi Tenkan bằng với Tenkan ngày hôm trước Ref(TenkanSen,-1) hoặc là
(OR) không thỏa mãn cả điều kiện Cond1 và Cond2 (NOT(Cond1) AND NOT(Cond2))
CHÚ Ý: 1 dấu = là gán giá trị, còn 2 dấu == liền nhau là bằng nhau theo nghĩa đen
Nếu viết là Flat == TenkanSen == Ref(TenkanSen,-1) thì ý ta là 3 giá trị trên bằng với nhau.
Còn Flat = TenkanSen == Ref(TenkanSen,-1) thì Flat trở thành một điều kiện mới.

Câu lệnh Alertif để có chuông thông báo nếu một điều kiện xảy ra. Cái này chủ yếu dùng cho
Intraday trading (giao dịch trong ngày) nêu tôi không đi vào phần này do ở thị trường chứng
khoán Việt Nam do T+3 nên giao dịch trong ngày có nhiều hạn chế.

Phần hiển thị
Anh em ta chịu khó kéo xuống, trang dưới. Trang này chật chội quá. Hừm


Anh chị em bỏ hết dấu // của đoạn này đi nhé để biến những dòng comment màu xanh thành
những dòng lệnh. Sau đó Save lại rồi kéo thử ra màn hình để xem sự thay đổi với đoạn mã gốc.
Tôi đọc dòng đầu tiên (sau khi bỏ // ): Hiển thị hình mũi tên chỉ lên trên, dạng tam giác nếu thỏa
mãn điều kiện Cond7. Màu xanh lục.
Trời ơi tôi lười quá. Qua những gì chúng ta vừa trải qua thì hy vọng các anh em, à à chị em nữa
tự tìm hiểu chức năng này nhé. Bác Google luôn biết tuốt: PlotShapes afl Amibroker.
https://www.amibroker.com/guide/afl/plotshapes.html
Phần Plot bên dưới (bài trước chúng ta đã làm quen với lệnh Plot rồi) hiển thị các đường chính trong
Ichimoku mà tác giả thiết lập ở phần đầu.
PlotOHLC là hiển thị 4 giá trị Open, High, Low, Close. Tôi có một thủ thuật nho nhỏ là nếu muốn biết một
dòng lệnh dạng Plot có ý nghĩa gì, ta cứ việc thêm // ở đầu để biến nó thành comment (comment thì chỉ
có tác dụng giải thích, không ảnh hưởng đến lệnh) nhằm mục đích xem cái gì sẽ biến mất trên màn hình.

Các điều kiện và lệnh BUY và SELL
Ồ xem ra đây đã là gần hết rồi

3 dòng đầu là lệnh gán điều kiện, cũng giống như Cond1 Cond2 Cond3 ở trên thôi nhỉ!
6 dòng cuối cũng là lệnh gán điều kiện, từ StrongBuy (Mua mạnh) đến WeakSell (bán yếu)
Mọi người chú ý đến lệnh Buy và Sell
Đây cũng là câu lệnh điều kiện trong Amibroker, nhưng là một điều kiện thực thi. Nó khác với các loại
gán điều kiện khác (kiểu Cond1 Cond2) ở chỗ: Cond1 chỉ là một thứ (tôi bí từ) mà chúng ta đặt ra, sau đó
dùng cái “thứ” điều kiện ấy để làm vật liệu cho các câu lệnh thực thi.
Còn Buy và Sell nó ở một đẳng cấp khác. Đường đường là câu lệnh gốc trong Amibroker, nên khi viết Buy
hoặc Sell, Ami sẽ nhận ra và in đậm ngay.
Buy (mua) khi Tenkan cắt lên trên Kijun và DL lớn hơn giá đóng cửa. Các bạn xem lại giá trị DL ở phần
thiết lập trên đầu nhé.


Sell các bạn cũng tự đọc nhé.

Phần cuối
Phần cuối cùng lại là PlotShapes (hy vọng mọi người đã Gu Gồ và hiểu ý nghĩa câu lệnh này). Các câu lệnh
PlotShapes ở phần dưới lồng trong lệnh IIF để hiển thị mũi tên báo mua bán, mua yếu mua mạnh, bán
yếu bán mạnh.
Áp dụng thử thủ thuật thêm dấu // comment để xem tác dụng của các câu lệnh “dạng Plot” như Plot,
PlotShapes hay PlotOHLC nhé.

2 câu lệnh cuối cùng chính là để hiển thị dải Ruy-băng ở bên dưới. À giờ thì đã hiểu câu lệnh IIF màu sắc
ColSenk ở phía trên rồi!

Cảm ơn mọi người!
Hướng dẫn code đơn giản Amibroker - P3
*CẨN THẬN: phần đầu nhảm nhí. Anh em kéo xuống trang 2 luôn cũng được, hoặc chịu khó đọc
nhé.
Xin chào các bạn!
Mình vào chủ đề luôn.
À thôi, nói phét tý đã, hề hề! Mình cứ đi cóp nhặt linh ta linh tinh, nên mỗi phần lại một đoạn. Mông
không ra mông, ngực không ra ngực. Nghĩ gì nói đấy, lại kém về phần tổng hợp nên cách thức nhặt mỗi
chỗ một tý cứ như nồi lẩu tả pí lù thập cẩm. Nấu lẩu hải sản, thêm tý thịt gà bò, con cá nát bét xong rồi lại
mắm tôm vào gia vị Thái thì hết muốn ăn.
Vậy nên hôm nay cũng chia phần ra chút.

Nếu nói về việc code Amibroker ra một sản phẩm như thế nào, thì theo ý mình – theo ý mình thôi nhé –
có 3 mục đích, hay cách dùng (hay dùng từ thế nào tùy bạn). (1) là tạo ra những công cụ hiển thị diễn giải
– (2) là áp dụng hệ thống giao dịch – (3) là lọc lựa cổ phiếu.
Nghe tên hơi trừu tượng khó hiểu, cho rằng người viết có vẻ tinh tướng ta đây thích dùng chơi chữ - mình
cố tình đấy hề hề. Thật ra không có gì lạ cả, tôi giải thích ngay đây.
1. Các công cụ diễn giải biểu đồ
Đây là những “thứ” quen thuộc nhất đối với người dùng Amibroker. Thôi nói thẳng luôn, là mấy
indicator như đường MA, chỉ báo giao động RSI, MACD, Bollinger Band, đường ADX,


Stochastic, ... được xây dựng theo một công thức nào đó do ông Robert Williams John Kevin
Rayer gì đấy nghĩ ra. Nói chung hầu hết những thứ các bạn sử dụng, nhìn thấy trên biểu đồ. Mấy
anh bạn phân tích thì vì RSI đã đi từ vùng quá mua sang vùng trung tính, kết hợp với giá chạm
bật MA50 và MACD, Stochastic đều cho tín hiệu mua, v.v... rồi cho vào báo cáo môi giới đều sử
dụng indicator cũng là dạng này.
Hãy nhìn tranh bên dưới!

Từ trên xuống dưới: RSI, đồ thị giá, ADX và MACD.


Code của RSI, ADX và MACD. (Các bạn click chuột phải vào tên indicator rồi chọn edit để hiện
cửa sổ code như trên).
Các anh em hãy chú ý đến một câu lệnh rất quen thuộc đối với chúng ta trong 2 bài trước. Đúng
vậy, đó là lệnh PLOT. Để hiển thị lên trên biểu đồ, ta dùng lệnh đó.
Các Indicator chủ yếu để diễn giải chuyển động của giá hay khối lượng, vì nếu ai không
quen nhìn biểu đồ trần (nghĩa là chỉ có giá & khối lượng, không mặc thêm gì hết) thì indicator
dùng để giải thích, kiểu như: MA20 nằm trên MA50 thì xu thế tăng ngắn hạn, hay ADX> 50 thì
xu hướng (mua hoặc bán) đang mạnh, ...

Đầu tiên, chúng ta phải nghĩ ra ta muốn xem cái gì trên con người cô ấy, nghĩa là muốn hiểu cái
gì về biểu đồ giá. Như ở bài 1, chúng ta đã cùng nhau tạo ra sự hiển thị các mức giá cao/thấp nhất
trong 3 tháng hay biểu đồ “làm mềm” khối lượng.
 Bước 1: Tạo ra công thức dựa trên những dữ liệu gốc là giá (O,H,L,C) và khối lượng (V)
 Bước 2: Hiển thị bằng lệnh PLOT
Ở ví dụ trên, RSI(), ADX(), MACD() là những hàm tính toán có sẵn trong Amibroker, chúng ta
chỉ việc thêm thông số vào trong dấu ngoặc () như RSI(14) – cho 14 ngày. Đối với RSI mình cho
thêm 2 đường quá mua, quá bán (tôi đặt là 80-20) là nét gạch. Thêm vào đơn giản trong code (các
bạn có thể sửa 80-20 thành thông số khác tùy theo):
Plot(80,"Overbought",colorYellow,styleDashed);
Plot(20,"Oversold",colorYellow,styleDashed);

Các indicator cơ bản mình hay sử dụng đều có sẵn trong Amibroker, chỉ việc thêm thông số. Các
bạn chịu khó google như cách mình chỉ ở bài trước đối với một công thức chưa hiểu rõ nhé.

2. Hệ thống giao dịch
Một hệ thống giao dịch gồm những điều kiện để vào lệnh và thoát lệnh. Theo một cách máy móc – vì
chúng ta đang lập trình cho máy thực hiện, chỉ cần đạt đủ các điều kiện là ok, phát tín hiệu.
Ở đây chém gió một chút, mặc dù máy móc rất kỷ luật nhưng lại chính là điểm yếu – đó chính là
khó thích nghi với những thay đổi của thị trường. (ví dụ như tùy từng loại robo hay hệ thống giao
dịch mà phù hợp với thị trường có xu hướng hay thị trường trong khung giao động). Con người
dễ thích nghi nhưng cũng chính là điểm yếu – thiếu kỷ luật.
Có lẽ nhiều người đã từng nhìn thấy những dạng biểu đồ như thế này:


Những mũi tên xanh đỏ đại diện cho những quy tắc chứa những điều kiện cho việc mua/bán được kích
hoạt trong code của chúng ta. Theo truyền thống của 2 bài trước, ta hãy viết một code đơn giản nhé.
Các bạn đọc trên các website viết thế này

Ừ thì ông nói thế biết thế chứ tôi biết thế nào. Lúc đầu đọc mấy dòng này cũng thấy hợp lý mà có hiệu
quả không nhỉ? Mở chát, vẽ MA rồi nheo mắt nhìn, a chỗ này cắt, giá lên. A chỗ kia cắt, sao giá không
giảm? Nhiều chỗ loạn mắt quá, sao phân biệt?
Viết thử code đơn giản giao dịch bằng đường trung bình động (Moving Average)
- Đầu tiên, chúng ta xác định đường nhanh và chậm. Tôi sẽ thử với nhanh – 20 ngày. Chậm – 50
ngày.
o Các anh em còn nhớ cách đặt thông số chứ?
Nhanh = Param("Thoi gian nhanh",20,1,200,1);
Cham = Param("Thoi gian cham",50,1,200,1);
Tiếp theo sẽ thiết lập 2 đường MA (tôi sẽ dùng EMA – MA lũy thừa thay cho MA đơn giản)
MAnhanh=EMA(C,Nhanh);
MAcham=EMA(C,Cham);
Điều kiện 2 đường cắt nhau:
Ở đây có 2 cách
Cách 1: Dùng Cross (Cắt nhau)
//==Dieu kien
DieukienMua= Cross(MAnhanh,MAcham);
DieukienBan= Cross(MAcham,MAnhanh);
//==Buy and Sell
Buy = DieukienMua;
Sell = DieukienBan;


Lưu ý: Mua khi MAnhanh cắt lên trên MAcham, bán ngược lại.
Các bạn còn nhớ bài trước có một cái là Exrem chứ? Và đây là cách 2:
Cách 2
//==Dieu kien
DieukienMua= MAnhanh>MAcham;
DieukienBan= MAnhanh//==Buy and Sell
Buy = DieukienMua;
Sell = DieukienBan;
Buy = ExRem( Buy, Sell );
Sell = ExRem( Sell, Buy );
Giải thích: Điều kiện mua khi MAnhanh lớn hơn MAcham. Nhưng thế thì không được, vì sau đó
sẽ có cả trăm phiên mà MAnhanh sẽ lớn hơn MAcham (vì đã tiến vào uptrend) nên ta chỉ lấy tín hiệu lần
đầu tiên mà MAnhanh>MAcham.
Các bạn có lẽ sẽ thắc mắc thế thì khác gì Cross? Sao không dùng Cross cho nhanh lại phải viết
thêm 2 dòng. Tiếp tục diễn giải:
Buy = Exrem(điều kiện 1, điều kiện 2);
Lệnh Buy được kích hoạt (như kéo cò súng) khi LẦN ĐẦU xảy ra điều kiện 1 (MA cắt lên), sau
đó ta thả cò súng cho đến khi mà điều kiện 2 xuất hiện (MA cắt xuống). Sau đó, nếu xuất hiện điều kiện 1,
ta lại có thể kéo cò. Nếu điều kiện 2 không xuất hiện thì sẽ không được kéo cò lệnh Buy lần 2.

Hình trên minh họa có và không có Exrem.


Nhưng thế thì khác gì Cross? Bởi vì Cross chỉ là Cross, là cắt qua, là một kiểu điều kiện duy nhất. Còn
với cách 2, tôi có thể tạo ra những điều kiện không phải Cross (Ví dụ như giá đóng cửa lớn hơn một mức
nào đó hay khối lượng gấp 5 lần khối lượng trung bình) và đặt điều kiện lần đầu tiên.
-

-

-

Tiếp theo, bước cuối cùng là làm hiển thị tín hiệu lên màn hình
PlotShapes(Buy*shapeUpArrow,colorLime,0,L,-50);
PlotShapes(Sell*shapeDownArrow,colorRed,0,H,-50);
Có thể bạn đã biết cách dùng Plotshapes, nhưng tôi sẽ diễn giải lại.
PlotShapes(Hình dạng, màu sắc , layer – để là 0 , vị trí, khoảng cách);
Dòng đầu tiên:
Buy*shapeUpArrow nghĩa là nếu điều kiện buy thì chèn hình mũi tên. Chú ý dấu * ở giữa
Bạn có thể thay đổi nhiều hình dạng khác. Tham khảo tại đây
https://www.amibroker.com/guide/afl/plotshapes.html
colorLime tôi để màu xanh với buy và đỏ với sell
Vị trí: đối với mũi tên buy (hướng lên) thì vị trí là L (low) nghĩa là dưới đáy cây nến. Ngược lại
với sell
Khoảng cách là khoảng cách từ mũi tên đến nến. Vì nếu khoảng cách = 0 thì vị trí mũi tên sẽ gần
sát giá cao (thấp) của nến, rất khó phát hiện. Các bạn để dấu âm (vd: -50) ở trước nhé.
Đã xong. Vậy các bạn nên có những dòng lệnh như thế này. (ở đây tôi để điều kiện kết hợp
Exrem)


Nếu thành thạo thì có thể rút gọn xuống như thế này (tôi lại thử dùng cross nhé – 2 cách có tác
dụng như nhau trong trường hợp đơn giản này):

Anh em Save lại, mở đồ thị giá, chèn vào thêm 2 đường EMA20 và EMA50 xong kéo code mình
vừa tạo vào sẽ thấy có mũi tên ở ngay điểm cắt nhé.
Vậy là chúng ta vừa xem qua cách tạo một công cụ giao dịch với điều kiện đơn giản. Bài sau tôi
sẽ nói thêm về vấn đề này, (3) chức năng lọc cổ phiếu và cách sử dụng chức năng Analysis (nhiều người
sử dụng Ami thường bỏ quên tính năng tuyệt vời này) và cách kiểm tra sự hiệu quả của một công cụ giao
dịch tín hiệu.
Xin cảm ơn!
Tham khảo thêm:
https://www.amibroker.com/guide/h_indbuilder2.html

Hướng dẫn code đơn giản Amibroker – P4
Lọc cổ phiếu
Chức năng Scan và Explore trong Amibroker dùng để quét tín hiệu và lọc cổ phiếu theo tiêu chí.

Các bạn mở một tab Analysis như hình vẽ (hoặc chọn File > New > Analysis. Phần khoanh đỏ là 2 chức
năng mà tôi nói đến. Nói qua về “thứ” cơ bản cần cài đặt khi làm việc với Analysis:
Trước tiên, anh em vào chủ đề này để tìm hiểu qua về cách tạo watchlist – danh sách theo dõi cổ phiếu
http://forum.vietstock.vn/threads/23726-PTKT-ai-ko-thich-dung-vao-?p=1147173


Từ trái qua phải:
Apply to: All symbols (tất cả dữ liệu – mã chứng khoán), Current (mã chứng khoán hiện tại mà mình đang
mở ở tab bên cạnh – trong trường hợp trên là CHP), Filter (nếu các bạn đã đọc về tạo watchlist ở link
trên thì bây giờ ấn thử vào hình cái phiễu xanh bên cạnh, trong watchlist chọn danh mục của bạn rồi ok)
Range: Tốt nhất là để From to date rồi chọn ngày bắt đầu và kết thúc ở bên cạnh. Lưu ý là tháng-ngàynăm nhé.
Formula: Bạn sẽ chọn mình sẽ lọc cổ phiếu dựa trên code nào. Amibroker đưa bạn đến thư mục chứa
các code để chọn công cụ đó. Ấn vào biểu tượng màu vàng ở bên cạnh rồi chọn. Biểu tượng ngoài cùng
là để mở cửa sổ xem/chỉnh sửa code đang được chọn.
Nếu bạn tìm được thư mục có chứa code của mình, đừng lo lắng, hãy làm như hình bên thì cũng là một
cách khác để chọn code của mình để “phân tích” (Analysis)

Chức năng Scan
Bạn có một công cụ cho tín hiệu mua/bán cổ phiếu (xem lại phần trước hướng dẫn cơ bản cách tạo công
cụ tín hiệu mua/bán theo điều kiện do mình tự đặt ra) và muốn biết hôm nay, hay kể từ đầu tháng, trong
những cổ phiếu mình quan tâm (giả sử bạn đã cho vào danh sách watchlist của mình những cổ phiếu có
“tương lai”, công ty làm ăn ok, lãnh đạo ok, em tiếp tân ok, v.v..) có những cổ phiếu nào đạt điểm mua để
nhào zô.
 Nhiệm vụ: kiểm tra xem từ đầu tháng 6, trong danh mục VN30 có những mã nào đạt điểm
mua/bán với điều kiện 2 đường EMA10 và EMA20 cắt nhau.
Bước 1: Tạo danh sách VN30. Làm theo hướng dẫn link trên. Danh sách
VN30:
https://www.hsx.vn/Modules/Listed/Web/StockIndexView/1964531007
Bước 2: Tạo code tín hiệu theo điều kiện. Tạo một code mới như sau, đặt
tên là EMA10 cross EMA20 rồi save lại.
Bước 3: Mở tab Analysis, cài đặt các thứ các thứ, rồi nhấn nút Scan ==> ra
kết quả!
Ở bảng kết quả, ta thấy: Mã chứng khoán – Buy/Sell – Ngày – Giá đóng
cửa của ngày đó.
Ví dụ: Chọn sang tab đồ thị chart bên cạnh, thêm 2 đường EMA10 và EMA20 vào.
CII cho tín hiệu bán (theo điều kiện EMA như trên) ngày 15 tháng 6. Click đúp vào hàng CII rồi mở tab
chart, ta thấy CII cho tín hiệu đúng như vừa Scan.


Tất nhiên là ta thấy chất lượng của tín hiệu này không cao. Điều đó phụ thuộc vào điều kiện mua/bán tốt
đến đâu.

Chức năng Explore với hàm Filter
Giả sử bạn muốn lọc tất cả các cổ phiếu trong VN30 với điều kiện là
-

khối lượng trung bình trong 1 tháng gần đây lớn hơn khối lượng trung bình 3 tháng, và
đang trong xu hướng tăng (đường trung bình MA50>MA100)

Điều kiện 1: Condition1 = MA(V,20)>MA(V,60): //trung binh khoi luong 1 thang>3 thang
Điều kiện 2: Condition2 = MA(C,50)>MA(C,100); //Dieu kien Uptrend
Hàm Filter (https://www.amibroker.com/guide/h_exploration.html) để ra lệnh cho Ami: Tìm cho bố
mã nào thỏa mãn 2 điều kiện trên.
Filter = Condition1 AND Condition2;
AddColumn(Array,”tên hiển thị”);
Addcolumn dùng để thêm vào các cột các thông số trong bảng kết quả, hay sử dụng ở chức năng
Explore. Ví dụ: Bạn muốn trong các kết quả giá đóng cửa, khối lượng và chỉ số RSI của ngày hôm đó:
AddColumn(C,"Price");
AddColumn(RSI(14),"RSI");
Được rồi bây giờ các bạn đã có một code
lọc đơn giản. Ấn nút vertify syntax (kiểm
tra) bên phải phần đặt tên. Oops, tôi vừa
đánh nhầm dấu chấm phẩy ; thành dấu
hai chấm :
Sửa lại cho đúng, kiểm tra lần nữa rồi lưu
lại.

 Nhiệm vụ: Kiểm tra các mã cổ
phiếu trong VN30 thỏa mãn điều kiện lọc trong tuần cuối tháng 6


Tài liệu bạn tìm kiếm đã sẵn sàng tải về

Tải bản đầy đủ ngay

×

×