"MQL5 Programlama Temelleri: Diziler" makalesi için tartışma - sayfa 3

 
Ernie Gunning:

Tamam, MQL'in İngilizce versiyonunu deneyelim.


Kod gönderiniz için teşekkürler. Bana zaman kazandırdı. MQL dizilerini kullanmayı denedim ve kafa karıştırıcıydılar. Daha sonra orada olması gereken temel yapıları bir kez daha yazmam gerektiği için çok üzüldüm AMA sonra diziler ve bunların dinamik olarak nasıl büyütüleceği / artırılacağı konusunda bana biraz araştırma süresi kazandıran kodunuzu buldum. Harika, teşekkürler.

Umarım size geri dönebilirim! Aşağıdaki kod tüm veri türleri için çalışır. Nesneler üzerinde de çalışacaktır ancak Contains (arama) yöntemi çalışmayabilir. Ben sadece tipler üzerinde test ettim (double, int, bool). String de size sorun çıkarabilir ve kodun genişletilmesi gerekebilir.



Daha sonra ihtiyacınız olan tüm tipler için bu şekilde bildirimde bulunabilirsiniz:




umarım bu herkese yardımcı olur


Lütfen herhangi bir veri türü için Dinamik dizi kullanmak için yukarıdaki önerimi dikkate almayın. Zaten bildirilmiş genel bir CArrayList var. lütfen bunu kullanın. Nesneleri kullanırken bu başlıkta çözülen bir sorunla karşılaştım: https: //www.mql5.com/en/forum/358432

Using CArrayList gives error
Using CArrayList gives error
  • 2020.12.20
  • www.mql5.com
Hi Guys, Thanks for your time. I'm struggling to use the CArrayList in the generics folder. Are these interfaces and classes complete...
 
Sizden zaten bazı iyi makaleler okudum. Bu da bir istisna değildi.
 

arrayResize() fonksiyonunda bir hata görünüyor, örnekte dizinin içeriği 1, 2, 3 değil normal indekslemede 1, 1, 3'tür. Bu örneğe bakın:

//+------------------------------------------------------------------+
//|Yanlış.mq5 |
//|Telif Hakkı 2024, MetaQuotes Ltd. |
//| https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2024, MetaQuotes Ltd."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property indicator_chart_window
//+------------------------------------------------------------------+
//| Özel gösterge başlatma işlevi |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- gösterge tamponları eşleme
   
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Özel gösterge yineleme işlevi|
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
//---
   double ar[]; // Dizi
ArrayResize(ar,2); // Diziyi hazırlayın
ar[0]=1; // Değerleri ayarlayın
ar[1]=2; 
ArraySetAsSeries(ar,true); // İndeksleme sırasını değiştirin
ArrayResize(ar,3); // Dizi boyutunu artırın
ar[0]=3; // Yeni dizi elemanı için değer ayarlayın
Alert(ar[0]," ",ar[1]," ",ar[2]); // Dizi değerlerini yazdır
ArraySetAsSeries(ar,false);
Alert("Normal indexing: ", ar[0]," ",ar[1]," ",ar[2]); // Dizi değerlerini yazdır
//--- sonraki çağrı için prev_calculated değerini döndürür
   return(rates_total);
  }
//+------------------------------------------------------------------+
arraySetAsSeries() işlevi eklendiğinde, arrayresieze işlevinden etkileniyor gibi görünüyor, bu örneğe bakın:
//+------------------------------------------------------------------+
//|errorindex.mq5 |
//|Telif Hakkı 2024, MetaQuotes Ltd. |
//| https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2024, MetaQuotes Ltd."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property indicator_chart_window
//+------------------------------------------------------------------+
//| Özel gösterge başlatma işlevi |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- gösterge tamponları eşleme
   
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Özel gösterge yineleme işlevi|
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
//---
   double ar[]; // Dizi
ArrayResize(ar,2); // Diziyi hazırlayın
ar[0]=9; // Değerleri ayarlayın
ar[1]=8; 
ArrayResize(ar,6); // Dizi boyutunu artırın
Alert("Normal resize: ", ar[0]," ",ar[1]," ",ar[2]," ", ar[3], " ", ar[4], " ", ar[5]);
ArraySetAsSeries(ar,true); // İndeksleme sırasını değiştirin
ArrayResize(ar,4); // Dizi boyutunu artırın
ArraySetAsSeries(ar, false);
Alert("See the random element added: ", ar[0]," ",ar[1]," ",ar[2]," ", ar[3]);
ArraySetAsSeries(ar,true); // Dizinleme sırasını değiştir 0
ar[0]=8; // Yeni dizi elemanı için değer ayarlayın
Alert("Modify the first as serlies: ", ar[0]," ",ar[1]," ",ar[2]," ", ar[3]); // Dizi değerlerini yazdır
//--- sonraki çağrı için prev_calculated değerini döndürür
   return(rates_total);
  }
//+------------------------------------------------------------------+

Adımlar:

1. ar = {}
2. ar = {9, 8}

3. ar = {9, 8, 0, 8, 0, 0}

4. Seri doğru olarak ayarlanır:

ar = {0, 0, 8, 0, 8, 9}

5. 4'e yeniden boyutlandır

ar = {0, 0, 8, 0}

6. Seri yanlış olarak ayarlayın:

ar = {0, 8, 0, 0}

7. Seri doğru olarak ayarlanır:

ar = {0, 0, 8, 0}

8. İlk öğeyi değiştir a[0]

ar = {8, 0, 8, 0}


Hangi diziyi yeniden boyutlandırdığını bilmiyorum (3 -5) değerleri alır ve yeni konumlara kopyalar, 6 ileri rastgele değerler alır, sanırım. Önce resize() ve ardından setasseries() işlevini tercih ederim:

//+------------------------------------------------------------------+
//|indexingarraytest.mq5 |
//|Telif Hakkı 2024, MetaQuotes Ltd. |
//| https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2024, MetaQuotes Ltd."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property indicator_chart_window
//+------------------------------------------------------------------+
//| Özel gösterge başlatma işlevi |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- gösterge tamponları eşleme
   
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Özel gösterge yineleme işlevi|
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
//---
   double ar[]; // Dizi
ArrayResize(ar,2); // Diziyi hazırlayın
ar[0]=1; // Değerleri ayarlayın
ar[1]=2;
ArrayResize(ar,3); // Dizi boyutunu artırın
Alert("Redimension to 3 normal: ", ar[0], " ", ar[1], " ", ar[2]); 
ArraySetAsSeries(ar,true); // İndeksleme sırasını değiştirin
Alert("Redimension to 3 series: ", ar[0], " ", ar[1], " ", ar[2]); 
ar[0]=8; // Yeni dizi elemanı için değer ayarlayın
Alert("Change the first element: ", ar[0]," ",ar[1]," ",ar[2]); // Dizi değerlerini yazdır
ArraySetAsSeries(ar, false);
Alert("Normal renew: ", ar[0]," ",ar[1]," ",ar[2]); // Dizi değerlerini yazdır
//--- sonraki çağrı için prev_calculated değerini döndürür
   return(rates_total);
  }
//+------------------------------------------------------------------+