Erros, bugs, perguntas - página 2997

 
Alexey Viktorov:

Talvez os esquis sejam maus?


E depois há o RTS-6.21.


Isto é outra coisa. Que corretor tem e que versão do MT5.

 
Alexey Viktorov:

Talvez os esquis sejam maus?


E também a RTS-6.21.


Obrigado pela ajuda. Imaginei-o. Ligou diferentes versões de indicadores a partir de diferentes pastas.

 
Francuz:

Sim, eu fiz. O resultado não se alterou.

Não acredito.
tente novamente

datetime a = D'2021.04.08 10:00:00';
   int      handle;
   double   Buffer[];
   

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
{

   handle = iCustom(_Symbol, PERIOD_CURRENT, "Examples\\ATR.ex5", 14);
   ::Print(__FUNCTION__ + "| PERIOD_CURRENT = ", EnumToString(_Period));

   return(INIT_SUCCEEDED);
}

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

   if(prev_calculated>0 && handle != INVALID_HANDLE)
   {
      ::CopyBuffer(handle, 0, a, 1, Buffer);
      
      double BS = ::NormalizeDouble(Buffer[0], _Digits);
      
      ::Print(__FUNCTION__ + "| a = ", a);
      ::Print(__FUNCTION__ + "| BS ", BS);
      
      handle = INVALID_HANDLE;
   }
   
   // return value of prev_calculated for next call
   return(rates_total);
}
 
Nikolai Semko:

Não acredito.
tente novamente.

Descobri-o. O problema era que dois ficheiros ATR diferentes de pastas diferentes estavam ligados. Foi por isso que houve uma discrepância nos valores.

Obrigado pela vossa ajuda.
 
Nikolai Semko:

Não acredito.
tente novamente

Nikolai, ele tinha um problema diferente. Também não compreendi imediatamente a questão, pensei que precisava de obter valores de uma TF diferente. Lubrificou os esquis e tudo correu bem.
 
Alexey Viktorov:
Nikolay, ele tinha um problema diferente. Também não compreendi a pergunta no início, pensei que precisava de obter os valores de outra TF. Eu oleei os esquis e tudo correu bem.

Estranho, não compreendi nada.
Reproduzi o seu problema no meu exactamente como ele descreveu.
Aconteceu exactamente porque a única execução de CopyBuffer teve lugar na primeira execução em OnCalculate, quando prev_calculated == 0 e não havia garantia de que as barras já tivessem sido geradas.
A solução foi ignorar esta primeira execução e executar o único CopyBuffer apenas quando pré_calculado>0.
Não compreendo"dois ficheiros ATR diferentes de pastas diferentes ".

 
Nikolai Semko:

Estranho, não compreendi nada.
Reproduzi o seu problema no meu exactamente como ele descreveu.
Aconteceu exactamente porque a única execução de CopyBuffer teve lugar na primeira execução em OnCalculate, quando prev_calculated == 0 e não havia garantia de que as barras já tivessem sido geradas.
A solução foi ignorar esta primeira chamada e executar um único CopyBuffer apenas quando pré_calculado>0.
Porque é que havia"dois ficheiros ATR diferentes de pastas diferentes " - não compreendo.

Bem, se o gráfico for aberto e o indicador para a actual TF for criado, os dados já devem estar prontos quando o gráfico for aberto. Não é?

 
Alexey Viktorov:

Bem, se um gráfico for aberto e for criado um indicador para a actual TF, os dados já devem estar prontos quando o gráfico for aberto. Não é?

Oh, quantas descobertas maravilhosas nos esperam ... mais

 
Alexey Viktorov:

Bem, se um gráfico estiver aberto e for criado um indicador para a actual TF, os dados já devem estar prontos quando o gráfico for aberto. Não é?

Não o expressei correctamente. As barras estão sim - o mais provável é que estejam prontas. Mas não há garantias de que o indicador tenha sido recalculado para todas estas barras na primeira chamada da OnCalculate, quando pré_calculado == 0.
É possível correr um indicador deste tipo para se certificar disso.
Mas deve ser feito quando as cotações são negociadas. Se o mercado estiver fechado, não verá o descasamento.
Por isso é melhor experimentá-la em moeda criptográfica, que está em movimento, ao fim-de-semana.
Se o tamanho da matriz tampão = -1, significa que o indicador tampão ainda não foi recalculado e o valor BS não será correcto.

   datetime a = D'2021.04.08 10:00:00';
   int      handle;
   double   Buffer[];
   

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
{

   handle = iCustom(_Symbol, PERIOD_CURRENT, "Examples\\ATR.ex5", 14);
   ::Print(__FUNCTION__ + "| PERIOD_CURRENT = ", EnumToString(_Period));

   return(INIT_SUCCEEDED);
}

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

   if(handle != INVALID_HANDLE)
   {
      ::CopyBuffer(handle, 0, a, 1, Buffer);
      
      double BS = ::NormalizeDouble(Buffer[0], _Digits);
      
      ::Print(__FUNCTION__ + "| a = ", a);
      ::Print(__FUNCTION__ + "| BS ", BS);
      int total_bars = iBars(NULL,PERIOD_CURRENT);
      int size = CopyBuffer(handle, 0, 0, total_bars, Buffer);
      Print("Total Bars = " + string(total_bars) + ", Size of Buffer array = " + string(size));
      
      handle = INVALID_HANDLE;
   }
   
   // return value of prev_calculated for next call
   return(rates_total);
}


Se o fizer na próxima chamada da OnCalculate (quando pré_calculado>0) então não haverá tal problema.

SOM houve um erro no código - corrigiu-o

 
Artyom Trishkin:

Oh, que descobertas maravilhosas nos esperam... mais

Referia-me aos dados para calcular o indicador. Não seja sarcástico))))