Qué actualiza RefreshRates() - página 3

 
Artyom Trishkin:

Si sospecha que hay errores en las funciones iXXXXX, utilice las funciones SymbolInfoXXXXXX

Puede un ejemplo de sustitución de iXXXXX por SymbolInfoXXXXXX.

 
Mikhail Nazarenko:

Mi código es similar. Error en OnTick

debe ser

Si tenemos el marco temporal actual M5 debemos comparar M5 con H1 y M1

El marco temporal actual M5 se muestra correctamente. El problema era con H1 y M1.

Lo he comprobado en Alpari real EURCHF M5 sólo que en lugar de Imprimir he dibujado barras horizontales en cada uno de los niveles.

Sí, al principio puse H1 así, pero luego decidí que serían comparaciones demasiado raras. Así que lo cambié a M5.

Mikhail Nazarenko:

Puedo poner un ejemplo de sustitución de iXXXXXXX por SymbolInfoXXXXXX.

Artyom cometió un pequeño error...

En lugar de iClose puede utilizar

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

algo así como

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

De este modo, puedes obtener valores de varias barras con un movimiento de varita mágica.

La función devuelve true o false, pero no lo he comprobado en este ejemplo. Puedes adivinarlo tú mismo...

 
Alexey Viktorov:
Sí, así es como puse primero H1, pero luego decidí que serían comparaciones demasiado raras. Así que lo cambié a M5.

He terminado tu código ahí y lo he publicado arriba. He puesto tu versión en la mía y el resultado es el mismo. Hay un desajuste en casi todas las velas M5. ¿Cuáles son sus resultados?

 
Mikhail Nazarenko:

He terminado tu código ahí y lo he publicado arriba. He puesto tu versión en la mía y el resultado es el mismo. Hay un desajuste en casi todas las velas M5. ¿Cuáles son sus resultados?

Aquí tenemos que cambiar

if(NewBar(PERIOD_M5))

a

if(NewBar(PERIOD_H1))
 
Alexey Viktorov:

Aquí tienes que cambiar

a

No, mejor _Período. Porque esperaremos forzosamente la cotización cero de H1, mientras se actualiza correctamente el período actual. Los datos deben recibirse en los primeros segundos de la hora, no cuando se actualiza la hora.

Quiero añadir al ejemplo y comprobar
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:

Aquí tenemos que cambiar

a

El resultado es el mismo que con iClose(); iClose y CopyClose parecen tomar los datos del mismo lugar.

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

No, mejor _Período. Porque esperaremos forzosamente la cotización cero de H1, mientras se actualiza correctamente el período actual. Los datos deben recibirse en los primeros segundos de la hora, no cuando se actualiza la hora.

Quiero añadir al ejemplo y comprobar

Parece que no entiendes en absoluto cómo funciona la aparición de nuevas barras.

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;
 }/******************************************************************/ 

Y en consecuencia.

Mikhail Nazarenko:

El resultado es el mismo que cuando iClose(); iClose y CopyClose parecen tomar los datos del mismo lugar.

Cuando se reciben valores de cierre de barra y\Notros de OHLC cuando se recibe un nuevo valor de TIKA, no hay siempre ningún problema.
 
Alexey Viktorov:

Parece que no entiendes en absoluto cómo funciona la nueva función de la barra.

Y en consecuencia.

Cuando se obtienen los valores de cierre de barra y otros de OHLC cuando entra una nueva TIKA, los valores son siempre sin problemas.

Responde a la pregunta. ¿Por qué en una nueva vela la función iClose(1) devuelve información obsoleta y no actualizada o un error? Esto es un error.

 
Mikhail Nazarenko:

Responde a la pregunta. ¿Por qué en una vela nueva la función iClose(1) devuelve información obsoleta y no actualizada o un error? Esto es un error.

Si es un error, entonces todos, o casi todos, deberían tenerlo. Si es sólo usted, entonces es un problema en el código.

Tengo mi EA en M15 con la determinación de una nueva barra 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"
         );
 }/******************************************************************/

Y esto es lo que dice el comentario.

No hay ninguna discrepancia.

 
Bien, gracias a todos los desarrolladores por su atención, me voy a crear muletas como NewBar)). Tema cerrado.
Razón de la queja: