Sebahagian besar maklumat yang diproses oleh program aplikasi terkandung dalam tatasusunan.
Konsep Array
Array adalah satu set nilai-nilai dari satu pemboleh ubah jenis yang mempunyai nama yang sama. Array boleh menjadi satu dimensi dan multidimensional. Jumlah maksimum dimensi dalam array ialah empat. Array mana-mana jenis data dibenarkan.
Unsur Array adalah sebahagian daripada array; ia adalah pembolehubah yang diindeks yang mempunyai nama yang sama dan beberapa nilai.

Pengindeksan
Indeks elemen susunan adalah satu atau beberapa nilai integer yang ditunjukkan dalam bentuk pemalar, pemboleh ubah atau ungkapan yang dihitung yang dipisahkan koma dalam kurungan persegi. Indeks elemen susunan unik menentukan tempat elemen dalam tatasusunan. Indeks elemen susunan ditunjukkan selepas pengenal pemboleh ubah (nama array) dan merupakan bahagian penting dari elemen tatasusunan. Dalam MQL4 indexing start form sifar digunakan.

Cara menentukan indeks apabila setiap indeks dalam kurungan persegi juga boleh diterima:

Analog hampir setiap hari dari pelbagai dua dimensi adalah dewan pawagam. Nombor baris adalah nilai indeks pertama, bilangan tempat dalam mentah adalah nilai indeks kedua, penonton adalah elemen array, nama penonton adalah nilai elemen array, tiket wayang (menentukan baris dan tempat) adalah satu kaedah untuk mengakses nilai elemen tatasusunan.
Pengisytiharan Array dan Akses kepada Unsur Array
Sebelum menggunakan array dalam program, ia mesti diisytiharkan. Arahan boleh diisytiharkan seperti pembolehubah di peringkat global dan tempatan. Oleh itu, nilai-nilai elemen global yang tersedia untuk keseluruhan program, nilai-nilai tempatan – hanya untuk fungsi, di mana ia diisytiharkan. Arahan tidak boleh diisytiharkan pada tahap terminal klien, sebab itu pembolehubah global terminal klien tidak dapat dikumpulkan ke dalam array. Nilai elemen susunan boleh menjadi jenis apa pun. Nilai semua elemen array adalah jenis yang sama, iaitu jenis yang ditunjukkan pada deklarasi array. Apabila mengisytiharkan pelbagai, jenis data, nama pelbagai dan bilangan unsur setiap dimensi mesti dinyatakan:

Akses ke elemen array dilaksanakan elementwise, iaitu pada satu ketika hanya satu komponen boleh diakses. Jenis nilai komponen komponen tidak dinyatakan dalam program ini. Nilai komponen susunan boleh ditugaskan atau diubah menggunakan pengendali tugasan:

Nilai elemen array dalam Rajah 59 adalah seperti berikut:
- untuk satu dimensi, array Mas [4] nilai unsur adalah integer 34;
- untuk pelbagai dua dimensi, Mas [3,7] nilai unsur adalah integer 28;
- untuk tatasusunan tiga dimensi, Mas [5,4,1] nilai unsur adalah integer 77.
Nota: nilai minimum indeks elemen tatasusunan ialah 0 (sifar) dan nilai maksimal lebih kecil oleh satu daripada bilangan elemen dalam dimensi yang sama yang ditunjukkan pada perisytiharan array.
Sebagai contoh, untuk array Mas [10] [15] elemen dengan nilai indeks terkecil adalah elemen Mas [0,0], yang dengan nilai indeks maksimal adalah elemen Mas [9,14].Operasi dengan tatasusunan juga boleh dijalankan menggunakan fungsi standard. Untuk maklumat lanjut, sila rujuk dokumentasi di laman web pemaju (https://docs.mql4.com) atau ke “Bantuan” di MetaEditor. Beberapa fungsi ini dianalisis lagi.
Inisialisasi Array
Arahan boleh dimulakan hanya oleh pemalar jenis yang sepadan. Array satu dimensi dan pelbagai dimensi diinisialisasi oleh urutan pemalar satu dimensi yang dipisahkan oleh koma. Urutan dimasukkan ke dalam kurungan kerinting:
int Mas_i[3][4] = { 0, 1, 2, 3, 10, 11, 12, 13, 20, 21, 22, 23 }; double Mas_d[2][3] = { 0.1, 0.2, -0.3, -10.2, 1.5, 7.0 }; bool Mas_b[5] = { false, true, false, true, true }
Dalam urutan yang diisytiharkan satu atau beberapa pemalar boleh ditinggalkan. Dalam kes sedemikian pelbagai elemen bersamaan jenis bernombor diisytiharkan oleh sifar, unsur-unsur susunan jenis rentetan diinisialisasi oleh nilai rentetan “” (tanda petikan tanpa ruang), iaitu dengan garisan kosong (tidak boleh dikelirukan dengan ruang ). Program seterusnya memaparkan nilai-nilai array, diasumsikan oleh turutan dengan penolakan beberapa nilai (script arrayalert.mq4):
//-------------------------------------------------------------------- // arrayalert.mq4 // The code should be used for educational purpose only. //-------------------------------------------------------------------- int start() // Special funct. start() { string Mas_s[4] = {"a","b", ,"d"}; // String array int Mas_i[6] = { 0,1,2, ,4,5 }; // Integer type array Alert(Mas_s[0],Mas_s[1],Mas_s[2],Mas_s[3]); // Displaying Alert(Mas_i[0],Mas_i[1],Mas_i[2],Mas_i[3],Mas_i[4],Mas_i[5]); return; // Exit start() } //--------------------------------------------------------------------
Sekiranya saiz satu dimensi array dimulakan tidak ditentukan, ia ditakrifkan oleh pengkompil berdasarkan urutan permulaan. Arahan boleh juga diasaskan oleh fungsi standard ArrayInitialize (). Semua tatasusunan bersifat statik, iaitu jenis statik walaupun pada inisialisasi ini tidak dinyatakan secara jelas. Ini bermakna semua tatasusunan mengekalkan nilai-nilai mereka antara panggilan fungsi, di mana array diisytiharkan (lihat Jenis Pembolehubah).
Semua tatasusunan yang digunakan dalam MQL4 boleh dibahagikan kepada dua kumpulan: tatasusunan yang ditakrifkan oleh pengguna (dicipta oleh inisiatif pengaturcara) dan arrays-timeseries (tatasusunan dengan nama dan jenis data yang telah ditetapkan). Menentukan saiz tatasusunan yang ditentukan pengguna dan nilai unsur-unsur mereka bergantung kepada bagaimana sebuah program dicipta dan, pada akhirnya, pada kehendak seorang programer. Nilai elemen tatasusunan yang ditentukan pengguna dipelihara semasa keseluruhan masa pelaksanaan program dan boleh diubah selepas pengiraan. Walau bagaimanapun, nilai-nilai unsur dalam array-timeseries tidak boleh diubah, saiz mereka boleh ditingkatkan apabila sejarah dikemas kini.
Aras Ditetapkan Pengguna
Dalam seksyen Operator switch ‘kami menganalisis Masalah 18. Mari membuatnya lebih rumit (menambah bilangan mata yang ditulis dalam kata-kata ke 100) dan cari penyelesaian menggunakan array.
Masalah 25. Buat program, di mana syarat-syarat berikut dilaksanakan: jika harga melebihi tahap tertentu, memaparkan mesej, di mana lebihan ditunjukkan (sehingga 100 mata); dalam kes lain memberitahu bahawa harga tidak melebihi tahap ini .
Penyelesaian Masalah 25 menggunakan array rentetan boleh menjadi berikut (Expert Advisor stringarray.mq4):
//-------------------------------------------------------------------- // stringarray.mq4 // The code should be used for educational purpose only. //-------------------------------------------------------------------- extern double Level=1.3200; // Preset level string Text[101]; // Array declaration //-------------------------------------------------------------------- int init() // Special funct. init() { // Assigning values Text[1]="one "; Text[15]="fifteen "; Text[2]="two "; Text[16]="sixteen "; Text[3]="three "; Text[17]="seventeen "; Text[4]="four "; Text[18]="eighteen "; Text[5]="five "; Text[19]="nineteen "; Text[6]="six "; Text[20]="twenty "; Text[7]="seven "; Text[30]="thirty "; Text[8]="eight "; Text[40]="forty "; Text[9]="nine "; Text[50]="fifty "; Text[10]="ten "; Text[60]="sixty"; Text[11]="eleven "; Text[70]="seventy "; Text[12]="twelve "; Text[80]="eighty "; Text[13]="thirteen "; Text[90]="ninety"; Text[14]="fourteen "; Text[100]= "hundred"; // Calculating values for(int i=20; i<=90; i=i+10) // Cycle for tens { for(int j=1; j<=9; j++) // Cycle for units Text[i+j]=Text[i] + Text[j]; // Calculating value } return; // Exit init() } //-------------------------------------------------------------------- int start() // Special funct. start() { int Delta=NormalizeDouble((Bid-Level)/Point,0);// Excess //-------------------------------------------------------------------- if (Delta>=0) // Price is not higher than level { Alert("Price below level"); // Alert return; // Exit start() } //-------------------------------------------------------------------- if (Delta<100) // Price higher than 100 { Alert("More than hundred points"); // Alert return; // Exit start() } //-------------------------------------------------------------------- Alert("Plus ",Text[Delta],"pt."); // Displaying return; // Exit start() } //--------------------------------------------------------------------
Dalam penyelesaian masalah array array Teks [] digunakan. Semasa nilai pelaksanaan program unsur array tidak berubah. Aras ini diisytiharkan pada tahap global (di luar fungsi khas), pemecahan pelbagai awal dilakukan dalam init (). Oleh itu, dalam fungsi khas mula () sahaja pengiraan yang diperlukan pada setiap tanda dilakukan.Untuk beberapa bahagian nilai [[unsur-unsur array teks]]] pemalar string diberikan. Kepada bahagian-bahagian lain nilai yang dikira dalam termasuk kitaran dengan garis penjumlahan diberikan.
for (int i = 20; i<=90; i=i+10) // Cycle for tens { for (int j=1; j<=9; j++) // Cycle for units Text[i+j] = Text[i] + Text[j]; // Calculating value }
Makna pengiraan ini dapat difahami dengan mudah: untuk setiap elemen array dengan indeks dari 21 hingga 99 (kecuali indeks berganda dari 10) nilai rentetan yang bersesuaian dikira. Beri perhatian kepada nilai indeks yang dinyatakan dalam garisan:
Text[i+j] = Text[i] + Text[j]; // Calculating value
Sebagai pembolehubah nilai indeks (nilai yang berubah dalam kitaran) dan ungkapan digunakan. Bergantung pada nilai pemboleh ubah i dan j, program ini akan merujuk kepada Tex yang bersamaan

Arrays-Timeseries

Bars counting starts from a zero bar.

//-------------------------------------------------------------------- // extremumprice.mq4 // The code should be used for educational purpose only. //-------------------------------------------------------------------- extern int Quant_Bars=30; // Amount of bars //-------------------------------------------------------------------- int start() // Special funct. start() { int i; // Bar number double Minimum=Bid, // Minimal price Maximum=Bid; // Maximal price for(i=0;i<=Quant_Bars-1;i++) // From zero (!) to.. { // ..Quant_Bars-1 (!) if (Low[i]< Minimum) // If < than known Minimum=Low[i]; // it will be min if (High[i]> Maximum) // If > than known Maximum=High[i]; // it will be max } Alert("For the last ",Quant_Bars, // Show message " bars Min= ",Minimum," Max= ",Maximum); return; // Exit start() } //--------------------------------------------------------------------
for(i=0;i<=Quant_Bars-1;i++) // From zero (!) to.. { // ..Quant_Bars-1 (!) if (Low[i]< Minimum) // If < than known Minimum = Low[i]; // it will be min if (High[i]> Maximum) // If > than known Maximum = High[i]; // it will be max }
if (Low[i]< Minimum) // If < than known Minimum = Low[i]; // it will be min if (High[i]> Maximum) // If > than known Maximum = High[i]; // it will be max

//-------------------------------------------------------------------- // newbar.mq4 // The code should be used for educational purpose only. //-------------------------------------------------------------------- extern int Quant_Bars=15; // Amount of bars bool New_Bar=false; // Flag of a new bar //-------------------------------------------------------------------- int start() // Special funct. start() { double Minimum, // Minimal price Maximum; // Maximal price //-------------------------------------------------------------------- Fun_New_Bar(); // Function call if (New_Bar==false) // If bar is not new.. return; // ..return //-------------------------------------------------------------------- int Ind_max =ArrayMaximum(High,Quant_Bars,1);// Bar index of max. price int Ind_min =ArrayMinimum(Low, Quant_Bars,1);// Bar index of min. price Maximum=High[Ind_max]; // Desired max. price Minimum=Low[Ind_min]; // Desired min. price Alert("For the last ",Quant_Bars, // Show message " bars Min= ",Minimum," Max= ",Maximum); return; // Exit start() } //-------------------------------------------------------------------- void Fun_New_Bar() // Funct. detecting .. { // .. a new bar static datetime New_Time=0; // Time of the current bar New_Bar=false; // No new bar if(New_Time!=Time[0]) // Compare time { New_Time=Time[0]; // Now time is so New_Bar=true; // A new bar detected } } //--------------------------------------------------------------------
if(New_Time != Time[0]) // Compare time { New_Time = Time[0]; // Now time is so New_Bar = true; // A new bar detected }
if (New_Bar == false) // If bar is not new.. return; // ..return
