Erros, bugs, perguntas - página 1390

 

Não espere no init indicador para criar completamente o indicador.

Crie o indicador e controle de retorno e todo o ambiente e história serão preparados mais tarde e o seu código de recálculo será chamado.

 
Renat Fatkhullin:

Não esperar na initia pela criação completa do indicador.

Crie o indicador e controle de retorno e todo o ambiente e história serão preparados mais tarde e o seu código de recálculo será chamado.

Obrigado, ou seja, a verificação de 4806 deve ser feita cada vez que os dados são recebidos já após a devolução do OnInit()?
 
Em cada ponto de leitura de dados
 

É aqui que o indicador é chamado e os seus valores são calculados dentro da OnCalculate. Pode esperar indefinidamente, não se efectua qualquer novo cálculo. Para ser executado no gráfico do período D1

int i_ich=INVALID_HANDLE;
double ind_buf[];

int OnInit(){
   i_ich=iIchimoku(Symbol(), PERIOD_H4, 9, 26, 52);
   if(i_ich==INVALID_HANDLE){
      Print("Невозможно создать индиктор Ишимоку!");
      return(INIT_FAILED);
   }
   SetIndexBuffer(0, ind_buf, INDICATOR_DATA);
   ArraySetAsSeries(ind_buf, true);
   return(INIT_SUCCEEDED);
}


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[]){
   double temp[];
   int copied=CopyBuffer(i_ich,0,0,1,temp);
   if(copied<=0){
      datetime now=TimeLocal();
      while(BarsCalculated(i_ich)<=0 && !IsStopped()){  
         Comment("Ждем пересчета индикатора Ишимоку... ",int(TimeLocal()-now));
      }
      if(BarsCalculated(i_ich)>0){
         Print("Расчитано ", BarsCalculated(i_ich), " баров за ",int(TimeLocal()-now)," секунд");
      }
      Comment("");
   } 

   return(rates_total);
}

Explique por favor porque é que a leitura Ishimoku não é calculada.

 
Ilya Malev:

É aqui que o indicador é chamado e os seus valores são calculados dentro da OnCalculate. Pode esperar indefinidamente, não se efectua qualquer novo cálculo. Para ser executado no gráfico do período D1

Explique por favor porque é que a leitura Ishimoku não é calculada.

Que tal isto?

//+------------------------------------------------------------------+
//|                                                      ProjectName |
//|                                      Copyright 2012, CompanyName |
//|                                       http://www.companyname.net |
//+------------------------------------------------------------------+
#property indicator_chart_window
#property indicator_buffers 1
#property indicator_plots   0
int i_ich=INVALID_HANDLE;
double ind_buf[];
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int OnInit()
  {
   i_ich=iIchimoku(Symbol(),PERIOD_H4,9,26,52);
   if(i_ich==INVALID_HANDLE)
     {
      Print("Невозможно создать индиктор Ишимоку!");
      return(INIT_FAILED);
     }
   SetIndexBuffer(0,ind_buf,INDICATOR_DATA);
   ArraySetAsSeries(ind_buf,true);
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
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[])
  {
   static int count;
   Print(count);
   double temp[];
   datetime now=TimeLocal();
   int copied=CopyBuffer(i_ich,0,0,1,temp);
   if(copied>0)
      Print("Расчитано ",BarsCalculated(i_ich)," баров за ",int(TimeLocal()-now)," секунд");
   count++;
   return(rates_total);
  }
//+------------------------------------------------------------------+
?
 

Nunca se deve fazer um loop da expectativa no código indicador. Nos guiões e Expert Advisors pode, mas nos indicadores não pode de forma alguma.

A estratégia para cálculos e pedidos de dados externos em indicadores deve ser a seguinte: se o pedido de dados não foi bem sucedido, então saímos imediatamente, adiando os cálculos para o próximo tick. No próximo tick/call, tentaremos novamente solicitar os dados necessários.

 
Karputov Vladimir:

E se assim for:

?
Saídas "0" (como é domingo, não há reinício do OnCalculate )
 
Renat Fatkhullin:

Nunca se deve fazer um loop da expectativa no código indicador. Nos guiões e nos Expert Advisors pode, mas nos indicadores não pode absolutamente.

A estratégia para os cálculos e pedidos de dados estrangeiros nos indicadores deve ser a seguinte: se o pedido de dados não foi bem sucedido, então saímos imediatamente, adiando os cálculos para o próximo tick. No próximo tick/call, tentaremos novamente solicitar os dados necessários.

Ok, mas e se as leituras do indicador devem ser calculadas durante uma corrida, sem esperar pelo próximo tick? Por exemplo, se houver um fim-de-semana ou apenas um período de baixa liquidez, quando o tick está fora de um minuto? Utilizar OnTimer em vez de OnCalculate?
 
Ilya Malev:
Saídas "0" (uma vez que é Domingo, sem reprise OnCalculate )
No provador, no provador! E no fim-de-semana é necessário clicar com o botão direito do rato no gráfico e "Actualizar".
 

Após pressionar "refrescar" tudo é calculado. Seria mais conveniente se os dados indicadores, criados no inite, fossem calculados antes da primeira chamada do OnCalculate/OnTimer, etc.

Seria útil ter a possibilidade de esperar pelo seu cálculo após a inicialização no laço dentro do indicador.

Para calcular o indicador, o utilizador deve carregar várias vezes em "refresh" no gráfico. Será que ele precisa. Recordará o bom velho MT4 e permanecerá nele, apesar de algumas vantagens do MT5.