Qué actualiza RefreshRates() - página 4

 
Mikhail Nazarenko:
Muy bien, gracias a todos los desarrolladores por la atención, voy a crear muletas como NewBar)) Tema cerrado.

No es necesario crearlos. Te he dado una función que funciona perfectamente. Úsalo.

 

Aquí llega una nueva hora...


Los valores son uno y el mismo...

 
Mikhail Nazarenko:

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

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);

//...

Quiero añadir al ejemplo y comprobar


No entiendo por qué se espera ver el mismo precio de cierre en barras completamente diferentes?

Cuando hay una nueva barra en M5, en M1 también hay una nueva barra, pero en H1 sólo en un caso de los 12 habrá una nueva barra y en los otros 11 no habrá barra.

 
PapaYozh:

No entiendo por qué. esperas ver el mismo precio de cierre en barras completamente diferentes?


También me di cuenta de eso, pensé que me había equivocado.

 

Parece que no explico muy bien el problema, lo siento. Escribí y probé las muletas prometidas. Lo he escrito aquí porque debería estar implementado en el código de MQL4. Si está interesado, por favor, tómelo. El tema está cerrado.

//Функция отслеживания появления обновленных котировок по таймфрейму, где max_tf таймфрейм +1 до которого включительно будет требоваться обновление
bool isRefresh(int max_tf = 0,int min_sleep = 1000){
   
   //Массив с таймфреймами
   int tf[9] = {1,5,15,30,60,240,1440,10080,43200};
   
   //Если максимальное 0 то текущее значение
   max_tf = (max_tf <= 0) ? _Period : max_tf;
   
   //Текущее время
   datetime period,tc = TimeCurrent();
   
   for(int i = 0; i < 9; i++){
         
      period = tf[i]*60;
      
      if(iTime(_Symbol,tf[i],1) != (int(tc/period)-1)*period){
         Sleep(min_sleep);
         return false;   
      }
      if(max_tf < tf[i])//Если таймфрейм больше максимального и тоже обновлен то выходим
         break;
   }
   Sleep(min_sleep);
   RefreshRates();
   
   return true;
}
 
Mikhail Nazarenko:

Parece que no explico muy bien el problema, lo siento. Escribí y probé las muletas prometidas. Lo he escrito aquí porque debería estar implementado en el código de MQL4. Si está interesado, por favor, tómelo. El tema está cerrado.

1. Tal vez, sí.

2. ¿Por qué dormir un segundo antes de regresar de una función si no tiene ningún efecto en el resultado devuelto?

 

Para que los candeleros de otros períodos/símbolos se generen en el tiempo, es necesario "tirar" constantemente de ellos, de lo contrario la MT los actualiza "como tiene que hacerlo".
Es una obviedad, se ha discutido muchas veces en el foro)

ps. Si su código se ejecuta con un temporizador y accede a las cotizaciones de otros plazos sólo una vez por hora (o una vez al día), entonces necesita crear una función separada para la actualización. O esperar un par de segundos después de la siguiente solicitud.

 
PapaYozh:

1. Aparentemente, sí.

2. ¿Por qué dormir un segundo antes de regresar de una función, si el resultado devuelto no se ve afectado de ninguna manera?

Todo esto es por experiencia. Si no me crees, rehazlo y no te duermas). Todo esto es voluntario.

 

Es ***ahí en su forma más pura.

¿Por qué dormir en una función cuando puedes volver de ella y hacer algo útil?

 
PapaYozh:

Es ***ahí en su forma más pura.

¿Por qué dormir en una función cuando puedes volver de ella y hacer algo útil?

Es ***t puro y duro. ¿Dime qué es lo que no has entendido en mi respuesta anterior? Una vez más. No duermas y haz algo útil)).

Razón de la queja: