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

 
Ihor Herasko :


Aslına bakarsanız, soru. Uyku, göstergedeki verilerin yeniden hesaplanmasını hiçbir şekilde etkilememelidir. Tamponları doldurmada bir sorun var. Tekrarlanabilir bir kod parçası var mı?

Gösterge sipariş üzerine yazılmıştır - vahşi bir OOP var, anlamıyorum :(

Test eden kişinin çalışması ile gerçek hesap arasındaki tutarsızlığın nedenini bulana kadar bütün geceyi bu sorunla geçirdim, belki uyuduktan sonra gizli mantığın bir kısmını kaldırıp ekrana koyacağım.

 
Aleksey Vyazmikin :

Bir sorunla karşılaştım, gösterge tabanlı EA gerçek bir hesapta doğru çalışıyor, ancak hem OHLC hem de tüm keneler için kene oluşturma modlarında test cihazında yatıyor - sonuç aynı. Hatanın sonucu, sıfır çubuğunda boş bir gösterge arabelleğidir (yalnızca üst TF'de göstergeyi hesaplamak için kullanılan yeni bir çubuk göründüğünde). Ancak, EA'ya Uyku ekleyerek göstergeyi saymayı başardım ve daha sonra, kene oluşturma moduna bağlı olarak, bu Uykunun farklı olması gerektiği ortaya çıktı - Uyku (15000) tüm kenelerde oluşturmak için yeterlidir ve Uyku (30000) OHLC için gereklidir).

Bu nedenle, Uyku ile durumun normal olup olmadığı sorusu ortaya çıkıyor, çünkü mantıksal olarak kene oluşturma moduna bağlı olarak farklı gecikme sürelerinin modellendiği ortaya çıkıyor!?

Sevgili geliştiriciler, nedenin ne olduğunu anlayamadığım için açıklanan durumu göstergeyle netleştirmenizi rica ediyorum - kodda veya test cihazında bir hata!

Gösterge ve danışman kişisel olarak sunmaya hazır, sadece kime söyle.

göstergelerde öyle bir şaka var ki zaman serileri henüz hazır değil, yani. fiyatı bir diziye hemen kopyalayamaz. Bunu yapmak için, geçmişin TF tarafından mevcut olup olmadığını kontrol etmeniz, değilse tekrar kopyalamayı denemeniz ve bir döngüde yüklenene kadar beklemeniz gerekir.

bunlar bir programcının çarpık elleri, eğer bilmiyorsa

kayma normal değil
 
void OnChartEvent (             const int id,         // идентификатор события   
                               const long & lparam,   // параметр события типа long 
                               const double & dparam, // параметр события типа double 
                               const string & sparam // параметр события типа string 
                              )
   {
   Print (My_Name, " ---  " , id, "    lparam = " , lparam, "    dparam = " , dparam, "    sparam = " , sparam, "    ChartID() = " , ChartID () );         // <<|+|+|+<<  // 

   }                              

Açıkla lütfen..

Tuşa basıyorum = olay kimliği = 0 alıyorum. Bu birçok kez tekrarlanabilir. Boşluk çubuğuna basılana kadar sonuç aynıdır.

Boşluk çubuğuna basıldığında = Bir olay kimliği = 0 alıyorum. Bundan sonra, klavyeyle yapılan hiçbir değişiklik olaylara yol açmaz.

Sersemlikten çıkmak için fare düğmesine basıyorum = Bir olay kimliği alıyorum = 4. Ondan sonra tekrar klavyeye tıklayabilirsiniz = her tıklama için olaylar gelir. Boşluk çubuğuna basılana kadar = aynı sonuçla.

Soru: Aptal mıyım, bir şeyi anlamıyor muyum, yoksa anlamamalı mıyım? Lütfen bir bağlantı sağlayın.

 
Nikita Chernyshov :

Merhaba meslektaşlarım.

Soru şudur: mql4'te konum sayısını hesaplamak için bir fonksiyon yazmak mümkündü, örneğin,

Bu iş mql5'te nasıl uygulanır? Magick ile pozisyonları nasıl hesaplayabilirsiniz? yoksa türe göre mi?

Bu satırı MQL4 işlevinden önce ekleyin

 #include <MT4Orders.mqh> // https://www.mql5.com/ru/code/16006

ve MT5'te çalışacak.

 
Maxim Dmitrievsky :

göstergelerde öyle bir şaka var ki zaman serileri henüz hazır değil, yani. fiyatı bir diziye hemen kopyalayamaz. Bunu yapmak için, geçmişin TF tarafından mevcut olup olmadığını kontrol etmeniz, değilse tekrar kopyalamayı denemeniz ve bir döngüde yüklenene kadar beklemeniz gerekir.

bunlar bir programcının çarpık elleri, eğer bilmiyorsa

kayma normal değil

Bir test cihazında bu nasıl mümkün olabilir? Sorunun gerçek olup olmadığını veya test cihazında geçmiş olmadığını anlıyorum... Peki, bu kontrol nasıl olmalı?

Geliştiriciler mesajımı görmezden geliyor, bu talihsiz bir durum.

 
Aleksey Vyazmikin :

Bir test cihazında bu nasıl mümkün olabilir? Sorunun gerçek olup olmadığını veya test cihazında geçmiş olmadığını anlıyorum... Peki, bu kontrol nasıl olmalı?

Geliştiriciler mesajımı görmezden geliyor, bu talihsiz bir durum.

fiyatların kopyalanıp kopyalanmadığını kontrol etmek, Copyclose veya -1 döndüren herhangi bir şey kopyalanmadığı anlamına gelir

 
Maxim Dmitrievsky :

fiyatların kopyalanıp kopyalanmadığını kontrol etmek, Copyclose veya -1 döndüren herhangi bir şey kopyalanmadığı anlamına gelir

Gösterge, yeni bir çubuk göründüğünde 1 kez hesaplanır ve bu, doğru anlarsam şu şekilde uygulanır:

 //+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
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[])
  {
   static int counted_bars= 0 ;
   if (rates_total==prev_calculated) return (rates_total);

bu basit bir baskı ile onaylanır.

Bu nedenle durum net değil, hesaplama için fiyat olmadığını varsayarsak, gösterge 1 kez hesaplanacak ve arabellek boş kalacak, ancak durum böyle değil - uyku eklerseniz dolar. EA ve bekleyin. Belki gösterge yavaş yavaş hesaplıyor ve test cihazı bunu beklemiyor mu? Ama nasıl kontrol edilir?

 
Aleksey Vyazmikin :

Gösterge, yeni bir çubuk göründüğünde 1 kez hesaplanır ve bu, doğru anlarsam şu şekilde uygulanır:

bu basit bir baskı ile onaylanır.

Bu nedenle durum net değil, hesaplama için fiyat olmadığını varsayarsak, gösterge 1 kez hesaplanacak ve arabellek boş kalacak, ancak durum böyle değil - uyku eklerseniz dolar. danışman ve bekleyin. Belki gösterge yavaş yavaş hesaplıyor ve test cihazı bunu beklemiyor mu? Ama nasıl kontrol edilir?

belki bir zamanlayıcı ile zamana ihtiyacın var

 
Maxim Dmitrievsky :

belki bir zamanlayıcı ile zamana ihtiyacın var

Evet, EA'daki bir zamanlayıcı ile test, bir zamanlayıcı olmadan biraz daha ileri gider, ancak Sleep ile olduğundan daha kötüdür ve zamanlayıcı esasen Sleep ile aynıdır.

Görünüşe göre sorunun ne olduğunu anlıyorum, gösterge diğer iki göstergenin verilerine göre hesaplanıyor, kod diğer göstergelerin hesaplanan çubuklarının sayısını istiyor.

 //+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int CChannel:: BarsCalculated ( void )
  {
   int upchbars= BarsCalculated (m_upch);
   int dnchbars= BarsCalculated (m_dnch);
   if (upchbars<=dnchbars) return (upchbars);
   return (dnchbars);
  }

ve beklenen tahmini çubuk sayısı

 int barsch=(InpChPeriod== PERIOD_CURRENT ?rates_total: Bars ( _Symbol ,InpChPeriod));

Bu iki değer eşleşmezse tamponun doldurulmadığı ortaya çıkar.

   if (!channel.CreateChannel() || barsch<= 0 || barsch!=channel. BarsCalculated () || channel.FillChBuffers(rates_total,calculated,time)== 0 )
     {
       for (;counted_bars<rates_total;counted_bars++)
        {
         ZigzagBuffer[counted_bars]= 0.0 ;
         ZigzagStepBuffer[counted_bars]= 0.0 ;
         UpChBuffer[counted_bars]= 0.0 ;
         DnChBuffer[counted_bars]= 0.0 ;
         InfoZigzagBuffer[counted_bars]= 0.0 ;
         InfoUpChBuffer[counted_bars]= 0.0 ;
         InfoDnChBuffer[counted_bars]= 0.0 ;
         InfoDirectBuffer[counted_bars]= 0.0 ;
         InfoBegPriceBuffer[counted_bars]= 0.0 ;
         InfoEndPriceBuffer[counted_bars]= 0.0 ;
         InfoBegTimeBuffer[counted_bars]= 0.0 ;
         InfoEndTimeBuffer[counted_bars]= 0.0 ;
         InfoStartPriceBuffer[counted_bars]= 0.0 ;
         InfoStartTimeBuffer[counted_bars]= 0.0 ;
         InfoZigzagTotal[counted_bars]=InfoZigzagTotal[counted_bars- 1 ];
        }
       if (InpInfEnd) CopyInfoBuffers(rates_total- 1 ,( int )InfoZigzagTotal[rates_total- 1 ]);
       return (calculated);
     }

Doğru anlarsam, göstergeler tek bir iş parçacığında yürütülür ve öncelikleri oluşturuldukları zamana göre oluşturulur, yani. EA'dan eriştiğim göstergenin daha yüksek bir önceliğe sahip olduğu ortaya çıkıyor ve önce hesaplamasını yapıyor ve ardından hesaplamanın bitiminden sonra bu göstergelere akış veriyor, buna göre (tampon verilerine göre) ) hesaplama yapılmalıdır.

Baskı, Uyku'yu yeterli bir boyuta ayarlarsanız, göstergenin yeniden hesaplandığını (henüz nasıl olduğunu anlamıyorum) ve neden yalnızca 13 saniye sonra?

 2019.01 . 22 19 : 50 : 16.992 2019.01 . 21 23 : 45 : 00    barsch= 6275
2019.01 . 22 19 : 50 : 16.992 2019.01 . 21 23 : 45 : 00    BarsCalculated = 6274

2019.01 . 22 19 : 50 : 16.993 2019.01 . 21 23 : 45 : 13    barsch= 6275
2019.01 . 22 19 : 50 : 16.993 2019.01 . 21 23 : 45 : 13    BarsCalculated = 6275

Zamanlayıcı göstergesi yok.

Ve, doğru hesaplamayı elde etmek için ne yapmalıyım, arabellekteki değeri beklemeden önce EA'da kullanmaya çalışmak yardımcı olmuyor - kilitleniyor.

 
Merhaba! EA'ma bir adım atarak takip eden bir durdurma uygulamak istedim. Codebase ve Macd Sample'daki şablona ek olarak hiçbir şey bulamadım. Belki başka seçenekler vardır?