OnTick no acontece en cada tick

 

Hola,

Tengo un EA hecho por mi, funciona y opera bien pero al cabo de un tiempo deja de operar.

Puse un chivato en el LOG de expertos cada vez que pasa por el OnTick y me di cuenta que el OnTick no da todos los ticks al paso del tiempo. El gráfico es de M1 y suele dar los ticks cada segundo más o menos, y cuando ocurre el problema el OnTick acontece cada 40 o 50 minutos.

Revisé el procesador y la memoria del sistema y está en unos niveles bajos, así que no está afectando y además en el LOG del MT no veo ningún error de falta de memoria.

Para hacer un test, dejé el MT en un VPS con un solo gráfico con el EA en el gráfico y revisando los LOG hoy veo que a partir de las 00:00:00 fue cuando empezó a dar el OnTick cada 40 o 50 minutos en lugar de cada segundo. Puede ser casualidad o no, porque no puedo constatar que todas las veces que me encontré con la situación fuese a la misma hora, ya que en otro MT tengo varios gráficos y es más complicado de verificar.

Estuve revisando el código que tengo dentro de la función OnTick y lo único que pensé que podría estar demorando el OnTick podrían ser los for o while, la verdad estoy usando el for para revisar las operaciones abiertas, pero es finito ya que es de i = 0 al PositionsTotal() y también otro for para mirar los objetos de soportes y resistencias que también es finito y no creo que aunque haya muchos objetos tarde 40 o 50 minutos en terminar.

Espero que alguien pueda responderme y ayudarme a solucionar el problema.

Saludos,

Albert.

Documentación para MQL5: Bases del lenguaje / Funciones / Funciones de procesamiento de eventos
Documentación para MQL5: Bases del lenguaje / Funciones / Funciones de procesamiento de eventos
  • www.mql5.com
Funciones de procesamiento de eventos - Funciones - Bases del lenguaje - Manual de referencia de MQL5 - manual de usuario para el lenguaje del trading algorítmico/automático para MetaTrader 5
 
alerin:

Hola Albert, bienvenido.

Primero he de decirle que no duplique hilos en el foro.

Sobre su duda; Si lo que quiere es que sea en cada tick lo mejor es ponerlo sin ningún condicionante e inmediatamente después del OnTick().

void OnTick()
  {
  Print("Hello, World!");
  }

Si lo que desea imprimir es algo que obligatoriamente debe ser después de cierta función por la información que esta arroja y es lo que desea imprimir revise los condicionantes o ponga el Print() fuera de ellos inmediatamente después de dicha función.

void OnTick()
  {
   double Volume = 0;
   for(int i = PositionsTotal() - 1; i >= 0; i--)
     {
      if(m_position.SelectByIndex(i))
        {
         if(m_position.Symbol() == _Symbol && m_position.Magic() == InpMagicNumber)
           {
            Volume = NormalizeDouble(Volume + m_position.Volume(), 2);
           }
        }
     }
   Print("" + (string)Volume);
  }
 
Miguel Angel Vico Alba #:

Hola Albert, bienvenido.

Primero he de decirle que no duplique hilos en el foro.

Sobre su duda; Si lo que quiere es que sea en cada tick lo mejor es ponerlo sin ningún condicionante e inmediatamente después del OnTick().

Si lo que desea imprimir es algo que obligatoriamente debe ser después de cierta función por la información que esta arroja y es lo que desea imprimir revise los condicionantes o ponga el Print() fuera de ellos inmediatamente después de dicha función.

Hola Miguel,


Me ha costado mucho encontrar mi hilo ya que no aparece en mi cuenta. Pido perdón por la duplicación, quizá encuentres un hilo nuevo de hoy, elimínalo ya que lo hice antes de encontrar de nuevo éste.

Primero, gracias por la respuesta dada.

Según tu respuesta me indicas que debo usar el OnTick para que acontezca en cada Tick, pero es que ya es el evento que estoy usando, el OnTick, allí hago las verificiones de los indicadores que he cargado en el init y si cumplen y no hay operaciones abiertas, abro operaciones nuevas. Pero, como te comentaba, al cabo del tiempo o a partir de las 00:00 según la prueba que hice se demora el acontecimiento del evento OnTick... No sé si será algo de mi código que no hago bien, pero he revisado varias veces y no veo qué podría estar dando problemas.

La segunda respuesta de usar el Print() no entiendo la razón porque podría estar causando una demora en el evento OnTick() según donde esté ubicada la función Print().

¿Qué podría estar causando una demora en el evento OnTick()?  ¿Quieres mi código para que puedas revisar si ves algo que podría estar demorando el OnTick()?


Saludos y espero pronta respuesta,


Albert.

 

Hola de nuevo,


Alguna respuesta?


Gracias,

Albert.

 
alerin #Alguna respuesta?
  • Por lo general, las personas que no pueden codificar no reciben ayuda gratuita en este foro, aunque podría suceder si tiene suerte. Sea paciente.
  • Si muestra sus intentos y describe su problema con claridad, probablemente recibirá una respuesta de la comunidad.
  • Si no quiere aprender a codificar, eso no es un problema. Puede mirar la sección CodeBase donde encontrara código libre y gratuito, o en el Market para productos de pago (también a veces gratis). Por último, también tiene la opción de contratar a un programador en la sección Freelance.
  • Tenga en cuenta que un problema no reproducible, no es un problema. Para poder recibir ayuda siempre debe ser reproducible y poder argumentarlo con pruebas (logs, capturas de pantalla, etc).
  • Muchos de los problemas estan ya resueltos en el foro (algunos desde hace años). Use el buscador para encontrar hilos relacionados sobre el tema en cuestión que este buscando.

Es cuanto tengo que decir. Por favor, no me envie más mensajes privados. Le di una primera contestación por cortesía, pero no tengo tiempo para poder ayudarle revisando su código, etc.

Un saludo.

 

Hola Miguel,

Nuevamente, gracias por tu respuesta.

Contestandote a los primeros puntos:

  • Ese no es el caso, en mi caso puedo codificar, a eso me dedico.
  • Gracias por la información. Por ahora, investigando más a fondo, llegué a pensar que uno de los indicadores que no es hecho por mi, y que está dando errores de out of range en algunas ocasiones podría ser la el causante. Estoy intentando reemplazarlo por otro indicador y cuando tenga más información la voy a describir con claridad, claro que si.
  • Cada día estoy aprendiendo cosas nuevas, ya sabes que en el mundo de la programación (que es a lo que me dedico) nunca se sabe todo y siempre se aprende. Pero gracias por informar.
  • Claro, siempre hay un proqué del problema, es encontrarlo y reproducirlo y argumentarlo con pruebas y demás. No te preocupes, voy a hacer lo que indico en el punto 2 y al reproducir el problema, subo capturas y demás detalle.
  • Gracias, aúnque revisé bastante, volveré a revisar por si encuentro algo más.

Siento haberte enviado un par de mensajes en privado avisándote que si podías revisar el hilo, te pido disculpas.

Un saludo,

Albert.

Razón de la queja: