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

 
Aleksandr Slavskii #:

"ticks dizisindeki maksimum değeri bulun" - neyin maksimum değerini buluyoruz?

ticks[copied-1].bid veya ticks[copied-1].flags

Sadece şaka)))))


Büyük olasılıkla CopyTicks'i CopyRates ile karıştırdınız, ancak orada da bir dizi yapıya sahipsiniz ve yapının hangi öğesine ihtiyacınız olduğunu belirtiyorsunuz.

double PrevClose = rates[copied-1].close;

Kodunuzda fazladan bir satır var.

Buna ihtiyacınız yok çünkü CopyTicks ve CopyRates kopyalama sırasında dizi boyutunu kendisi ayırır.

İpucu için teşekkür ederim. Bilmiyordum. Her ihtimale karşı bu satırı ekliyorum.

Şakanızı doğru anladım mı, oranlarda tüm fiyatların ortalaması alınır ve çubuğu hesaba katarken, tiklerde dikkate alınmaz mı? Bu yüzden çubuk fiyatlarını değil, keyfi bir zaman aralığını kullanmak için tik aldım. Benzer formülümdeki CopyRates, kopyalanan değişkeni saat aralığı için ulong türünün maksimum değeriyle doldurdu. Bu sorunu da çözemedim.

 
maxvoronin74 #:

İpucu için teşekkürler. Bilmiyordum. Her ihtimale karşı bu satırı ekliyorum.

Kurların tüm fiyatların ortalamasını aldığı ve çubuğu hesaba kattığı, ancak tiklerin hesaba katılmadığı şakanızı doğru anlıyor muyum? Bu yüzden çubuk fiyatlarını değil, keyfi bir zaman aralığını kullanmak için tik aldım. Benzer formülümdeki CopyRates, kopyalanan değişkeni saat aralığı için ulong türünün maksimum değeriyle doldurdu. Bu sorunu da çözemedim.

Her şey yanlış.

MqlRates bir yapıdır ve siz onu bir değişken olarak ele alıyorsunuz.

MqlTick de bir yapıdır.

Sıcak ve yumuşak olanı birleştirmeye çalışıyorsunuz, bu yüzden derleyici sizi anlamıyor.

Ben de anlamıyorum)))))

Belki faydalı bir şey önerebilirim, ancak kodunuzdan ne bulmaya çalıştığınız net değil.

 
Aleksandr Slavskii #:

Her şey yanlış.

MqlRates bir yapıdır ve siz onu bir değişken olarak ele alırsınız.

MqlTick de bir yapıdır.

Sıcak ve yumuşak olanı birleştirmeye çalışıyorsunuz, bu yüzden derleyici sizi anlamıyor.

Ben de öyle))))

Belki faydalı bir şey önerebilirim, ancak kodunuzdan ne bulmaya çalıştığınız net değil.

Görev, WPR'yi (Williams Yüzde Aralığı) değiştirmektir, böylece çubuklardan bağımsız olarak keyfi bir süre için WPR değerlerinin farkını elde etmektir.
 
maxvoronin74 #:
Görev, WPR'yi (Williams Yüzde Aralığı) değiştirmektir, böylece çubuklardan bağımsız olarak keyfi bir süre için WPR değerlerinin farkını elde etmektir.

Elde etmek istediğiniz şeyin bu olması mümkündür (ancak kesin değildir).

   MqlTick ticks[];
   int copied = CopyTicksRange(Symbol(), ticks, COPY_TICKS_INFO, t0, t1);
   double bid[];
   for(int i = 0; i < copied; i++)
      bid[i] = ticks[i].bid;
   double PrevClose = bid[copied - 1]; // Получаем последний элемент массива как значение PrevClose
   double highestHigh = ArrayMaximum(bid, 0, copied); // Находим максимальное значение в массиве ticks
   double lowestLow = ArrayMinimum(bid, 0, copied); // Находим минимальное значение в массиве ticks
 
Aleksandr Slavskii #:
double lowestLow = ArrayMinimum(bid, 0, copied);

Teşekkür ederim. Dersi doğru anladıysam, elde ettiğim şey şu:

MqlTick ticks[];
int copied=CopyTicksRange(Symbol(),ticks,COPY_TICKS_INFO,t0,t1);
double bid_arr[];
double ask_arr[];
for(int i = 0; i < copied; i++)
{
   bid_arr[i] = ticks[i].bid;
   ask_arr[i] = ticks[i].ask;
}
double highestBid = ArrayMaximum(bid_arr, 0, copied-1);
double lowestBid = ArrayMinimum(bid_arr, 0, copied-1);
double highestAsk = ArrayMaximum(ask_arr, 0, copied-1);
double lowestAsk = ArrayMinimum(ask_arr, 0, copied-1);
double highestHigh = (highestBid+highestAsk)/2; // Средняя наибольшего ask и наибольшего bid элемента
double lowestLow = (lowestBid+lowestAsk)/2; // Средняя наименьшего ask и наименьшего bid элемента
double PrevClose = (bid_arr[copied-1]+ask_arr[copied-1])/2; // Средняя ask и bid последнего элемента
double WPR_Past = -100 * (NormalizeDouble((highestHigh - PrevClose) / (highestHigh - lowestLow),_Digits)); // Формула предыдущего WPR
Ancak maalesef bid_arr[i] = ticks[i].bid; satırında Uzman Danışman, 'namemyexpert.mq5' (204,12) içindeki aralık dışı dizi nedeniyle grafikten çıktı.
 
maxvoronin74 #:

Teşekkür ederim. Dersimi doğru öğrendiysem, ortaya çıkan şey şu:

Zaten tüm tikler üzerinden döngü yaptığımız için bu döngüde kopyalama yapamayız ama maksimum-minimumları tek seferde ararız.

Bu arada kopyalama yapacaksak önce kopyaladığımız dizilerin boyutlarını ayarlamamız iyi olur, döngü bunu bizim için yapmayacak, ilk iterasyonda dizinin dışına uçacağız. Sadece CopyTicksRange hedef dizinin kendisini yeniden boyutlandıracaktır.

 
JRandomTrader #:

Zaten tüm keneler arasında döngü yaptığımız için, bu döngüde kopyalayamayız, ancak bu maksimum-minimumları bir kerede arayabiliriz.

Bu arada kopyalama yapacaksak önce kopyaladığımız dizilerin boyutlarını ayarlamak iyi olur, döngü bunu bizim için yapmayacak, ilk iterasyonda dizinin dışına uçacağız. Sadece CopyTicksRange hedef dizinin kendisini yeniden boyutlandıracaktır.

Ben mükemmeliyetçiyim, bir yapı dizisinin ayrı elemanlarını sıralamak straforla cama vurmak gibidir.
Ayrılmamış dizi hakkında, iyi bir nedenim var. Saat sabahın biri ve eşim kulağımda "uyku zamanı, uyku zamanı" diyor. ))))))
 
Aleksandr Slavskii #:
Ben mükemmeliyetçi biriyim, bir dizi yapının elemanlarını tek tek sıralamak cama straforla vurmak gibidir.
Dizinin dağıtılmaması konusunda iyi bir nedenim var. Saat sabahın biri ve eşim kulağımda "uyku vakti, uyku vakti" diyor. ))))))
Ne, gece mi sabah mı bir incir).
Evet, bir kerede en yüksek değeri aramak konusunda haklısınız. Bu şekilde çok daha uygun. Bu sabah biraz aptalım.
 
JRandomTrader #:

Zaten tüm keneler arasında döngü yaptığımız için, bu döngüde kopyalayamayız, ancak bu maksimum-minimumları bir kerede arayabiliriz.

Bu arada kopyalama yapacaksak önce kopyaladığımız dizilerin boyutlarını ayarlamak iyi olur, döngü bunu bizim için yapmayacak, ilk iterasyonda dizinin dışına uçacağız. Sadece CopyTicksRange hedef dizinin kendisini yeniden boyutlandıracaktır.

Özür dilerim. Dikkatsizliğim. Düzeltildi. Teşekkürler. ArrayMaximum değerinin bir fiyat değil, bir indeks olduğunu unutmuşum. Ama şimdi düzeltildi.

MqlTick ticks[];
int copied=CopyTicksRange(Symbol(),ticks,COPY_TICKS_INFO,t0,t1);
double bid_arr[];
ArrayResize(bid_arr,copied,100000);
double ask_arr[];
ArrayResize(ask_arr,copied,100000);
for(int i = 0; i < copied; i++)
{
   bid_arr[i] = ticks[i].bid;
   ask_arr[i] = ticks[i].ask;
}
int IndMaxBid = ArrayMaximum(bid_arr, 0, copied-1); // Индекс элемента массива bid_arr с максимальной ценой
double highestBid = bid_arr[IndMaxBid]; // Самая высокая цена bid за период
int IndMinBid = ArrayMinimum(bid_arr, 0, copied-1); // Индекс элемента массива bid_arr с минимальной ценой
double lowestBid = bid_arr[IndMinBid]; // Самая низкая цена bid за период
int IndMaxAsk = ArrayMaximum(ask_arr, 0, copied-1); // Индекс элемента массива ask_arr с максимальной ценой
double highestAsk = ask_arr[IndMaxAsk]; // Самая высокая цена ask за период
int IndMinAsk = ArrayMinimum(ask_arr, 0, copied-1); // Индекс элемента массива ask_arr с минимальной ценой
double lowestAsk = ask_arr[IndMinAsk]; // Самая низкая цена ask за период
double highestHigh = (highestBid+highestAsk)/2; // Средняя наибольшего ask и наибольшего bid элемента
double lowestLow = (lowestBid+lowestAsk)/2; // Средняя наименьшего ask и наименьшего bid элемента
double PrevClose = (bid_arr[copied-1]+ask_arr[copied-1])/2; // Средняя ask и bid последнего элемента
double WPR_Past = -100 * (NormalizeDouble((highestHigh - PrevClose) / (highestHigh - lowestLow),_Digits)); // Формула предыдущего WPR

ArrayMaximum ticks dizisi ile çalışmadığından, bir döngü içinde if ile alternatif hesaplamalar denedim. Bu neden daha iyi?

 
maxvoronin74 #:

Neden daha iyi?

   MqlTick ticks[];
   int copied = CopyTicksRange(Symbol(), ticks, COPY_TICKS_INFO, t0, t1);
   double highestHigh = 0, lowestLow = DBL_MAX;
   for(int i = 0; i < copied; i++)
     {
      if(highestHigh < ticks[i].ask) // Находим максимальное значение в массиве ticks
         highestHigh = ticks[i].ask;
      if(lowestLow > ticks[i].bid) // Находим минимальное значение в массиве ticks
         lowestLow = ticks[i].bid;
     }