Seqüência de execução Init() e DeInit() - página 22

 
fxsaber:
A solução para o problema

Ou seja, todo o problema é acrescentar DOIS das mesmas linhas a qualquer indicador.


Código da biblioteca


Existe algo mais simples, claro e vívido?

Eu também preciso de um nome de variável global para cada instância do indicador, caso haja dois indicadores com parâmetros diferentes no gráfico).

 
Dmitry Fedoseev:


Não pode ser mais simples, mais claro e mais óbvio?

Não.

Também cada instância indicadora precisa de seu próprio nome de variável global, caso haja dois indicadores com parâmetros diferentes no gráfico).

Você não deve fazer isso, porque duas instâncias do indicador com parâmetros diferentes em um gráfico contradizem o uso, que é desejado neste ramo.

Portanto, se você iniciar a segunda instância, ela simplesmente não funcionará até que a primeira seja descarregada.

 
fxsaber:

De jeito nenhum.

...



#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);
  }
//+------------------------------------------------------------------+
Será?
 
Dmitry Fedoseev:
Será?

Não, é claro que não. O gráfico de mão deve necessariamente ser escrito no nome da variável global.

E minha solução é alcançada acrescentando apenas duas linhas. É um pouco mais simples.

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

Não, é claro que não. O gráfico de mão deve necessariamente ser escrito em nome de uma variável global.

E minha solução é alcançada acrescentando apenas duas linhas. Isto é um pouco mais simples.


E a lógica (algoritmo) em si é a mesma?
 
fxsaber:

....

E minha solução é alcançada acrescentando apenas duas linhas. Isto é um pouco mais simples.

E chamar funções como SetIndexBuffer com um atraso e não no init padrão não o incomoda? Você tem certeza absoluta de que está tudo bem?

 
Dmitry Fedoseev:

A lógica (algoritmo) é a mesma?
Sim.
 
Dmitry Fedoseev:

Conte quantas linhas eu tenho e quantas você tem... duas linhas que acrescenta, um inferno de muita bobagem para onde - duas linhas.

Você não contou - isso é muito.

Exatamente dois é o suficiente para adicionar para que qualquer indicador tenha a propriedade cobiçada desta discussão.

 
fxsaber:

Você não contou - isso é muito.

Exatamente dois é o suficiente para fazer de qualquer indicador uma característica desejável desta discussão.


Esta é a décima pergunta. É uma questão de gosto. Mas ainda assim meu código é 5 vezes menor e legível :/

Mais interessante é isto:

Chamar a função SetIndexBuffer com um atraso e não no inite padrão não é confuso? Você tem certeza absoluta de que isso é normal?

 
Dmitry Fedoseev:

A função SetIndexBuffer é chamada com um atraso e não está no init padrão? Você tem certeza absoluta de que isso é normal?

Absolutamente. Chamar a OnCalculate provavelmente causará problemas, mas isto é resolvido por edições fáceis na biblioteca. Será possível esclarecer isso na segunda-feira.

Em princípio, uma linha pode ser suficiente.