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

 
Комбинатор :

tf'yi değiştirirken.

göstergeler eski TF'nin arabelleğinde kalırsa, zamanlayıcıları da etkileyebilir. Ah bu Cuma deliryumu gibi.

daha güzel
 
fxsaber :
daha güzel
Orada farklı dijitallerle, yol boyunca, yazıcı her yerde ilerliyor, 5 yıl önce bu tür hesapları bir terminalde geçmeye yemin etti.
 
fxsaber :
daha güzel

Bu, MT4'teki doğru dizilimden bahsedenler içindir.

Bakın ve MT4'te her şeyin çok güzel olmadığını anlayın.

 
fxsaber :
Sıra aynı.


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?

OnInit ve OnDeinit sırasının belirsizliğinin gösterilmesi


 #property copyright "Copyright 2016, MetaQuotes Software Corp."
#property link        "https://www.mql5.com"
#property version    "1.00"
#property indicator_chart_window
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int OnInit ()
  {

   datetime t = TimeCurrent ();
   double pr  = SymbolInfoDouble ( Symbol (), SYMBOL_BID );

   ObjectCreate ( 0 , "InitDeinit" , OBJ_ARROW_THUMB_UP , 0 ,t,pr);
   ObjectSetInteger ( 0 , "InitDeinit" , OBJPROP_WIDTH , 15 ); 

   return ( INIT_SUCCEEDED );
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnDeinit ( const int reason)
  {
   ObjectDelete ( 0 , "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:
 
Nikolai Semko :

Peki, o tam olarak nerede?

Zamanlayıcı hakkında bir tartışma vardı.
 
fxsaber :
Zamanlayıcı hakkında bir tartışma vardı.

Kimin umrunda. Unit'e nesne oluşturmak yerine EventSetTimer, Deunit'e nesne silmek yerine EventKillTimer koyabilirsiniz. Ve bundan dolayı belirsizlik azalmayacaktır, çünkü. ayarlanan zamanlayıcı , bazen ve bazen değil, eski TF'nin Deunit'i tarafından öldürülecektir. Ve daha da kötü olacak çünkü. nesne en azından görünür, ancak zamanlayıcı görünmüyor - çalışıyor veya çalışmıyor.
 

Belki de çoktan bulmuşlardır, her şeyi okumadım. Gösterge bir panel oluşturursa, terminalin global değişkenini kullanabilir, değerini init'te 1 artırabilir ve grafik nesnelerin adlarına ek olarak kullanabilirsiniz.

Başka bir görevim vardı - panel ayarlarını kaydetmek, bunun için deinite'ta global terminal değişkenleri yarattım. Sorunun çözümü basittir - init'te global terminal değişkenleri oluşturun ve grafik panelinde parametreler değiştikçe her birini güncelleyin. Tanımlamada, değişkenleri yalnızca başlatmadan kaldırma nedeni göstergeyi kaldırmaksa silin.

 
Dmitry Fedoseev

Gösterge bir panel oluşturursa, terminalin global değişkenini kullanabilir, değerini init'te 1 artırabilir ve grafik nesnelerin adlarına ek olarak kullanabilirsiniz.
Koltuk değnekleri her şeydir. Sadece terminalde doğru sıralamayı yapmanız gerekiyor, hepsi bu. Önce önceki örneği tanımlayın ve ancak ondan sonra yenisini başlatın.
Nikolay Semko :


Bu örneği oluşturan ve bu konuyu okumayan programcı ne düşünmelidir?

Tamamen katılıyorum. Okumayanlar bu özelliği bilmeyecek ve anlamaya çalışırken zamanlarını öldürecekler. Ve yüzlerce insan olacak ... özellikle yeni başlayanlar için üzgünüm.

Tek yapmanız gereken hatayı bir kez düzeltmek ve o kadar.

 
Nikolai Semko :

Kimin umrunda. Unit'e nesne oluşturmak yerine EventSetTimer, Deunit'e nesne silmek yerine EventKillTimer koyabilirsiniz. Ve bundan dolayı belirsizlik azalmayacaktır, çünkü. ayarlanan zamanlayıcı , bazen ve bazen değil, eski TF'nin Deunit'i tarafından öldürülecektir. Ve daha da kötü olacak çünkü. nesne en azından görünür, ancak zamanlayıcı görünmüyor - çalışıyor veya çalışmıyor.
Kulağa aptallık gibi geliyor. Gösterge kopyalama zamanlayıcılarının birbirleriyle hiçbir ilgisi yoktur.
 
elibrarius :
Koltuk değnekleri her şeydir. Sadece terminalde doğru sırayı yapmanız gerekiyor ve hepsi bu. Önce önceki örneği tanımlayın ve ancak ondan sonra yenisini başlatın.

Tamamen katılıyorum. Okumayanlar bu özelliği bilmeyecek ve anlamaya çalışırken zamanlarını öldürecekler. Ve yüzlerce insan olacak ... özellikle yeni başlayanlar için üzgünüm.

Tek yapmanız gereken hatayı bir kez düzeltmek ve o kadar.


İşte bununla ilgili!
Ben şahsen çikolata içindeyim, tk. Çoğunluk üzerinde avantajımı hissediyorum, çünkü Tüm bunlarla nasıl başa çıkacağımı biliyorum, sadece kelimelerle değil, eylemlerle de. Programlarıma koltuk değneği taktım ve vidaladım.

Geliştiricilerin neden inatla bu "özelliği" bir hata olarak görmediklerini anlamıyorum.
Örneğin:

Slava :

Göstergeler amaçlarına uygun olarak kullanılmalıdır.

Başka bir deyişle, grafiğin -dönemi sembolünü değiştirirken göstergenin OnInit ve OnDeinit'in yürütme sırası kimseyi endişelendirmemelidir.

Ama sonuçta, yukarıda animasyonlu bir gif ile bahsettiğim örnekte, bu konuyu okumayan bir programcı için bariz bir hata! Uygunsuz ne yapıldı?