Điều cở bản để lập trình Indicator | IFCM Việt Nam
IFC Markets Online CFD Broker

Điều cở bản để lập trình Indicator

Giới thiệu

Mục đích của bài viết này là để giải thích các nguyên tắc viết indicator trên ví dụ, và việc xem xét "các đá ngầm" mà các lập trình viên có thể gặp, khi thực hiện các bước đầu tiên của họ trong sự phát triển ngôn ngữ NTL +.


Trong việc xây dựng các Indicator, Bạn cần phải xác định các giá trị được tính toán, ghi lại trong buffer, và làm thế nào chúng được hiển thị trên màn hình. Hình thành các chỉ số đấy một cách đúng để phần mêm hoạt động đúng. Khi tạo logic cho indicator, Bạn cần phân biệt, những giá trị cần tính, cách ghi vào buffer, cách hiển thị lên trên màn hình. Hình thành các chức năng đấy đúng là mục tiêu khi xây dựng indicator.


Ví dụ, chúng ta sẽ thiết lập indicator mà sẽ hiển thị chênh lệch các thanh bar với giá đóng cáo hơn giá mở và số lượng thanh bar với giá đóng thấp hơn giá mở; các chênh lệch đấy tích tụ ở trong giai đoạn N. Chúng ta sẽ đưa indicator đấy hiển trong cửa sổ mới theo mẫu hình gistogramm.


Thiết lập mã script

Logic của chúng ta sẽ đơn giản và dễ hiêu, để có thể đơn giản kiểm tra cách làm việc của indicator. Cho mỗi thanh Bar với số I phân tích trong giai đoạn số N bar trước đấy và sẽ ghi lại thống kê, khi phát hiện thấy sổ bar tăng thì sẽ công thêm giá trị cuối thêm 1, còn khi thấy bar hạ thì trừ 1.

img

Xem mật mã của phần mềm.


Trước hết phải nâng cấp lại các sô liệu mà sẽ được sử dùng trong indicator.

#set_indicator_separate
double ExtMapBuffer1[];
int ExtCountedBars=0;
extern int period = 10;

Mục #set_indicator_separate cho chúng ta biết là biểu đồ sẽ được hiển thị trong cửa sổ mới và sẽ không hiển thị trong biểu đồ tỷ giá. Dòng tiếp theo là số liệu toàn cầu ExtMapBuffer1, trong đấy chúng ta sẽ lưu lại các giá trị số liệu. Lưu y rằng, chúng ta không đặt kích cỡ của số liệu này, vị compilator sẽ tự động chia ra bộ nhớ cần thiết cho công việc.


Trong ExtMapBuffer1 sẽ lưu lại tất cả các điểm tham gia trong việc xây dựng biểu đồ, còn theo ô dọc sẽ là các số thứ tự trong số liệu. Sau đấy chúng ta cho thêm số liệu ExtCounterBars bằng 0. Trong số liệu này chúng ta sẽ lưu giữ số liệu các thanh bar. Như vậy chúng ta sẽ không cần tính số lượng thanh bar mỗi lân, như vậy sẽ nhanh hơn. Tiếp theo là số liệu toàn câu period để lưu số lượng khoảng thời gian mà indicator sẽ tính dữ liệu. Lưu ý rằng số liệu loại extern cho phep chúng ta thay đổi ngày trong khi đang chay phần mềm, không cần phải chỉnh đổi lại mã.


Xem ví dụ chức năng Initialize(), mà trong đấy sẽ lưu lại các điều chỉnh chính cho indicator của bạn.


int Initialize() { Indicator.SetIndexCount(1); Indicator.SetIndexBuffer(0,ExtMapBuffer1); Indicator.SetIndexStyle(0,ltHistogram,lsSolid,5,clrBlue); return(0); }

Chức năng SetIndexCount của Indicator lưu các số liệu. Buffer với số liệu ExtMapBuffer1 sẽ chỉ có một, nên chúng ta viết số 1 vào cuối. Chúng ta cần liên kết số thứ tự và số liệu. Dòng này là dòng liên kết Indicator.SetIndexBuffer(0, ExtMapBuffer1), giá trị 0 là để vẻ biểu đồ từ số liệu ExtMapBuffer1.


Tiếp theo chúng ta điền các tính chất cho indicator. Thông số thứ nhất của phương pháp SetIndexStyle điền số liệu trong buffer: giá trị = 0, mà đã được viết trong SetIndexBuffer. Thứ 2 là kiểu loại vẽ: gistogramm. Trong thông số thư 3 là style đường IsSolid (có thể cho bất kỳ giá trị nào vào, tại vì giá trị này chỉ anh hưởng đến độ dày bằng 1 của gistogramm). Tiếp theo chúng tà điền thông số độ dày bằng 5 và mầu xanh clrBlue (mầu có thể cho như format RGB, ví dụ 0x0000FF).


Tiếp theo là chức năng Run(), sẽ thực hiện chức năng chính là draw(). Chức năng draw() sẽ tính tất cả các dữ liệu.


int Run() { ExtCountedBars=Indicator.Calculated; if (ExtCountedBars < 0) { System.Print("Error"); return(-1); } draw(); return(0); }

Trong số liệu toàn cầu ExtCountedBars điền số lượng thanh bar, mà đã không thay đổi từ lân cuối. Những giá trị này chúng ta đã tính sẵn rồi, nên sẽ không cần tính lại. Tiếp them chúng ta sẽ đặt nếu giá trị ExtCountedBars < 0 thì sẽ dừng hoạt động của indicator. Tiếp theo chức năng draw() sẽ tính các giá trị và lưu lại vào buffer.


void draw() { int pos=Chart.Bars-ExtCountedBars-1; int value; while(pos>=0) { value=0; for(int i=pos;i < pos+period && i < Chart.Bars-1;i++) { if(Open[i] < Close[i]) value+=1; else value-=1; } ExtMapBuffer1[pos]=value; pos--; } }

Trong dòng «int pos=Chart.Bars-ExtCountedBars-1;» chọn vị trí khởi đầu từ giá trị cũ đến giá trị mới nhất. Với số lương thành bar bằng Chart.Bar, thanh bar đứng xa nhất sẽ có số index là Chart.Bars-1, tiếp đến: Chart.Bars-ExtCountedBars-1 .Dữ liệu Value dùng để lưu lại thống kê. Tiếp theo trong chu kỳ Chart.Bars-ExtCountedBars-1 đến 0 cho mỗi bar lưu giữ dữ liệu cho từng khoảng cách thời gian.


Ghép lại mã thành một:


#set_indicator_separate double ExtMapBuffer1[]; int ExtCountedBars=0; extern int period = 10; int Initialize() { Indicator.SetIndexCount(1); Indicator.SetIndexBuffer(0,ExtMapBuffer1); Indicator.SetIndexStyle(0,ltHistogram,lsDot,5,clrBlue); return(0); } int Run() { ExtCountedBars=Indicator.Calculated; if (ExtCountedBars < 0) { System.Print("Error"); return(-1); } draw(); System.Print("ExtCountedBars="+ExtCountedBars); return(0); } void draw() { int pos=Chart.Bars-ExtCountedBars-1; int value; while(pos>=0) { value=0; for(int i=pos;i < pos+period && i < Chart.Bars-1;i++) { if(Open[i] < Close[i]) value+=1; else value-=1; } ExtMapBuffer1[pos]=value; pos--; } }

Tiếp theo cho thêm nâng cấp vào mã để indicator làm việc hoàn thiện hơn: Những thanh với giá trị âm sẽ hiển thị bằng một mầu, còn dương tính sẽ mầu khác. Như thế chúng ta sẽ cần thêm 4 buffer.


#set_indicator_separate double ExtMapBuffer1[]; double ExtMapBuffer2[]; double ExtMapBuffer3[]; double ExtMapBuffer4[]; int ExtCountedBars=0; extern int period = 10; int Initialize() { Indicator.SetIndexCount(4); Indicator.SetIndexBuffer(0,ExtMapBuffer1); Indicator.SetIndexStyle(0,ltHistogram,lsDot,5,clrBlue); Indicator.SetIndexBuffer(1,ExtMapBuffer2); Indicator.SetIndexStyle(1,ltHistogram,lsDot,5,clrGreen); Indicator.SetIndexBuffer(2,ExtMapBuffer3); Indicator.SetIndexStyle(2,ltHistogram,lsDot,5,clrRed); Indicator.SetIndexBuffer(3,ExtMapBuffer4); Indicator.SetIndexStyle(3,ltHistogram,lsDot,5,clrLime); return(0); } int Run() { ExtCountedBars=Indicator.Calculated; if (ExtCountedBars < 0) { System.Print("Error"); return(-1); } draw(); return(0); } void draw() { int pos=Chart.Bars-ExtCountedBars-1; int value; while(pos>=0) { value=0; for(int i=pos;i < pos+period && i < Chart.Bars-1;i++) { if(Open[i] < Close[i]) value+=1; else value-=1; } if(value>0) { ExtMapBuffer1[pos]=value; ExtMapBuffer2[pos]=0; ExtMapBuffer3[pos]=1; ExtMapBuffer4[pos]=0; } if(value==0) { ExtMapBuffer1[pos]=0; ExtMapBuffer2[pos]=0; ExtMapBuffer3[pos]=0; ExtMapBuffer4[pos]=0; } if(value < 0) { ExtMapBuffer1[pos]=0; ExtMapBuffer2[pos]=value; ExtMapBuffer3[pos]=0; ExtMapBuffer4[pos]=-1; } } pos--; } }

Indicator mới với các loại mầu:

img

Khi thiết lập mã, Bạn có thể gặp các lỗi trong ghi chúc như: «run fuction call failed» (khởi động chức năng run bị lỗi). Lỗi như này có thể gặp khi ghi giá trị vào số liệu với số index sai, nên thế khi gặp các lỗi tương tự hãy kiểm tra lại thứ tự index của số liệu.


Tổng kết

Trong bài viết này chúng ta đã tạo từng bước một indicato. Và đã lập trình một cách đơn giản nhất để làm quen với ngôn ngữ NTL+ một cách đơn giản nhất. Có thể các indicator này sẽ không cần thiết cho bạn trong việc giao dịch, nhưng trong bài viết này đã không đưa ra mục địch viết ra indicator mà giúp cho việc giao dịch. Trong bài viết này đã xem xét các chức năng mà sẽ cần thiết khi viết bất kỳ một indicator nào khác.

Close support
Call to Skype Call to WhatsApp Call to telegram Call Back Call to messenger