iClose/iOpen zaman serilerine vb. erişimle çalışırken MQL5 hatası. - sayfa 5

 
Renat Fatkhullin :

Lütfen, Piyasa İzleme'deki her sembolün gerçek son 2000 işaretini her zaman tutan göstergenin referans kodunu gösterin.

Ve sonra bir yandan falcılık, diğer yandan sadece kelimeler şeklinde öneriler elde edilir.

 
Renat Fatkhullin :

Koda bakmamız gerekiyor.

İşte yukarıdaki kodda açıkça bir dizi mantıksal ve kaynak sorunu var.

Böyle bir şey yapıyorum, lütfen bana gerekirse nasıl ve neyi düzelteceğimi söyleyin:

 bool flag = true ;

//+————————————————————————————————————————————————————————————————————————————+
int OnInit ()
{
  /*
  тут определены и настроены буферы
  */
  

  flag = true ;

   //---
   return ( INIT_SUCCEEDED );
}
//+————————————————————————————————————————————————————————————————————————————+

//+————————————————————————————————————————————————————————————————————————————+
void OnDeinit ( const int reason)
{
   //--- destroy timer
   EventKillTimer ();
}
//+————————————————————————————————————————————————————————————————————————————+

//+————————————————————————————————————————————————————————————————————————————+
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      [])
{
   //Print ("---");
   //Print (rates_total, " ", prev_calculated);
   //Print ("---");

   if (flag)
  {
     if ( SeriesInfoInteger ( Symbol (), Period (), SERIES_SYNCHRONIZED ))
    {
       Print ( "1 История синхронизирована" );
       int bars = Bars ( Symbol (), Period ());
       Print ( "Баров в истории " , bars);


       MqlTick ticks_array [];

       datetime from = TimeByNumberOfCandles ( Symbol (), PERIOD_M1 , ParentCandles_P);
       MqlDateTime sdt;
       ulong from_msc = (( ulong )from) * 1000 ;

       ResetLastError ();
       int count = CopyTicksRange ( Symbol (), ticks_array, COPY_TICKS_INFO , from_msc); //, to_msc);
       Print ( "Скопировано " , count, " тиков" );

       int error = GetLastError ();
       Print (error);

       if (count <= 0 || error != 0 )
      {
         Print ( "Ошибка при получении данных" );
         return (rates_total);
      }

       Print (ticks_array [ 0 ].time_msc, " " , ticks_array [count - 1 ].time_msc); // 0-й самый старый

       for ( int i = 0 ; i < count; i++)
      {
        // тут вычисления и операции с тиками
      }

      /*
      тут заполнение индикаторных буферов значениями полученными после работы с тиками
      */
      }
      
      flag = false ;
    }
     else
    {
       Print ( "2 История НЕ синхронизирована!" );
       return (rates_total);
    }
  }


   return (rates_total);
}
//+————————————————————————————————————————————————————————————————————————————+
 
Renat Fatkhullin :

Koda bakmamız gerekiyor.

İşte yukarıdaki kodda açıkça bir dizi mantıksal ve kaynak sorunu var.

Bu kodda mantıksal bir sorun mu var yoksa bir şeyi mi kaçırıyorum?

Ticaret, otomatik ticaret sistemleri ve ticaret stratejilerinin test edilmesi hakkında forum

iClose/iOpen zaman serilerine vb. erişimle çalışırken MQL5 hatası.

Stanislav Dray , 2018.11.14 16:28

Hata raporlarıyla garip bir ilişkiniz var. Sanki bir şeyi kanıtlamam için bana para ödemiyorlar gibi. Durumu elimden geldiğince anlattım.

Sorun sadece bende değil, sorun 30. güncellemenizden sonra ortaya çıktı ama yine de benim aptal olduğumu ve bazı yavaş göstergelerin suçlu olduğunu ima ediyorsunuz.

Ve ondan önce bir yıl boyunca frenlenmemişler miydi?

M30'da piyasaya sürüldükten 25 dakika sonra çöken bir kod örneği:

 //+------------------------------------------------------------------+
//|                                                      Feezzzz.mq5 |
//|                                   Copyright 2018, Dray Stanislav |
//|                               https://www.mql5.com/ru/users/fan9 |
//+------------------------------------------------------------------+
#property copyright "Copyright 2018, Dray Stanislav"
#property link        "https://www.mql5.com/ru/users/fan9"
#property version    "1.00"
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit ()
  {
//---
   
//---
   return ( INIT_SUCCEEDED );
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit ( const int reason)
  {
//---
   
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick ()
  {
//---
     datetime CM1_T[ 1 ];
     if ( CopyTime ( _Symbol , PERIOD_M1 , 0 , 1 ,CM1_T)==- 1 ){
       Comment ( "\n\n CopyTime return -1" );
       return ;
    }
     Comment ( "\n\n CopyTime : " + TimeToString (CM1_T[ 0 ], TIME_DATE | TIME_SECONDS ));   
  }
//+------------------------------------------------------------------+
//| Trade function                                                   |
//+------------------------------------------------------------------+
void OnTrade ()
  {
//---
   
  }
//+------------------------------------------------------------------+

 
Renat Fatkhullin :

Her şeyi hemen elde edemeyeceğinizi net bir şekilde anlayan bir gösterge yazmanız gerekir.

OnInit'te, CopyXXX'e yapılan tek çağrılarla gerekli enstrümanların geçmişinin yüklenmesini teşvik etmelisiniz, ancak OnCalculate'de tam başlatmayı beklemeniz gerekir.

Size büyük olasılıkla bir hata ile bir başlatma aşaması - yanlış verileri bekliyorsunuz ve engelleniyor.

bunu yapmaya çalışacağım

şimdi OnCalculate'de sorgular yapıyorum ve orada bekliyorum (elbette her tik değil, ancak yalnızca ilk hesaplamada).

 
fxsaber :

Lütfen, Piyasa İzleme'deki her sembolün gerçek son 2000 işaretini her zaman tutan göstergenin referans kodunu gösterin.

Ve sonra bir yandan falcılık, diğer yandan sadece kelimeler şeklinde öneriler elde edilir.

Katılıyorum! tikler değil barlar bile daha iyi.

Onaylanmış Gerçek Çoklu Para Birimi Kodu örneği gereklidir.

Yoksa karanlıkta kalırız...

 

Hatayı yerelleştirmeye çalışacağım ve bulduğumda abonelikten çıkacağım

 
transcendreamer :

Katılıyorum! tikler değil barlar bile daha iyi.

Onaylanmış Gerçek Çoklu Para Birimi Kodu örneği gereklidir.

Yoksa karanlıkta kalırız...

barlar ve tikler, MT5'te bağımsız olarak yaşayan farklı epostalardır. ikisine de ihtiyaç var.
 
Vladimir Karputov :

Ayrıca, başka birinin zaman çerçevesiyle çalışıyorsanız, dakikada bir bu zaman çerçevesinden (herhangi bir CopyXXXX işlevi) OHLC almanız gerektiği de her zaman tavsiye edilmiştir. Herzaman olmuştur.

Burada olan biten her şeye zaten tükürmek istiyordum ama ne yazık ki MQ ürününe yaklaşık 10 yılımı harcadım.

Şimdi her şey işe bağlı. Vladimir, CopyXXXX işlevlerini kullanma konusundaki tavsiyen benim tarafımdan kullanıldı, çünkü profesyonelce yazılmış kodum açısından herhangi bir zorluk teşkil etmiyordu.

Dürüst olmak gerekirse, sorun sadece benim çarpık ellerimde olsun istedim ama hayır, sorun sadece onlarda değil. Aşağıda karşınıza teknik destekten gelen kodun doğru yazılmadığına dair garip açıklamalar ve 100500 diğer gösterge ile ne istediğinizi sorun olacak bir ekran gelecek. Test edilen biri dışında 100500 gösterge yok, tek bir Uzman Danışman yok, terminalde sadece iki cihaz açık, gösterge EURUSD 1M çifti üzerinde test ediliyor, gösterge aynı enstrümanın M15 zaman diliminden veri yüklüyor , yani Diğer enstrümanlardan veri indirmeye çalışmıyorum, Market Watch'ta sadece birkaç tane var.

Terminalin yük açısından çalışması için genel olarak ideal bir durum, ki bu çalışma koşullarında elbette olmayacak ama bu durumda bile bir sorun var ve bence bu soruna "HATA" deniyor. .

Göstergede, iClose ve iBars işlevleri yalnızca Commet() içindeki durumu yansıtmak için çağrılır. Piyasa incelemesinde, ekranın oluşturulduğu andaki saat, terminal penceresinde, iClose ve iBars fonksiyonlarının çağrılmasının mevcut durumu, ardından göstergenin hesaplama kısmında CopyXXXX fonksiyonu kullanılır.

SIRT ÇANTASI

Gördüğünüz gibi, gösterge 16:31'de yeniden yüklendi ve başarılı bir şekilde çalıştı (hatta mutluydum), ancak iClose veri güncellemesi sırasıyla 00:15'ten sonra durdu ve CopyXXXX işlevi de güncellenmemiş verileri, yani. hata, MT'nin bağırsaklarında bir yerde meydana gelir.

Bana göre sunucudan veri okunurken bir arıza oluyor, bir çok sebep olabilir (İnternet eksikliği, sunucu meşguldü vb.), ama nedense sebepleri ortadan kaldırdıktan sonra işe devam edilmesi. bağlantı oluşmuyor, dolayısıyla kullanıcıların kaynak kodlarını istediğiniz kadar test edebileceğiniz sonucuna varıyorum, ancak yakınlarda bir sunucunuz varsa, bu sorunu asla tespit edemezsiniz, ancak var ve sadece çarpıklıktan kaynaklanmıyor. kodlayıcının kolları.

 

Ayrıca dün Stanislav'dan gelen kodu test etmeye karar verdim. Birkaç saat sonra zaman güncellemesi durdu. Zaman dilimlerini değiştirmedim, ancak grafiğin bağlam menüsünden bir güncelleme yaptım ve zaman ilerledi.

Bugün saati ve mevcut TF'yi izlemek için kodu biraz değiştirdim.

 void OnTick ()
{
 datetime CM1_T[ 1 ];
 datetime CM2_T[ 1 ];
 CopyTime ( _Symbol , PERIOD_M1 , 0 , 1 ,CM1_T);
 CopyTime ( _Symbol , PERIOD_CURRENT , 0 , 1 ,CM2_T);
 Comment (" CopyTime PERIOD_CURRENT : "+ TimeToString (CM2_T[ 0 ], TIME_DATE | TIME_SECONDS )+"\nCopyTime PERIOD_M1 : "+ TimeToString (CM1_T[ 0 ], TIME_DATE | TIME_SECONDS ));   
}

Ve kelimenin tam anlamıyla 15 dakika sonra, "yerli olmayan" TF'deki güncelleme durdu, ancak mevcut olanda normalde güncellendi. Programı güncelledikten sonra zaman tekrar gitti.

Terminal taşınabilir modda çalışır. Sistem ve terminalin kendisi bir SSD sürücüsündedir.


 

Ne olduğunu bilmiyorum ama MQL5'teki son MQ Şampiyonası için bot yazdığımda çoklu para birimiydi ve diğer enstrümanlardan veri yüklerken herhangi bir sorun fark etmedim.

Çünkü Bazı lakhmat yıllarında, MQL5 sorunsuz çalışacak kadar mükemmel değildi (optimize edilmedi), evet, muhtemelen çok fazla kaynak emdi, ancak beklenen sonucu verdi ve şimdiki gibi değil, rulet - şanslı ya da değil.

Örneğin, MQL5 için ticari ürünlerin geliştiricisi olarak bu sorun beni çok iyi karakterize etmeyecek ve bir kişinin piyasadan satın alınan bir ürün için ödeme yapması iki kat hoş olmayacak ve bu nedenle sadece buggy olacak. "HATALAR".