Arrays

By | 27/09/2019

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

Fig. 61. Each bar is characterized by a set of values contained in arrays-timeseries.
Bars counting starts from a zero bar.

Fig. 62. Bars are shifted after some time, while numeration is not shifted.

//--------------------------------------------------------------------
// 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

Fig. 63. Result of the EA extremumprice.mq4 operation.

//--------------------------------------------------------------------
// 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

Fig. 64. Expert Advisor newbar.mq4 operation result.

Leave a Reply

Your email address will not be published. Required fields are marked *