Init() ve DeInit() yürütme sırası - sayfa 23

 
fxsaber :

Prensip olarak, bir satırla yapabilirsiniz.

Tek satırda yaptı .
 
Nikolai Semko :


Peki, o tam olarak nerede?

Bu ilkel örneği kullanın. Ve TF'yi değiştirirken "benzersizliği" anlayacaksınız.

Bu örnekte, OnInit'te geçerli saat ve fiyatın koordinatlarıyla bir nesne oluşturulur. OnCalculate'de bu nesne fiyatla birlikte hareket eder.

OnDeinit'te basitçe (mantıklı olan) kaldırılır.

TF'yi değiştirirken, nesnenin göründüğü veya kaybolduğu ortaya çıkıyor.
Bu neden oluyor?
Çünkü bazen eski TF'nin OnDeinit'i, yeni TF'nin OnInit'inde önceden oluşturulmuş olanı siler. Bu bir hata değil! Bu örneği oluşturan ve bu konuyu okumayan programcı ne düşünmelidir?



İlkel bir kaybeden örneği kullanmanın amacı nedir?

NEREDEYSE doğru kodun daha iyi bir örneğini kullanın

 //+------------------------------------------------------------------+
//|                                                      ProjectName |
//|                                      Copyright 2012, CompanyName |
//|                                       http://www.companyname.net |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, MetaQuotes Software Corp."
#property link        "https://www.mql5.com"
#property version    "1.00"
#property indicator_chart_window
#property indicator_plots    0

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int OnInit ()
  {

   datetime t = TimeCurrent ();
   double pr  = SymbolInfoDouble ( Symbol (), SYMBOL_BID );
   if ( ObjectFind ( 0 , "InitDeinit" ) < 0 )                 // ПРОВЕРКА СУЩЕСТВОВАНИЯ ОБЪЕКТА ПЕРЕД ЕГО СОЗДАНИЕМ ОБЯЗАТЕЛЬНА!!!
    {
     ObjectCreate ( 0 , "InitDeinit" , OBJ_ARROW_THUMB_UP , 0 ,t,pr);
     Print ( __FUNCTION__ , " создан InitDeinit" );
    }
    
   ObjectSetInteger ( 0 , "InitDeinit" , OBJPROP_WIDTH , 50 ); 
   return ( INIT_SUCCEEDED );
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnDeinit ( const int reason)
  {
   if ( UninitializeReason () != REASON_CHARTCHANGE )      // ПРОВЕРКА ПРИЧИНЫ ДЕИНИЦИАЛИЗАЦИИ РЕШАЕТ ТВОЮ ПРОБЛЕМУ НА РАЗ...
    {
     ObjectDelete ( 0 , "InitDeinit" );
     ChartRedraw ( 0 ); // ЭТО НУЖНО ТОЛЬКО НА ВЫХОДНЫЕ. В РАБОЧИЕ ДНИ НЕ БУДЕТ ЛИШНИМ, НО С ПРИХОДОМ НОВОГО ТИКА ОБЪЕКТ БУДЕТ НЕДОСТУПЕН.
     Print ( __FUNCTION__ , "  InitDeinit удалён" );
    }
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int OnCalculate ( const int rates_total,       // размер массива price[]
                 const int prev_calculated,   // обработано баров на предыдущем вызове
                 const int begin,             // откуда начинаются значимые данные
                 const double & price[])       // массив для расчета
  {

   datetime t = TimeCurrent ();
   double pr  = SymbolInfoDouble ( Symbol (), SYMBOL_BID );
   ObjectMove ( 0 , "InitDeinit" , 0 ,t,pr);
   return (rates_total);
  }
//+------------------------------------------------------------------+
Dosyalar:
 
Alexey Viktorov :

NEREDEYSE doğru kodun daha iyi bir örneğini kullanın

Yani aynı. Nesne, göstergenin gerçek kopyası değil, Deinit aracılığıyla silinebilir. Ve OnInit gerçek bu olaydan ÖNCE yürütülür.

Ancak eski kopyanın OnDeinit'inden yenisinin OnInit'ine herhangi bir bilginin transferini göstermek çok daha iyidir. Aslında mesele bu.

 
fxsaber :
Yani aynı. Nesne, göstergenin gerçek kopyası değil, Deinit aracılığıyla silinebilir. Ve OnInit gerçek bu olaydan ÖNCE yürütülür.
 if ( UninitializeReason () != REASON_CHARTCHANGE )
 {
  // Если причина деинициализации смена периода графика сюда не попадаем и объекты не удаляются.
 }

Bilgisayarın elektrik fişinin çıkarılması dışında tüm diğer durumlarda, nesne silinecektir.

 
fxsaber :


Ancak eski kopyanın OnDeinit'inden yenisinin OnInit'ine herhangi bir bilginin transferini göstermek çok daha iyidir. Aslında mesele bu.

Basit çözümlerin sizin beceriniz olmadığını uzun zaman önce fark ettim. :-)))
 
Alexey Viktorov :

Bilgisayarın elektrik fişinin çıkarılması dışında tüm diğer durumlarda, nesne silinecektir.

Belirli bir tartışma sorununa bir çözüm gösterdiniz. Genel ifade aşağıdaki gibidir
fxsaber :

Herhangi bir bilginin eski kopyanın OnDeinit'inden yenisinin OnInit'ine güvenilir şekilde aktarılması .

Sonuç olarak, net bir OnDeinit / OnInit yürütme sırası gerektirir. Buna hiç ihtiyacım olmadı ama sorunsuz bir çözüm fikrini hayata geçirdim.

 
fxsaber :
Belirli bir tartışma sorununa bir çözüm gösterdiniz. Genel ifade aşağıdaki gibidir

Sonuç olarak, net bir OnDeinit / OnInit yürütme sırası gerektirir. Buna hiç ihtiyacım olmadı ama sorunsuz bir çözüm fikrini hayata geçirdim.

Evet, umurumda değil. Ama sol ayağın küçük parmağıyla sağ kulağı kaşımak bana göre değil. Bu kadar basit bir çek yerine " bu " yaz... Buna ne diyeceğimi bile bilmiyorum. Amatör olsun çünkü mazoşizmin var olma hakkı var. Programlamadaki profesyonelliğinize saygılarımla.

 
Alexey Viktorov :

Bu kadar basit bir kontrol yerine " bunu " yazın...

Bu başlıkta tartışılan sorunun özünü anlamadınız.
 
fxsaber :
Bu başlıkta tartışılan sorunun özünü anlamadınız.

Anladım, ama sorunun tartışmasını yeteneklerinize çevirdiniz (küçük değil).

Ne de olsa cevabım, yeteneklerinize ve On_Init ve On_Deinit yürütme sırasının düzenlenmesiyle bir veri aktarımı örneğine yanıt olarak değil, kötü adam kodunun belirli bir örneğine oldu.

Diyaloğu sürdürmenin amacı nedir? Sol ayağın küçük parmağıyla sağ kulağı kaşımanın çok hoş olduğuna beni ikna etmeye mi çalışıyorsun? Yoksa başka bir amaç mı?

 
Alexey Viktorov :

Yoksa başka bir amaç mı?

Üzerinde çalıştığınız örnek, tartışılan soruna tam olarak uymadı. UninitializeReason çözümüne sahip olmayacak başka bir örnek göstermek mümkündür.