[ÇÖ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.

 

GÜNCELLEME: Aşağıdaki geçici çözüme bakın

CopyBuffer(), bir gösterge kodu içinden farklı bir Zaman Çerçevesine sahip bir göstergeyi çağırırken 4806 (Gösterge verilerine erişilemiyor) hatası veriyor. Geçerli çalışma zaman çerçevesinden farklı bir Zaman Çerçevesine geçerli bir Gösterge tanıtıcısı çağrıldığında olur. Hata yalnızca başlatma sırasında ve ilk onay verisinden ÖNCE OnCalculate() öğesine yapılan ilk çağrı sırasında görünür. Hatayı izole etmek için aşağıdaki yöntemler uygulandı:

Bu, bir komut dosyası, EA ve göstergeden çağrıldığında CopyBuffer() çıktısını test etmek için kullanılan kod bloğudur.

#include <Indicators\Trend.mqh>


   CiMA ima;
   ima.Create( _Symbol , PERIOD_H1 , 20 , 0 , MODE_SMA , PRICE_CLOSE );
   ima.Refresh();
  
   CIndicatorBuffer *buff = ima.At( 0 );
   int total = buff.Total();
   Print ( __LINE__ ," ", __FUNCSIG__ ," ",buff.Name()," Buffer size = ",total);
   for ( int i= 0 ;i<total;i++){
       if (i> 2 ) break ;
       else {
         Print ( __LINE__ ," ", __FUNCSIG__ ," ",ima.PeriodDescription()," iMA (",i,") value = ", DoubleToString (ima.Main(i), _Digits ));  
      }
   }

Tam gösterge kodu:

#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[])
  {
//---
   if (rates_total != prev_calculated || m_bufferSize < 1 ){
       ResetLastError ();
      ima.Create( _Symbol , PERIOD_H1 , 20 , 0 , MODE_SMA , PRICE_CLOSE );
      ima.Refresh();
      
      CIndicatorBuffer *buff = ima.At( 0 );
      m_bufferSize = buff.Total();
       Print ( __LINE__ , " " , __FUNCSIG__ , " " ,buff.Name(), " Buffer size = " ,m_bufferSize);
       if (m_bufferSize < 1 ){
         Print (ErrorDescription( GetLastError ()));
      } else {
         for ( int i= 0 ;i<m_bufferSize;i++){
             if (i> 2 ) break ;
             else {
               Print ( __LINE__ , " " , __FUNCTION__ , " " ,ima.PeriodDescription(), " iMA(" ,i, ") value = " , DoubleToString (ima.Main(i), _Digits ));  
            }
         }
      }
   }
//--- return value of prev_calculated for next call
   return (rates_total);
}
//+------------------------------------------------------------------+

Hata almamanın tek yolu, bunu H1 çizelgelerinde (aynı TF) başlatmaktır.

Aynı soruna sahip forum gönderisine bağlantılar:

https://www.mql5.com/en/forum/73274

https://www.mql5.com/en/forum/13676

https://www.mql5.com/en/forum/30958

https://www.mql5.com/en/forum/16614

GEÇİCİ ÇÖZÜM:

Çözüm, göstergeyi OnInit() içinde oluşturmak ve EventSetMillisecondTimer'ı 1ms olarak ayarlamaktı. Bu, OnCalculate()'in ilk geçişinden sonra geri dönmesine ve ikinci geçiş için hızlı bir şekilde OnTimer'ı çağırmasına izin verdi. Düzeltmek için OnTimer olayına yalnızca bir çağrı gerekliydi ve hesaplamalar için daha fazla zaman gecikmesi gerekmedi.

//+------------------------------------------------------------------+
//|                                                    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);
}
//+------------------------------------------------------------------+
Error 4806 while copying buffers
Error 4806 while copying buffers
  • www.mql5.com
com/en/articles/100, but tried to change it to use the CCI indicator only.
 
Bir geçici çözüm bilen var mı?
 

Korkarım bu MT5'teki bir hata değil, kodunuzdaki bir hata. Bu arada, bildirdiğin tüm konuları beğen. Platformu/dili tasarlandığı gibi ele almalısınız, düşündüğünüz veya olmasını istediğiniz gibi değil.

OnCalculate() içinde neden ima.Create() kullanıyorsunuz? Bir tanıtıcı alıyorsunuz ancak veriler henüz mevcut değil, bir hata alıyorsunuz ve kodunuz bir daha asla çağrılmıyor.

Not: "Veri erişimi olmadan çalışır"ın anlamı nedir? ?
 
Alain Verleyen :

Korkarım bu MT5'teki bir hata değil, kodunuzdaki bir hata. Bu arada, bildirdiğin tüm konuları beğen. Platformu/dili tasarlandığı gibi ele almalısınız, düşündüğünüz veya olmasını istediğiniz gibi değil.

OnCalculate() içinde neden ima.Create() kullanıyorsunuz? Bir tanıtıcı alıyorsunuz ancak veriler henüz mevcut değil, bir hata alıyorsunuz ve kodunuz bir daha asla çağrılmıyor.

Not: "Veri erişimi olmadan çalışır"ın anlamı nedir? ?
Korkarım bu aslında platformda bir hata. OnInit()'te aynı kod bloğunu uzman olarak çalıştırıyorum ve herhangi bir hata almıyorum, göstergedeki OnInit() ise hata veriyor. Veri erişimi olmadan çalışır, çevrimdışı, test cihazında veya pazar saatleri dışında çalıştığı anlamına gelir. Herhangi bir göstergeye yapılan bir çağrı, onu herhangi bir zamanda herhangi bir yerden başlatmalıdır ve platformun bu konularda tutarsız olması, bunun bir özellik değil, bir hata olduğu anlamına gelir. Hesaplamada ima.Create'in olması sadece bir örnektir, çünkü göstergeyi herhangi bir farklı zaman diliminde somutlaştıramaz - ilk onay işaretinden (veri güncellemesi) önce, gösterge içinde çağırdığınız herhangi bir yerden. Sonsuz kez yenileyebilirsiniz, ancak oncalculate tam olarak bir kez çalışıp geri dönene kadar gösterge verilerine erişmeyecektir. Yeni bir onay işareti geldiğinde sonraki geçişte çalışır. Hata.

Bir kez daha vurgulamak isterim ki, uzmanlar ve komut dosyalarında herhangi bir yerden doğru şekilde çalışıyor, sadece göstergelerde bir şekilde bozuluyor.

 
nicholishen :
Korkarım bu aslında platformda bir hata. OnInit()'te aynı kod bloğunu uzman olarak çalıştırıyorum ve herhangi bir hata almıyorum, göstergedeki OnInit() ise hata veriyor. Veri erişimi olmadan çalışır, çevrimdışı, test cihazında veya pazar saatleri dışında çalıştığı anlamına gelir. Herhangi bir göstergeye yapılan bir çağrı, onu herhangi bir zamanda herhangi bir yerden başlatmalıdır ve platformun bu konularda tutarsız olması , bunun bir özellik değil, bir hata olduğu anlamına gelir. Hesaplamada ima.Create'in olması sadece bir örnektir, çünkü göstergeyi herhangi bir farklı zaman diliminde somutlaştıramaz - ilk onay işaretinden (veri güncellemesi) önce, gösterge içinde çağırdığınız herhangi bir yerden. Bir kez daha vurgulamak isterim ki, uzmanlar ve komut dosyalarında herhangi bir yerden doğru şekilde çalışıyor, sadece göstergelerde bir şekilde bozuluyor.

Tamam bana inanmıyorsun, bu senin doğru, ama yanılıyorsun

Size sadece ServiceDesk'e yazmanızı önerebilirim ve lütfen cevaplarını buradan bildirin.

 
Alain Verleyen :

Tamam bana inanmıyorsun, bu senin doğru, ama yanılıyorsun

Size sadece ServiceDesk'e yazmanızı önerebilirim ve lütfen cevaplarını buradan bildirin.

Teşekkürler, yapacağım. Eğer yanılıyorsam, neden tam olarak uzmanlar ve komut dosyalarında çalışıyor da göstergelerden çalışmıyor?
 
nicholishen :
Teşekkürler, yapacağım. Eğer yanılıyorsam, neden tam olarak uzmanlar ve komut dosyalarında çalışıyor da göstergelerden çalışmıyor?

Çünkü bir sembolün tüm göstergeleri aynı iş parçacığı üzerinde çalışır. Strateji Test Cihazı , EA ve komut dosyası farklı durumlardır.

Yine de ServiceDesk'in cevabını görelim. Belki hatalıyım :-)

 
Alain Verleyen :

Çünkü bir sembolün tüm göstergeleri aynı iş parçacığı üzerinde çalışır. Strateji Test Cihazı , EA ve komut dosyası farklı durumlardır.

Yine de ServiceDesk'in cevabını görelim. Belki hatalıyım :-)

Bunu böyle değerlendirelim...

  • Neden aynı zaman çerçevesinin bir göstergesini somutlaştırabilir ve verilerine anında erişebilir, ancak farklı bir zaman çerçevesine sahip olamazsınız?
 
nicholishen :
  • Neden aynı zaman çerçevesinin bir göstergesini somutlaştırabilir ve verilerine hemen erişebilirsiniz?

Bu aslında, verilerin zaten mevcut olduğu için şanslı olduğunuz anlamına gelir. Bu garanti edilmez. Aynı zamanda başarısız olabilir.
 
Stanislav Korotky :
Bu aslında, verilerin zaten mevcut olduğu için şanslı olduğunuz anlamına gelir. Bu garanti edilmez. Aynı zamanda başarısız olabilir.

Bu, verilerin bir komut dosyası veya EA için hemen kullanılabilir olması durumunda Gösterge için de eşit derecede kullanılabilir olacağı anlamına gelir (bunda olduğu gibi bir veri kullanılabilirliği sorunu değildir). Gösterge, OnCalculate() öğesinin ikinci geçişinden (diğer bir deyişle ilk tik) önce somutlaşamıyor

Teşhis sırasında bunu dikkate aldım. Her ihtimale karşı döngüleri ve bekleme süresini bile dahil ettim. Benden önceki herkes gibi, bu özel hatayla aynı sorunları yaşıyorum.

 
nicholishen :

Bu, verilerin bir komut dosyası veya EA için hemen kullanılabilir olması durumunda Gösterge için de eşit derecede kullanılabilir olacağı anlamına gelir (bunda olduğu gibi bir veri kullanılabilirliği sorunu değildir). Gösterge, OnCalculate() öğesinin ikinci geçişinden (diğer bir deyişle ilk tik) önce somutlaşamıyor

Teşhis sırasında bunu dikkate aldım. Her ihtimale karşı döngüleri ve bekleme süresini bile dahil ettim. Benden önceki herkes gibi, bu özel hatayla aynı sorunları yaşıyorum.

"Örnekleme başarısız" ifadesini tekrarlıyorsunuz, ancak bu kesin değil. Gösterge her durumda somutlaştırılır.

Sorun şu ki, veriler eşzamanlı olarak mevcut değil, onunla uğraşmak zorundasınız. Bu bir MT5 hatası DEĞİL, ÖZELLİKTİR.

Tartışmayı durdurmayı ve SD yanıtını beklemeyi öneriyorum.