Erros, bugs, perguntas - página 1391

 
Ilya Malev:

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.

Quaisquer cálculos nos indicadores DEVEM ser feitos apenas em OnCalculate().
 
Karputov Vladimir:
Quaisquer cálculos em indicadores DEVEM ser feitos apenas em OnCalculate().
Estou a falar das leituras do indicador Ishimoku neste caso. Estou a falar de leituras indicadoras que são utilizadas na actual, ou seja, na OnCalculate. Portanto, são calculados antes da chamada da OnCalculate, como era no MT4. Ou seria possível esperar pelo seu cálculo em OnCalculate. Caso contrário, os utilizadores terão de carregar várias vezes em Update para construir um indicador. Como nem todos os indicadores são construídos sobre toda a história em 1 segundo, existem indicadores complexos que demoram mais tempo a calcular. Durante todo este tempo o utilizador terá de esperar por cima do botão "Refresh", enquanto no MT4 só tem de esperar que seja desenhado.
 
Ilya Malev:
Estou a falar das leituras do indicador Ishimoku neste caso. Estou a falar de leituras indicadoras que são utilizadas na actual, ou seja, OnCalculate. Portanto, são calculados antes de OnCalculate ser chamado, como era no MT4.
No OnInit() é realizada a preparação do ambiente comercial para o indicador. E apenas em OnCalculate() pode utilizar os dados indicadores.
 
Ilya Malev:
Estou a falar das leituras do indicador Ishimoku neste caso. Estou a falar de leituras indicadoras que são utilizadas em corrente, ou seja, em OnCalculate. Portanto, são calculados antes da chamada da OnCalculate, como era no MT4. Ou seria possível esperar pelo seu cálculo em OnCalculate. Caso contrário, os utilizadores terão de carregar várias vezes em Update para construir um indicador. Como nem todos os indicadores são construídos sobre toda a história em 1 segundo, existem indicadores complexos que demoram mais tempo a calcular. Durante todo este tempo o utilizador terá de esperar por cima do botão "Refresh", enquanto no MT4 só tem de esperar que seja desenhado.

Este problema surge de tempos a tempos no fórum. Infelizmente, chamar OnCalculate() em OnTimer() não resolve o problema.

Mas pode experimentá-lo. Um exemplo pode ser encontrado neste artigo: MQL5 Recipes - Development of a Multicurrency Volatility Indicator in MQL5.

Posteriormente, poderá escrever se funcionou ou não.

 
Karputov Vladimir:
OnInit() prepara o ambiente comercial para o indicador. E apenas em OnCalculate() pode utilizar os dados indicadores.
Acontece que não pode, sem premir o botão "Actualizar" no gráfico uma ou várias vezes (ou esperando por 1/número de ticks), se o indicador utilizar outros indicadores de outros símbolos e/ou tf.
 
Anatoli Kazharski:

Este problema surge de tempos a tempos no fórum. Infelizmente, chamar OnCalculate() em OnTimer() não resolve o problema.

Mas pode experimentá-lo. Um exemplo pode ser encontrado neste artigo: MQL5 Recipes - Development of a Multicurrency Volatility Indicator in MQL5.

Depois, escrever se funcionou ou não, se não foi demasiado incómodo.

Obrigado pela ligação. Vou tentar e avisar-vos-ei.
 
Ilya Malev:
Acontece que não pode, sem premir o botão "Update" no gráfico uma ou várias vezes (ou esperar por 1/alguns ticks), se o indicador utilizar outros indicadores de outros símbolos e/ou tf.

E se olhar mais de perto para o funcionamento do código que eu dei? E em particular aos Peritos? Depois de reiniciar o terminal no fim-de-semana:

2015.10.11 14:44:01.672 test (USDCAD,M5)        0
2015.10.11 14:44:01.681 test (USDCAD,M5)        1
2015.10.11 14:44:01.682 test (USDCAD,M5)        Расчитано 16518 баров за 0 секунд
2015.10.11 14:44:01.705 test (USDCAD,M5)        2
2015.10.11 14:44:01.705 test (USDCAD,M5)        Расчитано 16518 баров за 0 секунд

Pode ver perfeitamente que o cálculo só foi efectuado na segunda chamada para a OnCaalculate(). Assim, ninguém retira ao programador a responsabilidade de verificar: verificar o resultado de CopyBuffer() em OncalCulate() - se a função não devolveu nada, deve ser verificada na próxima entrada em OnCalculate().

 
Anatoli Kazharski:

Este problema surge de tempos a tempos no fórum. Infelizmente, chamar OnCalculate() em OnTimer() não resolve o problema.

Mas pode experimentá-lo. Um exemplo pode ser encontrado neste artigo: MQL5 Recipes - Development of a Multicurrency Volatility Indicator in MQL5.

Por favor, escreva mais tarde, se não houver muitos problemas, quer tenha funcionado ou não.

Ainda não li o artigo, mas funciona bem com o OnTimer

//+------------------------------------------------------------------+
//|                                                      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()
  {
   EventSetTimer(1);
   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);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+

void OnTimer(){
   datetime Arr1[];
   double Arr2[];
   long Arr3[];
   int Arr4[];
   OnCalculate(0, 0, Arr1, Arr2, Arr2, Arr2, Arr2, Arr3, Arr3, Arr4);
}

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=0;
   static datetime now=0;
   if(now==0)  now=TimeLocal();
   if(count>=0){
      Print(count);
      double temp[];
      int copied=CopyBuffer(i_ich,0,0,1,temp);
      if(copied>0){
         Print("Расчитано ",BarsCalculated(i_ich)," баров за ",int(TimeLocal()-now)," секунд");
         EventKillTimer(); // Индикаторы рассчитались, далее работаем только с OnCalculate
         count=-1;
      }else
         count++;
   }
   if(rates_total==0)   return(0); // Если это вызов из OnTimer, то возврат
   
   // ...
   return(rates_total);
}

Tenho uma estranha imagem mostrando que a chamada de OnCalculate da OnTimer funciona) Preciso de acrescentar valores correctos em séries temporais

 
Ilya Malev:

Ainda não li o artigo, mas a recepção com o OnTimer funciona bem

Em indicadores simples, funciona bem. Mas nas mais complexas, por alguma razão, por vezes cola. )
 
Ilya Malev:

Ainda não li o artigo, mas a recepção com o OnTimer funciona bem

Use o Styler - é melhor para identificar erros.

   if(count>=0)
     {
      Print(count);
      double temp[];
      int copied=CopyBuffer(i_ich,0,0,1,temp);
      if(copied>0)
        {
         Print("Расчитано ",BarsCalculated(i_ich)," баров за ",int(TimeLocal()-now)," секунд");
         EventKillTimer(); // Индикаторы рассчитались, далее работаем только с OnCalculate
         count=-1;
        }
      else
         count++;
     }
Aumentar variável de contagem antes de sair de OnCalculate() - neste caso, esta variável contará correctamente todas as corridas em OnCalculate.
Razão: