Последовательность выполнение Init() и DeInit() - страница 22

 
fxsaber:
Решение проблемы

Т.е. вся проблема - это добавление ДВУХ одних и тех же строк в любой индикатор.


Код библиотеки


А проще, понятней и наглядней никак?

Еще для каждого экземпляра индикатора нужно свое имя глобальной переменой, вдруг на графике два индикатора с разными параметрами).

 
Dmitry Fedoseev:


А проще, понятней и наглядней никак?

Никак.

Еще для каждого экземпляра индикатора нужно свое имя глобальной переменой, вдруг на графике два индикатора с разными параметрами).

Этого делать не нужно, т.к. два экземпляра индикатора с разными параметрами на одном чарте противоречит тому использованию, которое хотят в этой ветке.

Поэтому, если запустить второй экземпляр, то он просто не будет работать, пока не выгрузится первый.

 
fxsaber:

Никак.

...



#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);
  }
//+------------------------------------------------------------------+
Оно?
 
Dmitry Fedoseev:
Оно?

Нет, конечно. Handle-чарта нужно обязательно прописывать в имени глобальной переменной.

И мое решение достигается добавлением всего двух строк. Это несколько проще.

#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:

Нет, конечно. Handle-чарта нужно обязательно прописывать в имени глобальной переменной.

И мое решение достигается добавлением всего двух строк. Это несколько проще.


А сама логика (алгоритм) та же?
 
fxsaber:

....

И мое решение достигается добавлением всего двух строк. Это несколько проще.

А вызов функций типа  SetIndexBuffer с задержкой и не в стандартном ините не смущает? Вы абсолютно уверены, что это нормально? 

 
Dmitry Fedoseev:

А сама логика (алгоритм) та же?
Да.
 
Dmitry Fedoseev:

Посчитайте сколько строк у меня и сколько у вас... две строки он добавляет, ацкая куча маловнятного куда - две строки.

У вас не считал - много.

Ровно две достаточно добавить, чтобы любой индикатор стал обладать желанным свойством данного обсуждения.

 
fxsaber:

У вас не считал - много.

Ровно две достаточно добавить, чтобы любой индикатор стал обладать желанным свойством данного обсуждения.


Это уже вопрос десятый. Дело вкуса. Но все же моего кода в 5 раз меньше и он читаемый :/

Интересней это:

Вызов функции SetIndexBuffer с задержкой и не в стандартном ините не смущает? Вы абсолютно уверены, что это нормально? 

 
Dmitry Fedoseev:

Вызов функции SetIndexBuffer с задержкой и не в стандартном ините не смущает? Вы абсолютно уверены, что это нормально? 

Абсолютно. Вызов OnCalculate, возможно, вызовет проблемы, но это решается легкой правкой библиотеки. В понедельник можно будет уточнить.

В принципе, можно и одной строчкой обойтись.

Причина обращения: