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

 
Yani, prensipte, hata muhtemelen, gösterge tanıtıcımın OnTick işlevinde yaratılmış olması ve verilerin hemen aynı tik üzerine kopyalanmasıydı. Gece aklıma geldi, şimdi tutamaçları OnInit işlevine aktarmaya çalışacağım.
Документация по MQL5: Основы языка / Функции / Функции обработки событий
Документация по MQL5: Основы языка / Функции / Функции обработки событий
  • www.mql5.com
Основы языка / Функции / Функции обработки событий - Документация по MQL5
 
sss20192 :
Yani, prensipte, hata muhtemelen, gösterge tanıtıcımın OnTick işlevinde yaratılmış olması ve verilerin hemen aynı tik üzerine kopyalanmasıydı. Gece aklıma geldi, şimdi tutamaçları OnInit işlevine aktarmaya çalışacağım.

Yardım etmedi. İşte kod şimdi


#property version   "1.00"

input int                   InpFastEMA= 12 ;                 // Fast EMA period
input int                   InpSlowEMA= 26 ;                 // Slow EMA period
input int                   InpSignalMA= 9 ;                 // Signal MA period
input ENUM_APPLIED_PRICE    InpAppliedPrice= PRICE_CLOSE ;   // Applied price
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int Handle1, Handle2, Handle3;
double MacdArray[];

int OnInit ()
  {
//---
  Handle1 = iMACD ( _Symbol , PERIOD_M5 , InpFastEMA, InpSlowEMA, InpSignalMA, InpAppliedPrice);
  Handle2 = iMACD ( _Symbol , PERIOD_M15 , InpFastEMA, InpSlowEMA, InpSignalMA, InpAppliedPrice);
  Handle3 = iMACD ( _Symbol , PERIOD_H1 , InpFastEMA, InpSlowEMA, InpSignalMA, InpAppliedPrice);
//---
   return ( 0 );
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit ( const int reason)
  {
//---
   
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick ()
  {
//---
         CopyBuffer (Handle1, 0 , 1 , 1 , MacdArray);
         Print (MacdArray[ 0 ], " " , GetLastError ());
        
         CopyBuffer (Handle2, 0 , 1 , 1 , MacdArray);
         Print (MacdArray[ 0 ], " " , GetLastError ());
        
         CopyBuffer (Handle3, 0 , 1 , 1 , MacdArray);
         Print (MacdArray[ 0 ], " " , GetLastError ());
  }
//+------------------------------------------------------------------+

Günlük, bunun gibi mesajları gösterir

2013.04.13 15:21:31 2010.01.04 00:00:01 6.187448020344988e-005 0

2013.04.13 15:21:31 2010.01.04 00:00:01 6.187448020344988e-005 0

2013.04.13 15:21:31 2010.01.04 00:00:01 6.187448020344988e-005 0

Her zaman böyle. Kopyalarken hata yok.

 
sss20192 : olmadı. İşte kod şimdi

Ancak, başarılı bir şekilde tanıtıcı oluşturma kontrolünüz , göstergelerin başarılı bir şekilde hesaplanması ve kopyalama kontrolü için herhangi bir kontrolünüz yok. Kendi başına, tanıtıcı başlatmayı OnInit()'e aktarma fikri doğrudur.

Siz hala buradasınız: line Print (MacdArray[ 0 ]); OnTick () gövdesinin en başına koyun - arabellekleri kopyalamadan önce dizide hangi çöp değerinin bulunduğunu görmek için.

Ekleyeceğim. GetLastError () işlevinin kendisinden sonra kullanılması elbette bir programlama stili özelliği olabilir. Ama yine de Dizin'deki örneği kontrol edip dikkate alırdım. Yanılmıyorsam GetLastError ()'un değeri her zaman sıfır değildir, bu da işlevin başarılı olduğu anlamına gelir.

 
Yedelkin :
Ancak, başarılı bir şekilde tanıtıcı oluşturma kontrolünüz, göstergelerin başarılı bir şekilde hesaplanması ve kopyalama kontrolü için herhangi bir kontrolünüz yok. Kendi başına, tanıtıcı başlatmayı OnInit()'e aktarma fikri doğrudur.
Ama sadece ilk kez. Programın başka bir yerinde bazı tanıtıcıların geçersiz olduğu ortaya çıkarsa, tekrar almayı denemeniz gerekir. Bu nedenle OnInit ()'de tanıtıcı alma kodunun kaldırılmasının sorunu tamamen çözeceği ve %100 doğru olduğu söylenemez. ))
 
CopyBuffer işlevi tarafından ne kadar veri kopyalandığını kontrol ettim, her zaman 1 yazıyor. Ve herhangi bir hata yok, ancak veriler hala doğru değil.
Документация по MQL5: Доступ к таймсериям и индикаторам / CopyBuffer
Документация по MQL5: Доступ к таймсериям и индикаторам / CopyBuffer
  • www.mql5.com
Доступ к таймсериям и индикаторам / CopyBuffer - Документация по MQL5
 

tol64

Yedelkin : Kendi başına, tanıtıcı başlatmayı OnInit()'e taşıma fikri doğrudur.

Ama sadece ilk kez. Programın başka bir yerinde bazı tanıtıcıların geçersiz olduğu ortaya çıkarsa, tekrar almayı denemeniz gerekir. Bu nedenle OnInit()'te tanıtıcı alma kodunu kaldırmanın sorunu tamamen çözeceği ve %100 doğru olduğu söylenemez. ))

Tanıtıcı başlatmayı OnTick()'ten OnInit()'e taşıma fikrinin kendi içinde doğru olmadığını mı söylüyorsunuz?
 
sss20192 :
CopyBuffer işlevi tarafından ne kadar veri kopyalandığını kontrol ettim, her zaman 1 yazıyor. Ve herhangi bir hata yok, ancak veriler hala doğru değil.

Test cihazında bu kodun bu sonucu var:

//---

Testten önce yaptığım tek şey, gösterge değerlerini günlüğe çıkarmadan önce basitçe dönüştürmek oldu:

 Print ( DoubleToString (MacdArray[ 0 ], Digits ()), " " , GetLastError ());
 
Yedelkin :
Tanıtıcı başlatmayı OnTick()'ten OnInit()'e taşıma fikrinin kendi içinde doğru olmadığını mı söylüyorsunuz?
Yalnızca OnInit () içindeyse ve başka hiçbir yerde değilse, evet - yanlış. İlk defa, tanıtıcıyı OnInit () içinde almaya çalışıyoruz. Ardından, her gösterge verisi alma girişiminden önce, tanıtıcının geçerli olup olmadığını kontrol ederiz. Geçerliyse verileri alırız, değilse, tekrar tanıtıcıyı almaya çalışırız.
 
tol64 :

Test cihazında bu kodun bu sonucu var:

//---

Testten önce yaptığım tek şey, gösterge değerlerini günlüğe çıkarmadan önce basitçe dönüştürmek oldu:

Vay harika! Çok teşekkürler! Üçüncü gün sorunu çözüyorum)
 
tol64 :
Yedelkin : Sap başlatmayı OnTick()'ten OnInit()'e aktarma fikrinin kendi içinde doğru olmadığını mı söylüyorsunuz?
Yalnızca OnInit() içinde ve başka hiçbir yerde değilse, evet - yanlış. İlk defa, tanıtıcıyı OnInit() içinde almaya çalışıyoruz. Ardından, her gösterge verisi alma girişiminden önce, tanıtıcının geçerli olup olmadığını kontrol ederiz. Geçerliyse verileri alırız, değilse, tekrar tanıtıcıyı almaya çalışırız.

Ve "eğer" olmadan? Ve bu özel durumla ilgili olarak? İnsanlar için, her tik üzerinde OnTick işlevinde gösterge tutamacı oluşturuldu ve veriler aynı tik üzerinde hemen kopyalandı. Onlar. geçerlilik veya geçersizlik kontrolü yapılmadan, her seferinde aynı göstergenin tanıtıcısı yeniden istendi. Bu arka plana karşı, tanıtıcıların başlatılmasını OnTick()'ten OnInit()'e aktarma fikrinin kendi içinde doğru olmadığını savunmaya devam edeceksiniz.

not. Görünüşe göre, kişiye yardım ettin, bu yüzden soru çözülmüş sayılabilir.