Göstergelerde OnDeinit - sayfa 7

 

Geliştiriciler, bir yerde %100 hatanız var.

 void OnDeinit ( const int reason)
{
 //Comment("");
 Comment ( ArrayInitialize (body_down, EMPTY_VALUE ), "  " ,body_down[ 0 ], "  " ,body_down[ 1 ], "  " ,body_down[ 2 ], "  " ,body_down[ 3 ]);
}

Terminali kapatıp 1 dakika sonra açtıktan sonra Comment'in verdiği ekran görüntüsüne bir göz atın.

Başlatılan öğelerin sayısı ve arabelleğin birinci, ikinci, üçüncü ve dördüncü öğelerinin boş olması.

Gösterge yalnızca 0. arabelleği sayar. Peki neden 2 mum?


 
Evet. ArrayInitialize'ın hiçbir şey döndürmediği İngilizce yardımda da yazılmıştır.

 
eevviill :

Geliştiriciler, bir yerde %100 hatanız var.

Terminali kapatıp 1 dakika sonra açtıktan sonra Comment'in verdiği ekran görüntüsüne bir göz atın.

Başlatılan öğelerin sayısı ve arabelleğin birinci, ikinci, üçüncü ve dördüncü öğelerinin boş olması.

Gösterge yalnızca 0. arabelleği sayar. Peki neden 2 mum?


Çünkü yeni bir çubuk için analiz yaparken çubuk sayısını kontrol etmezsiniz, sadece zamanı kontrol etmekle kendinizi sınırlandırırsınız. İşlem sırasında terminal başladığında veya sunucu ile bağlantı kesildiğinde, eksik (tam geçmişe kadar) çubuklar gelmeden önce bir onay işareti gelir. Bu tik için yeni bir mum oluşturuluyor ancak onunla terminaldeki sunucudan indirilip yerine yerleştirilecek olan geçmiş arasında bir boşluk (eksik geçmiş) var ve bar sayısını analiz etmediğiniz için, bir sonraki hesaplamada yeni bir çubuk olduğunu düşüneceksiniz hayır, o zaman ikinci mum belirir. Yeni bir çubuk açtıktan sonra kaybolacaktır.
 
mql5 :
Çünkü yeni bir çubuk için analiz yaparken çubuk sayısını kontrol etmezsiniz, sadece zamanı kontrol etmekle kendinizi sınırlandırırsınız. İşlem sırasında terminal başladığında veya sunucu ile bağlantı kesildiğinde, eksik (tam geçmişe kadar) çubuklar gelmeden önce bir onay işareti gelir. Bu tik için yeni bir mum oluşturulur ancak onunla terminaldeki sunucudan indirilecek ve yerine yerleştirilecek olan geçmiş arasında bir boşluk (eksik geçmiş) vardır ve çubuk sayısını analiz etmediğiniz için, bir sonraki hesaplamada yeni bir çubuk olduğunu düşüneceksiniz hayır, o zaman ikinci mum belirir. Yeni bir çubuğun açılmasından sonra kaybolacaktır.

Ve kesin olarak , terminal kapatıldığında sıfırlamanın gerçekleşmesi önemli değil mi?

 

Vasily , çubuk sayısını yazdıran bir test göstergesi sürün.

 //+------------------------------------------------------------------+
//|                                                         test.mq4 |
//|                        Copyright 2015, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2015, MetaQuotes Software Corp."
#property link        "https://www.mql5.com"
#property version    "1.00"
#property strict
#property indicator_chart_window

datetime lb;
int       rates_;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit ()
  {
//--- indicator buffers mapping
   
//---
   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[])
  {
//---
   
//--- return value of prev_calculated for next call
   if (NewBar( PERIOD_CURRENT , lb))
    {
     Print ( "rates_total = " , rates_total);
     rates_ = rates_total;
    }
   return (rates_total);
  }
//+------------------------------------------------------------------+
void OnDeinit ( const int reason)
{
//if(reason == REASON_CLOSE)
Print ( "OnDeinit сработал " , rates_);
}

bool NewBar( int tf, datetime &lastbar)
{
   datetime curbar = iTime( _Symbol , tf, 0 );
   if (lastbar != curbar)
    {
     lastbar = curbar;
     return ( true );
    }
   else return ( false );
} //******************************************************************|

İşte günlüğe yazdırılan şey.

 0        22 : 52 : 04.765     Custom indicator Test\test EURUSD.z,M1: loaded successfully
0        22 : 52 : 04.795     test EURUSD.z,M1: initialized
0        22 : 52 : 04.795     test EURUSD.z,M1: rates_total = 75183
0        22 : 52 : 11.902     test EURUSD.z,M1: rates_total = 75184
0        22 : 52 : 28.712     test EURUSD.z,M1: uninit reason 9
0        22 : 52 : 28.712     test EURUSD.z,M1: OnDeinit сработал 75184
0        22 : 52 : 28.832     Custom indicator test EURUSD.z,M1: removed
0        22 : 57 : 10.366     Custom indicator Test\test EURUSD.z,M1: loaded successfully
0        22 : 57 : 10.396     test EURUSD.z,M1: initialized
0        22 : 57 : 10.396     test EURUSD.z,M1: rates_total = 75184
0        22 : 57 : 14.972     test EURUSD.z,M1: rates_total = 75185
0        22 : 57 : 59.167     test EURUSD.z,M1: rates_total = 75190 
// Локальное время наверное отстаёт от серверного на несколько секунд. На сервере было уже 58 минут.
0        22 : 58 : 34.237     test EURUSD.z,M1: uninit reason 1
0        22 : 58 : 34.237     test EURUSD.z,M1: OnDeinit сработал 75190
0        22 : 58 : 34.247     Custom indicator test EURUSD.z,M1: removed


Belki sorunun nerede olduğunu bulabilirsin...

 
eevviill :

Geliştiricilerden basit bir cevaba cevap vermelerini istiyorum.

Terminal kapatıldığında çizelgeye eklenen programlarda DeInit() işlevi yürütülüyor mu?

Kesin konuşmak gerekirse, hayır

OnDeinit yürütülür. DeInit yalnızca, onu OnDeinit'ten açıkça çağırırsanız yürütülür.

Eski tanımlama işlevinden bahsediyorsanız, işlev adlarının büyük/küçük harfe duyarlı olduğunu da unutmayın. Yani, DeInit bilinmeyen bir fonksiyondur, deinit başlangıçsızlaştırma için standart bir giriş noktasıdır (OnDeinit gibi)

 
eevviill :

Ve kesin olarak, terminal kapatıldığında sıfırlamanın gerçekleşmesi önemli değil mi?

Kimin umrunda? Terminal kapatıldığında, kimsenin bu arabelleklere ihtiyacı yoktur, çünkü program yüklendiğinde hemen serbest bırakılırlar, bu da OnDeinit'ten hemen sonra gerçekleşir.

Sadece zaman çerçevesini değiştirmeyi deneyin. OnDeinit çalışacak, arabellekler kalacak (bu durumda program boşaltılmadığından), ancak hiç kimse içeriklerini "geçmiş yaşamdan" garanti edemez.

Sonunda belgeleri okuyun! https://docs.mql4.com/ru/runtime/running ve https://docs.mql4.com/ru/runtime/event_fire#deinit

 
stringo :

Kimin umrunda? Terminal kapatıldığında, kimsenin bu arabelleklere ihtiyacı yoktur, çünkü program yüklendiğinde hemen serbest bırakılırlar, bu da OnDeinit'ten hemen sonra gerçekleşir.

Sadece zaman çerçevesini değiştirmeyi deneyin. OnDeinit çalışacak, arabellekler kalacak (bu durumda program boşaltılmadığından), ancak hiç kimse içeriklerini "geçmiş yaşamdan" garanti edemez.

Sonunda belgeleri okuyun! https://docs.mql4.com/ru/runtime/running ve https://docs.mql4.com/ru/runtime/event_fire#deinit

Yani, benim durumumda, grafik yeniden açıldığında arabelleklerin bölünmesi zaten gerçekleşiyor mu?
 
eevviill :
Yani, benim durumumda, grafik yeniden açıldığında arabelleklerin bölünmesi zaten gerçekleşiyor mu?

Tampon bölmeniz yok.

Kendi arabelleğinizi bu şekilde doldurursunuz. İlk kez oluşturmada, ikinci kez verinin bir bölümünün gelişinde. Her iki seferde de aynı Time[0] değerinde çalışıyorsunuz

 
stringo :

Tampon bölmeniz yok.

Kendi arabelleğinizi bu şekilde doldurursunuz. İlk kez oluşturmada, ikinci kez verinin bir bölümünün gelişinde. Her iki seferde de aynı Time[0] değerinde çalışıyorsunuz

TAMAM.

Sonra İngilizce yardımını düzeltin ve hepsi bu

ArrayInitialize'ın hiçbir şey döndürmediği İngilizce yardımda da yazılmıştır .