Yeni başlayanlardan sorular MQL5 MT5 MetaTrader 5 - sayfa 1466

 

İyi günler. Mql5'te bir Uzman Danışman yazarken bir sorunla karşılaştım. Yıl için açılan mum çubuklarının değerlerini içeren bir dizi var. Bu dizinin her mum çubuğunda, yüksekleri ve alçakları kontrol etmek için 30 gibi bir n-mum dizisi oluşturmam gerekiyor. Zigzag göstergesi gibi bir şey.

Hata veren bu kodu yazdım: "dizi aralık dışı" veya tüm dizideki maksimum ve minimum değerler, ancak gerekli 30 mumluk dönemde değil.

for(int i=0; i<ArraySize(opens); i++)
  {
    if(i+30<=ArraySize(opens))
      {
       double maximum=0;
       double minimum=9;
       for(int j=0; j<30; j++)
        {
         maximum = ArrayMaximum(opens, i, i+j);
         minimum = ArrayMaximum(opens, i, i+j);
        }
     }
  }

Belki de ArrayMaximum() ve ArrayMinimum () işlevlerinde kontrol etmek için başka bir dizi oluşturmam gerekiyor, ancak iç içe döngüler ve dizi boyutu ile kafam karıştı.

Lütfen bana bir ipucu verin.

 
Dmitry Ivanushko #:
if(i+30<=ArraySize(opens))
if(i+30<ArraySize(opens))

İşte dizinin dışındaki çıktı

 
if(i+30<ArraySize(opens))

Bu hata dikkatsizlikten kaynaklanmaktadır. Düzeltmek sorunu çözmez.

İçinde en yüksek ve en düşük fiyatları aramak için 30 mum çubuğu açılış fiyatından oluşan bir dizi nasıl oluşturabilirim?

 
Dmitry Ivanushko #:
ArrayMaximum
ArrayMaximum

Geri dönüşler indeks fiyat değil, maksimum değerdir.

//+------------------------------------------------------------------+
int indexMax[];
int indexMin[];
int sizeArray = ArraySize(opens);
int size = 0;
int n = 30;

for(int i = n; i < sizeArray; i + n)
  {
   ArrayResize(indexMax, size + 1);
   indexMax[size] = ArrayMaximum(opens, i - n, i);
   indexMin[size] = ArrayMinimum(opens, i - n, i);
   size++;
  }
//+------------------------------------------------------------------+

Kontrol etmedim, ancak mum çubuğu açılışlarının (açılışlar) minimum ve maksimumlarının endekslerini almanın yolu bu gibi görünüyor.

Gerçi fiyatı da bir kerede alabilirsiniz, ancak endeksleri alamazsınız.

double PriseMin = opens[ArrayMinimum(opens, i - n, i)];
 
for(int i = n; i < sizeArray; i + n)

Hiçbir yerde adımlı bir mql döngüsü örneği bulamadım. Bu tüm meseleyi basitleştirir.

Sadece ChatGPT bana bu şekilde yazmamı tavsiye etti:

for(int i = n; i < sizeArray; i += n)

Daha fazla deneme yapacağım. Kod çalışıyor. Teşekkür ederim.

ArrayResize yapmazsanız "array out of range" hatası oluşur.

 
Dmitry Ivanushko #:

Bu hata dikkatsizlikten kaynaklanmaktadır. Bunu düzeltmek sorunu çözmez.

İçinde en yüksek ve en düşük fiyatları aramak için 30 mum çubuğu açılış fiyatından oluşan bir diziyi nasıl oluşturabilirim?

Sorun nedir? Bir temp[] dizisi tanımlayın ve içine 30 eleman kopyalayın ve minimum/maksimum değerin indeksini arayın. Ve sonunda 30'dan az ise, kaç tane kaldığını kopyalayacaktır. Ve bu durumda, bir while() döngüsü kullanmayı tercih ederim.

 
Alexey Viktorov #:
Sorun nedir? Bir temp[] dizisi tanımlayın ve içine 30 eleman kopyalayın ve minimum/maksimum değerin indeksini arayın. Ve sonunda 30'dan az ise, kaç tane kaldığını kopyalayacaktır. Ve bu durumda, bir while() döngüsü kullanmayı tercih ederim.

Evet, bunu yapabilirsin. Düzgün düşünemiyorum, bu yüzden tavsiye istiyorum.

 
Dmitry Ivanushko #:

Evet, bunu yapabilirsin. Düzgün düşünemiyorum, o yüzden tavsiye istiyorum.

Statik bir dizide boyut sabittir, değiştirilemez, dinamik bir dizide değiştirilebilir, ancak dizinin boyutu ayarlanmıştır! Yani dizinin boyutu ve 0'dan sona kadar olan elemanların indisleri bilinir. <= sınırların dışındadır çünkü sıfırdan itibaren elemanların indisleri ve son elemanın indisi dizi boyutunun bir birimi kadar daha azdır.

Her şey sizin elinizde))))

 
Valeriy Yastremskiy #:

Statik bir dizide boyut sabittir ve değiştirilemez, dinamik bir dizide değiştirilebilir, ancak dizinin boyutu ayarlanmıştır! Yani, dizinin boyutu bilinir ve elemanların indisleri 0'dan sonuna kadardır. <= sınırların dışındadır, çünkü elemanların indisleri sıfırdan başlar ve son elemanın indisi dizi boyutunun bir birimi kadar daha azdır.

Her şey sizin elinizde))))

Bununla ne demek istiyorsunuz? Bir diziden diğerine, temp[] dizisine belirli sayıda eleman kopyalamak için, kopyalamadan önce dizi boyutunu ayarlamanız gerektiğini düşünüyor musunuz ArrayResize(temp, new_size); ?????

 
Dmitry Ivanushko #:

Evet, bunu yapabilirsin. Düzgün düşünemiyorum, o yüzden tavsiye istiyorum.

Geçici bir diziye bile ihtiyacınız yok.

int  ArrayMaximum( 
   const void&   array[],             // массив для поиска 
   int           start=0,             // с какого индекса начинаем поиск 
   int           count=WHOLE_ARRAY    // количество проверяемых 
   );

Bu kod

  double open[];
  int copy = CopyOpen(_Symbol, PERIOD_CURRENT, 0, 100, open);
  int arrMaximum = ArrayMaximum(open, 85, 20);

20 öğe arayacak şekilde ayarlanmış olmasına rağmen kalan en fazla 15 öğeyi arar.

Bu yüzden while() döngüsünü kullanmanız ve kalan dizi öğelerinin sayısı hakkında endişelenmemeniz daha iyi olur.