O que atualiza o RefreshRates() - página 3

 
Artyom Trishkin:

Se você suspeitar de erros nas funções iXXXXX, use as funções SymbolInfoXXXXXXXX

Um exemplo de substituição de iXXXXX por SymbolInfoXXXXXXXX.

 
Mikhail Nazarenko:

Meu código é semelhante. Erro no OnTick

deveria ser

Se tivermos o cronograma atual M5, devemos comparar M5 com H1 e M1

O cronograma atual M5 é exibido corretamente. O problema era com H1 e M1.

Verifiquei na Alpari apenas o EURCHF M5 real em vez de imprimir, desenhei barras horizontais em cada um dos níveis.

Sim, eu coloquei o H1 dessa forma no início, mas depois decidi que seria muito raro fazer comparações. Por isso, mudei para M5.

Mikhail Nazarenko:

Permitam-me dar-lhes um exemplo de substituição de iXXXXXXX por SymbolInfoXXXXXXXX.

Artyom cometeu um pequeno erro...

Ao invés de iClose você pode usar

int  CopyClose( 
   string           symbol_name,       // имя символа 
   ENUM_TIMEFRAMES  timeframe,         // период 
   int              start_pos,         // откуда начнем  
   int              count,             // сколько копируем 
   double           close_array[]      // массив для копирования цен закрытия 
   );

algo como isto

double close_M5[];
    CopyClose(_Symbol, PERIOD_M5, 1, 1, close_M5);

Desta forma, você pode obter valores de várias barras com um único movimento de varinha mágica.

A função retorna verdadeira ou falsa, mas eu não a verifiquei neste exemplo. Você mesmo pode adivinhá-lo...

 
Alexey Viktorov:
Sim, foi assim que primeiro coloquei o H1, mas depois decidi que seria muito raro fazer comparações. Por isso, mudei para M5.

Eu terminei seu código lá e o afixei acima. Coloquei sua versão na minha e o resultado é o mesmo. Há um descasamento em quase todas as velas M5. Quais são seus resultados?

 
Mikhail Nazarenko:

Eu terminei seu código lá e o afixei acima. Coloquei sua versão na minha e o resultado é o mesmo. Há um descasamento em quase todas as velas M5. Quais são seus resultados?

Aqui temos que mudar

if(NewBar(PERIOD_M5))

para

if(NewBar(PERIOD_H1))
 
Alexey Viktorov:

Aqui temos que mudar

para

Não, melhor _Periodo. Porque esperaremos à força pela cotação zero do H1, enquanto o período atual é atualizado corretamente. Os dados devem ser recebidos nos primeiros segundos da hora, e não quando a hora for atualizada.

Quero acrescentar ao exemplo e verificar
double close_H1,close_M5,
       close_M1;

/*******************Expert initialization function*******************/
int OnInit()
 {
  return(INIT_SUCCEEDED);
 }/*******************************************************************/

/************************Expert tick function************************/
void OnTick()
 {
  if(NewBar(PERIOD_M5))
   {
    close_H1 = iClose(_Symbol, PERIOD_H1, 1);
    close_M1 = iClose(_Symbol, PERIOD_M1, 1);
    close_M5 = Close[1];
    
    
    if(close_H1 != close_M5)
      Print(close_H1, " H1 != M5 ", close_M5);
    if(close_M1 != close_M5)
      Print(close_M1, " M1 != M5 ", close_M5);
    
    double ARRAY_M1[];
    CopyClose(_Symbol, PERIOD_M1, 1, 1, ARRAY_M1);
    double ARRAY_H1[];
    CopyClose(_Symbol, PERIOD_H1, 1, 1, ARRAY_H1);
    
    if(ARRAY_H1[0] != close_M5)
      Print(ARRAY_H1[0], " CopyClose H1 != M5 ", close_M5);
    if(ARRAY_M1[0] != close_M5)
      Print(ARRAY_M1[0], " CopyClose M1 != M5 ", close_M5);
   
     Comment(
               close_H1, " H1\n",
               close_M1, " M1\n",
               close_M5, " M5\n",
               ARRAY_H1[0], " CopyCloseH1\n",
               ARRAY_M1[0], " CopyCloseM1\n"
            );
         
  }       
 }/******************************************************************/

/**********************Expert OnDeinit function**********************/
void OnDeinit(const int reason)
 {
  Comment("");
 }/******************************************************************/

bool NewBar(ENUM_TIMEFRAMES tf)
  {
   static datetime nt = 0;
   datetime tm = iTime(_Symbol, tf, 0);
   if(tm == 0)
      return false;
   if(tm != nt)
     {
      nt = tm;
      return true;
     }
   return false;
 }/******************************************************************/ 

 
Alexey Viktorov:

Aqui temos que mudar

para

O resultado é o mesmo que com iClose(); iClose e CopyClose parecem tirar dados do mesmo lugar.

Документация по MQL5: Доступ к таймсериям и индикаторам / iClose
Документация по MQL5: Доступ к таймсериям и индикаторам / iClose
  • www.mql5.com
iClose - Доступ к таймсериям и индикаторам - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
Mikhail Nazarenko:

Não, melhor _Periodo. Porque esperaremos à força pela cotação zero do H1, enquanto o período atual é atualizado corretamente. Os dados devem ser recebidos nos primeiros segundos da hora, e não quando a hora for atualizada.

Quero acrescentar ao exemplo e verificar

Parece que você não entende de todo como funciona a função do novo bar que aparece.

bool NewBar(ENUM_TIMEFRAMES tf)
  {
   static datetime nt = 0;
   datetime tm = iTime(_Symbol, tf, 0);
   if(tm == 0)
      return false;
   if(tm != nt)
     {
      nt = tm;
      return true;
     }
   return false;
 }/******************************************************************/ 

E conseqüentemente.

Mikhail Nazarenko:

O resultado é o mesmo de quando iClose(); iClose e CopyClose parecem tirar dados do mesmo lugar.

Ao receber valores de fechamento de barra e\ou outros da OHLC quando um novo valor TIKA é recebido, sempre não há problema.
 
Alexey Viktorov:

Você parece não entender como funciona a nova função do bar.

E conseqüentemente.

Ao obter valores próximos a barras e\ou outros da OHLC quando chega uma nova TIKA os valores são sempre sem problemas.

Responda à pergunta. Por que em uma vela nova, a função iClose(1) fornece informações desatualizadas e não atualizadas ou um erro? Isto é um bug.

 
Mikhail Nazarenko:

Responda à pergunta. Por que em uma vela nova a função iClose(1) retorna informações desatualizadas e não atualizadas ou um erro? Isto é um bug.

Se for um bug, então todos, ou quase todos, devem tê-lo. Se for só você, então é um problema no código.

Tenho minha EA na M15 com a determinação de um novo bar H1

/************************Expert tick function************************/
void OnTick()
 {
  if(NewBar(PERIOD_H1))
   {
    close_H1 = iClose(_Symbol, PERIOD_H1, 1);
    CopyClose(_Symbol, PERIOD_M5, 1, 1, close_M5);
    close_M1 = iClose(_Symbol, PERIOD_M1, 1);
    if(close_H1 != close_M1)
      Print(close_H1, " != ", close_M1);
   }
  Comment(close_H1, "\n",
          close_M5[0], "\n",
          close_M1, "\n"
         );
 }/******************************************************************/

E isto é o que diz o comentário.

Não há nenhuma discrepância.

 
OK, graças a todos os desenvolvedores por sua atenção, estou indo para criar muletas como a NewBar))) Tópico fechado.