Dasar-dasar dari Indikator Petunjuk Penulisan | IFCM Indonesia
IFC Markets - Perdagangan Mata Uang Forex

Dasar-dasar dari Indikator Petunjuk Penulisan

Pengantar

Pasal ini telah ditulis dengan maksud untuk menjelaskan dan menggambarkan prinsip-prinsip dalam membuat indikator pengguna dan memeriksa perangkat programmer yang mungkin terjadi ketika mengambil langkah pertama mereka dalam pengembangan di NTL+ (the NetTradeX Language).


Sebagai penyusun algoritma dari indikator pengguna, Anda perlu untuk menentukan bagaimana nilai-nilai yang bisa ditulis dalam buffer indikator itu akan dihitung dan ditampilkan pada layar. Pembentukan secara benar nilai-nilai ini adalah tujuan akhir dari pelaksanaan indikator.


Sebagai contoh, mari kita buat indikator yang akan menunjukkan perbedaan antara jumlah bar, dengan harga penutupan lebih tinggi dari harga pembukaan, dan jumlah bar, dengan harga penutupan lebih rendah dari harga pembukaan, untuk yang terakhir dan interval. Kami akan menampilkan indikator kita sebagai histogram di jendela terpisah.


Penulisan kode skrip

Algoritma kita akan menggunakan secara sederhana dan intuitif sehingga bisa dengan mudah memeriksa operasi indikator pada grafik. Kami akan menganalisis n bar sebelumnya untuk setiap i-bar dan bentuk statistik, di mana kita akan menambahkan 1 untuk nilai yang dihasilkan jika bar naik dan dikurangi 1 dalam kasus bar tetes.

NTL+ (the NetTradeX Language)

Mari kita periksa kode indikator:


Pertama, kita harus menyatakan semua variabel yang akan digunakan dalam indikator kami.

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

#set_indicator_separate adalah direktif preprocessor yang menunjukkan bahwa grafik yang akan ditampilkan dalam jendela terpisah tanpa tumpang tindih dengan grafik harga utama. Baris berikutnya demikianlah ExtMapBuffer1 array yang global di mana nilai-nilai penyangga indikator akan disimpan. Perlu dicatat bahwa kita tidak menentukan ukuran array, sebagai compiler itu sendiri akan mengalokasikan jumlah memori yang diperlukan. The ExtMapBuffer1 Array sebenarnya menyimpan koordinat dari titik-titik termasuk dalam grafik, dengan absis mereka yang ditetapkan oleh indeks dari elemen array. Kemudian kita menginisialisasi nilai variabel ExtCountedBars ke 0; itu akan menyimpan jumlah bar yang sudah dihitung. Dengan demikian tidak akan ada kebutuhan untuk melakukan perhitungan rutin untuk semua bar, yang akan mempercepat perhitungan nilai indikator serta pergerakan grafik indikator. Baris berikutnya demikianlah variabel global periode yang akan menyimpan jumlah interval, di mana indikator menghitung statistiknya. Harap dicatat bahwa penggunaan modifier extern memungkinkan kita untuk mengubah period parameter dengan cara sifat indikator tanpa perlunya kompilasi ulang.


Mari kita mempertimbangkan fungsi Initialize (), di mana kita akan menentukan pengaturan dasar untuk indikator kami.


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

Metode SetIndexCount dari objek Indicator menetapkan jumlah buffer untuk nilai-nilai indikator. Kami memiliki satu buffer dengan nilai-nilai ExtMapBuffer1, jadi kami tentukan 'satu' sebagai satu-satunya parameter. Kami juga akan perlu untuk menghubungkan jumlah buffer untuk array dengan nilai-nilai penyangga. link ini ditentukan pada baris Indicator.SetIndexBuffer (0, ExtMapBuffer1), di mana ia menetapkan bahwa sifat indikator zeroth akan digunakan untuk membuat nilai-nilai yang disimpan dalam buffer ExtMapBuffer1. Pada baris berikutnya, kita mengatur properti untuk indikator kami. Parameter pertama dari metode SetIndexStyle adalah jumlah buffer, yang merupakan nilai '0' yang kita ditentukan dalam SetIndexBuffer. Parameter kedua mendefinisikan jenis gambar - histogram. Dalam parameter ketiga, kita tentukan gaya garis lsSolid (sebenarnya, di sini kita dapat menentukan nilai apapun, karena nilai parameter ini hanya mempengaruhi garis dan bar chart dengan ketebalan 1). Dalam parameter berikutnya, kita menetapkan ketebalan 5 dari garis dan warna biru dengan menggunakan clrBlue konstan yang sesuai (kami juga dapat menentukan warna dalam format RGB, misalnya, 0x0000FF).


Kemudian datang Run () fungsi yang melakukan pemeriksaan dasar dan menjalankan fungsi pengguna imbang (), yang mengimplementasikan seluruh perhitungan.


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

Kami menyimpan di ExtCountedBars variabel global jumlah bar yang belum berubah sejak panggilan terakhir. Kami telah menghitung nilai-nilai ini, sehingga mereka tidak perlu dihitung ulang lagi. Berikutnya, kita menentukan bahwa kita berhenti pada render indikator di ExtCountedBars< 0. Kemudian imbang () fungsi yang disebut akan menghitung nilai-nilai dan menemukan mereka di buffer indikator.


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--; } }

Dalam 'int pos = Chart.Bars-ExtCountedBars-1' line, kita menentukan posisi awal untuk menghitung nilai bergerak dari data sebelum yang terakhir. Dengan jumlah bar sebesar Chart.Bars, elemen jauh akan memiliki indeks Chart.Bars-1; memperhitungkan jumlah bar yang sudah dihitung, indeks akan Chart.Bars-ExtCountedBars-1. Nilai variabel yang digunakan untuk mengumpulkan statistik. Kemudian, dalam siklus dari Chart.Bars-ExtCountedBars-1 ke 0, kami mengumpulkan statistik untuk setiap bar untuk tidak lebih dari periode posisi belakang (tidak perlu untuk menghitung nilai data dibongkar).


Menempatkan semua kode bersama-sama:


#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--; } }

Sekarang mari kita membuat sedikit perbaikan untuk indikator: kolom negatif akan ditampilkan dalam satu warna, yang positif - lain. Pada saat yang sama, masing-masing kolom juga akan memiliki dua warna. Untuk tugas ini, kita perlu 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--; } }

Versi indikator baru dengan bar berwarna:

 NTL+ (the NetTradeX Language)

Saat menulis kode indikator, Anda mungkin melihat "run function call failed" Pesan (panggilan tidak berhasil dari fungsi run). Kesalahan ini kemungkinan besar terjadi ketika nilai-nilai yang disimpan dalam elemen dengan indeks non-ada. Jadi, jika pesan seperti itu muncul, Anda perlu hati-hati merevisi nilai untuk indeks penyangga berbagai.


Ringkasan

Dalam artikel ini, langkah demi langkah, kami berhasil melalui penciptaan indikator pertama kami. Pada saat yang sama, pelaksanaannya dilakukan sedemikian rupa sehingga untuk menyederhanakan pemahaman naskah di NTL+. Walaupun indikator itu sendiri mungkin tidak ada gunanya dalam perdagangan, pelaksanaan teknis indikator yang tercakup dalam artikel akan menjadi berharga pengalaman bagi semua orang bersedia untuk membuat satu.

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