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

 
fxsaber :
Çözüm

Onlar. bütün sorun, herhangi bir göstergeye aynı satırlardan İKİ eklemek.


Kütüphane Kodu


Herhangi bir şekilde daha basit, daha net ve daha net mi?

Ayrıca, göstergenin her bir örneğinin global bir değişken olarak kendi adına ihtiyacı vardır, aniden grafikte farklı parametrelere sahip iki gösterge belirir).

 
Dmitry Fedoseev :


Herhangi bir şekilde daha basit, daha net ve daha net değil mi?

Mümkün değil.

Ayrıca, göstergenin her bir örneğinin global bir değişken olarak kendi adına ihtiyacı vardır, aniden grafikte farklı parametrelere sahip iki gösterge belirir).

Bunu yapmanıza gerek yok çünkü. indikatörün aynı grafik üzerinde farklı parametrelere sahip iki örneği bu başlıkta istedikleri kullanıma aykırıdır.

Bu nedenle, ikinci örneği başlatırsanız, ilki boşaltılana kadar çalışmayacaktır.

 
fxsaber :

Mümkün değil.

...



 #property indicator_chart_window
#property indicator_buffers 1
#property indicator_plots    1
//--- plot Label1
#property indicator_label1   "Label1"
#property indicator_type1   DRAW_LINE
#property indicator_color1   clrRed
#property indicator_style1   STYLE_SOLID
#property indicator_width1   1

string gvName;

double Label1Buffer[];

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit (){
   gvName= MQLInfoString ( MQL_PROGRAM_NAME );
   
   if ( GlobalVariableCheck (gvName)){
       EventSetMillisecondTimer ( 1 );      
   }
   else {
       GlobalVariableSet (gvName, 1 );
      NewInit();
   }
   return ( INIT_SUCCEEDED );
}

void NewInit(){
   // все что было в ините должно быть здесь
   SetIndexBuffer ( 0 ,Label1Buffer, INDICATOR_DATA );
}

void OnDeinit ( const int r){
   GlobalVariableDel (gvName);
}

void OnTimer (){
   if (! GlobalVariableCheck (gvName)){
       EventKillTimer ();      
       GlobalVariableSet (gvName, 1 );
      NewInit();
   }

}  
//+------------------------------------------------------------------+
//| 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[])
  {

   for ( int i=rates_total- 10 ;i<rates_total;i++)Label1Buffer[i]=close[i];

   return (rates_total);
  }
//+------------------------------------------------------------------+
O?
 
Dmitry Fedoseev :
O?

Tabii ki değil. Tutamaç şeması global değişken adına yazılmalıdır.

Ve benim çözümüm sadece iki satır ekleyerek elde edildi. Bu biraz daha kolay.

 #include <Init_Sync.mqh> // Делает синхронизированными Init/Deinit индикаторов

#property indicator_chart_window
#property indicator_buffers 1
#property indicator_plots    1
//--- plot Label1
#property indicator_label1   "Label1"
#property indicator_type1   DRAW_LINE
#property indicator_color1   clrRed
#property indicator_style1   STYLE_SOLID
#property indicator_width1   1

double Label1Buffer[];

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit (){
   SetIndexBuffer ( 0 ,Label1Buffer, INDICATOR_DATA );
   return ( INIT_SUCCEEDED );
}

void OnTimer (){
  CHECK_INIT_SYNC;
   }

//+------------------------------------------------------------------+
//| 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[])
  {

   for ( int i=rates_total- 10 ;i<rates_total;i++)Label1Buffer[i]=close[i];

   return (rates_total);
  }
//+------------------------------------------------------------------+
 
fxsaber :

Tabii ki değil. Tutamaç şeması global değişken adına yazılmalıdır.

Ve benim çözümüm sadece iki satır ekleyerek elde edildi. Bu biraz daha kolay.


Ve mantığın kendisi (algoritma) aynı mı?
 
fxsaber :

....

Ve benim çözümüm sadece iki satır ekleyerek elde edildi. Bu biraz daha kolay.

Ve SetIndexBuffer gibifonksiyonları standart bir init'te değil de gecikmeli olarak çağırmak sizi rahatsız etmiyor mu? Bunun normal olduğundan kesinlikle emin misin?

 
Dmitry Fedoseev :

Ve mantığın kendisi (algoritma) aynı mı?
Evet.
 
Dmitry Fedoseev :

Kaç satırım olduğunu ve kaç satırın olduğunu sayın ... iki satır ekler, nerede olduğu belirsiz bir yığın - iki satır.

Saymadınız - çok.

Herhangi bir göstergenin bu tartışmanın istenen özelliğine sahip olması için tam olarak iki tane eklemek yeterlidir.

 
fxsaber :

Saymadınız - çok.

Herhangi bir göstergenin bu tartışmanın istenen özelliğine sahip olması için tam olarak iki tane eklemek yeterlidir.


Bu onuncu soru. Bir zevk meselesi. Ama yine de kodum 5 kat daha küçük ve okunabilir durumda :/

Daha da ilginci şu:

SetIndexBuffer işlevini standart bir başlatmada değil de gecikmeli olarak çağırmak sizi rahatsız ediyor mu? Bunun normal olduğundan kesinlikle emin misin?

 
Dmitry Fedoseev :

SetIndexBuffer işlevini standart bir başlatmada değil de gecikmeli olarak çağırmak sizi rahatsız ediyor mu? Bunun normal olduğundan kesinlikle emin misin?

Kesinlikle . OnCalculate'i çağırmak muhtemelen sorunlara neden olacaktır, ancak bu, kitaplıkta küçük bir ince ayar ile çözüldü. Pazartesi günü netleştirmek mümkün olacak.

Prensip olarak, bir satırla yapabilirsiniz.