[ÇÖZÜLDÜ] Göstergeler, farklı çalışma zaman çerçevesine sahip bir Göstergeden çağrıldıklarında/oluşturulduklarında düzgün şekilde başlatılmıyor. - sayfa 3

 
Stanislav Korotky :
Örnek bir kodla daha spesifik bir soru gönderin. Buggy olabilir. Yaklaşım benim için çalışıyor.

İşte başarısız gösterge erişiminin bir kod örneği. Döngü, yenileme, beklemeden sonra bile (iki farklı bekleme yöntemi).

//+------------------------------------------------------------------+
//|                                                    THROWAWAY.mq5 |
//|                                                      nicholishen |
//|                                   www.reddit.com/u/nicholishenFX |
//+------------------------------------------------------------------+
#property copyright "nicholishen"
#property link        "www.reddit.com/u/nicholishenFX"
#property version    "1.00"
#property indicator_chart_window

#include <Indicators\Trend.mqh>
#include <errordescription.mqh>

CiMA ima;
int m_bufferSize = - 1 ;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit ()
  {
   static int iCnt = 0 ;
//--- indicator buffers mapping
       Print ( "-----------------------" , TimeCurrent (), "--------------------------" );
//---
   return ( INIT_SUCCEEDED );
  }
//+------------------------------------------------------------------+
//| 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 tickCnt = 0 ;
   tickCnt++;
//---
   if (rates_total != prev_calculated || m_bufferSize < 1 ){
       ResetLastError ();
       datetime createTime = TimeCurrent ();
      ima.Create( _Symbol , PERIOD_H1 , 20 , 0 , MODE_SMA , PRICE_CLOSE );
      ima.Refresh(); //no wait time!
          
      CIndicatorBuffer *buff = ima.At( 0 );
      m_bufferSize = buff.Total();
       int call = 0 ;
       int sleep = 200 ;
       // try with Sleep function ...
       while (buff.Total() <= 0 && call < 10 ){
         Sleep (sleep);
         ima.Refresh(); // Refreshed 10x since create
         m_bufferSize = buff.Total();
         call++;
         Print ( __LINE__ , " " , __FUNCTION__ , " " ,buff.Name(),
               " Buffer size = " ,m_bufferSize, " | Call (" ,
               call, ")" , " Sleep(" ,sleep, ")"
               );
         sleep+= 100 ;
        
      }
       // try wait with looping  
       if (buff.Total() <= 0 ){
         datetime waitTime = timeLoop(createTime);
         Print ( "Time Between Create and Refresh() = " , TimeToString (waitTime, TIME_SECONDS ));
         ima.Refresh();
         m_bufferSize = buff.Total();
      }
       if (m_bufferSize < 1 ){
         Print (ErrorDescription( GetLastError ()));
          return (rates_total);
      } else {
         for ( int i= 0 ;i<m_bufferSize;i++){
             if (i> 2return (rates_total);
             else {
               Print ( __LINE__ , " " , __FUNCTION__ ,buff.Name(),
                     " Buffer size = " ,m_bufferSize,
                     " | " ,ima.PeriodDescription(), " iMA(" ,i, ") value = " ,
                     DoubleToString (ima.Main(i), _Digits ),
                     " | Tick-count = " ,tickCnt
                     );  
            }
         }
      }
   }
//--- return value of prev_calculated for next call
   return (rates_total);
}
//+------------------------------------------------------------------+
void OnDeinit ( const int reason){

}

datetime timeLoop( datetime timeIn){
   int cnt = 0 ;
   while ( TimeCurrent () - timeIn < 10 && ! IsStopped ()){
       Comment ( "Time looping i = " ,cnt);
      cnt++;
   }
   return TimeCurrent () - timeIn;
}

Ve işte çıktı:

--------------------------2017.01.31 23:48:03----------------------- -------


60 OnCalculate MAIN_LINE Tampon boyutu = -1 | Çağrı (1) Uyku(200)

60 OnCalculate MAIN_LINE Tampon boyutu = -1 | Çağrı (2) Uyku(300)

60 OnCalculate MAIN_LINE Tampon boyutu = -1 | Çağrı (3) Uyku(400)

60 OnCalculate MAIN_LINE Tampon boyutu = -1 | Çağrı (4) Uyku(500)

60 OnCalculate MAIN_LINE Tampon boyutu = -1 | Ara (5) Uyku(600)

60 OnCalculate MAIN_LINE Tampon boyutu = -1 | Ara (6) Uyku(700)

60 OnCalculate MAIN_LINE Tampon boyutu = -1 | Çağrı (7) Uyku(800)

60 OnCalculate MAIN_LINE Tampon boyutu = -1 | Çağrı (8) Uyku(900)

60 OnCalculate MAIN_LINE Tampon boyutu = -1 | Ara (9) Uyku(1000)

60 OnCalculate MAIN_LINE Tampon boyutu = -1 | Ara (10) Uyku (1100)

Oluştur ve Yenile () Arasındaki Süre = 00:00:11

İstenen veri bulunamadı

81 OnCalculateMAIN_LINE Tampon boyutu = 1024 | H1 iMA(0) değeri = 113.227 | Kene sayısı = 2

81 OnCalculateMAIN_LINE Tampon boyutu = 1024 | H1 iMA(1) değeri = 113.269 | Kene sayısı = 2

81 OnCalculateMAIN_LINE Tampon boyutu = 1024 | H1 iMA(2) değeri = 113.313 | Kene sayısı = 2

















 
nicholishen :

İşte başarısız gösterge erişiminin bir kod örneği. Döngü, yenileme, beklemeden sonra bile (iki farklı bekleme yöntemi).

          Sleep (sleep) ;


Uyku bir gösterge üzerinde çalışmayacak; arayüz dizisini kesemezsiniz.

Bunun yerine OnTimer() ile deneyin.

 
honest_knave :

Uyku bir gösterge üzerinde çalışmayacak; arayüz dizisini kesemezsiniz.

Bunun yerine OnTimer() ile deneyin.

Bu kadar! Çözüm bu! Seni öpebilirim adamım!

Bu, OnInit()'in platforma dönmesini ve OnTimer()'ın platformu atlayıp ikinci geçişi çağırmasını sağlar. EventSetMillisecondTimer'ı sadece 1ms'ye ayarladım ve sadece bir kez aradım ve şimdi çalışıyor.

//+------------------------------------------------------------------+
//|                                                    THROWAWAY.mq5 |
//|                                                      nicholishen |
//|                                   www.reddit.com/u/nicholishenFX |
//+------------------------------------------------------------------+
#property copyright "nicholishen"
#property link        "www.reddit.com/u/nicholishenFX"
#property version    "1.00"
#property indicator_chart_window

#include <Indicators\Trend.mqh>
#include <errordescription.mqh>

CiMA ima;
int m_bufferSize = - 1 ;
bool timedEvent = false ;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit ()
  {
       int waitMS = 1 ;
       Print ( "-----------------------" , TimeCurrent (), "--------------------------" );
  
      ima.Create( _Symbol , PERIOD_H1 , 20 , 0 , MODE_SMA , PRICE_CLOSE );
       EventSetMillisecondTimer (waitMS);
       Print ( "OnTimer set to " ,waitMS, " ms" );
      
//---
   return ( INIT_SUCCEEDED );
  }

void OnTimer ()
  {
//---
   ima.Refresh();
   EventKillTimer ();
   timedEvent = true ;
  
  }
//+------------------------------------------------------------------+
//| 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 tickCnt = 0 ;
   tickCnt++;
  
   if (!timedEvent) return rates_total;
//---
   if (rates_total != prev_calculated || m_bufferSize < 1 ){
       ResetLastError ();
      CIndicatorBuffer *buff = ima.At( 0 );
      m_bufferSize = buff.Total();
       if (m_bufferSize <= 0 ) ima.Refresh();
       // try wait with looping  
      
       if (m_bufferSize < 1 ){
         Print (ErrorDescription( GetLastError ()));
        
      } else {
         for ( int i= 0 ;i<m_bufferSize;i++){
             if (i> 2 ) break ;
             else {
               Print ( __LINE__ , " " , __FUNCTION__ ,buff.Name(),
                     " Buffer size = " ,m_bufferSize,
                     " | " ,ima.PeriodDescription(), " iMA(" ,i, ") value = " ,
                     DoubleToString (ima.Main(i), _Digits ),
                     " | Tick-count = " ,tickCnt
                     );  
            }
         }
      }
   }
//--- return value of prev_calculated for next call
   return (rates_total);
}
//+------------------------------------------------------------------+


Çıktı:

--------------------------2017.02.01 01:31:01----------------------- -------

OnTimer 1 ms'ye ayarlandı

75 OnCalculateMAIN_LINE Tampon boyutu = 1024 | H1 iMA(0) değeri = 113.142 | Kene sayısı = 2

75 OnCalculateMAIN_LINE Tampon boyutu = 1024 | H1 iMA(1) değeri = 113.181 | Kene sayısı = 2

 
nicholishen :

Bu kadar! Çözüm bu! Seni öpebilirim adamım!

Sorun değil, banka transferlerini ve tüm kredi kartlarını kabul ediyorum... 100$ değil mi?
 
nicholishen :

Bu kadar! Çözüm bu! Seni öpebilirim adamım!

Güzel!

Zamanlayıcı kullanmanızı önerdim. Senin için işe yaramadığını söyledin. Denediklerinden bir örnek istedim. Ancak, zaten olduğundan daha fazla ayrıntı gönderemeyeceğinizi söylediniz.

Şimdi başka bir adam sana zamanlayıcıyı önerdi ve sen bundan memnun görünüyorsun. ;-)

 
Stanislav Korotky :

Güzel!

Zamanlayıcı kullanmanızı önerdim. Senin için işe yaramadığını cevapladın. Denediklerinden bir örnek istedim. Ancak, zaten olduğundan daha fazla ayrıntı gönderemeyeceğinizi söylediniz.

Şimdi başka bir adam sana zamanlayıcıyı önerdi ve sen bundan memnun görünüyorsun. ;-)

Hey! 150 dolarıma güç katmaya çalışmayı bırak!
 
Stanislav Korotky :

Güzel!

Zamanlayıcı kullanmanı önerdim. Senin için işe yaramadığını cevapladın. Denediklerinden bir örnek istedim. Ancak, zaten olduğundan daha fazla ayrıntı gönderemeyeceğinizi söylediniz.

Şimdi başka bir adam sana zamanlayıcıyı önerdi ve sen bundan memnun görünüyorsun. ;-)

Ve şimdi bir MT5 hatası düzeltildi...
 
honest_knave :
Sorun değil, banka transferlerini ve tüm kredi kartlarını kabul ediyorum... 100$ değil mi?

100 dolar mı?! ...daha fazlasını teklif ettiğimi sanıyordum...

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

[MQL5 HATA] [ÇÖZÜLDÜ]Göstergeler, farklı çalışma zaman çerçevesine sahip bir Göstergeden çağrıldıklarında/oluşturulduklarında doğru şekilde başlatılmıyor.

Stanislav Korotky , 2017.02.01 09:27

Güzel!

Zamanlayıcı kullanmanızı önerdim. Senin için işe yaramadığını cevapladın. Denediklerinden bir örnek istedim. Ancak, zaten olduğundan daha fazla ayrıntı gönderemeyeceğinizi söylediniz.

Şimdi başka bir adam sana zamanlayıcıyı önerdi ve sen bundan memnun görünüyorsun. ;-)


Üzgünüm, şimdiye kadar bununla ne demek istediğini anlamadım. Sizi düzenbazla ortak olarak kabul edeceğim ve kimse çalışan bir model yayınlamadığından, ödülün %50 olacağına hükmedeceğim - ikiye bölün: Yani bu...mm...ikisini taşıyın... İkinize de bira ısmarlamaya ne dersiniz? Cidden, bana bir BTC adresi PM atarsan ikinizin de tazminatını ödeyeceğinden emin olurum :)

Tüm yardımlarınız için özellikle teşekkür etmek istiyorum... lütufkarlığınız olmasaydı, çabalamak için motivasyonu nerede bulurdum bilmiyorum! /s

 
nicholishen :

Cidden, bana bir BTC adresi PM atarsan ikinizin de tazminatını ödeyeceğinden emin olurum :)

cömert bir teklif ama gereksiz. Düzenlediğine sevindim.
 
Bunu servis masasıyla kapatıyorum, ancak MetaQuotes bunu okuyorsa, bunun hala platformda büyük bir kusur olduğunu düşünüyorum. Bu, iş parçacığı oluşturma ile ilgili bir sorunsa, bu tür olayları ele almanın, rastgele (tahmin edilen bir miktar) bekleme süresini koda atmaktan daha iyi bir yolu olmalıdır.