Errores, fallos, preguntas - página 2222

 
Alexander:

Reproducción estable ? ¿Qué construcción?

Sí, el problema es reproducible. Versión 1870.
 

Pregunta.

Supongamos que trabajo con varios símbolos en un Asesor Experto o indicador, o más bien con todos los símbolos que se muestran en la ventana de Observación del Mercado.

La tarea consiste en captar el momento de un nuevo tick en cualquiera de los símbolos.

Hasta ahora sólo veo un par de opciones:
  1. A través de un temporizador con sondeo de todos los símbolos. (por supuesto, sólo puede sondear el nuevo valor deTimeCurrent(), pero en este caso el error será de 1 segundo, porque esta función devuelve un valor en segundos)
  2. en cada símbolo en OnTick (o OnCalculate) para generar un evento personalizado a través de EventChartCustom

La desventaja de la primera opción es la falta de optimización de los recursos y la relevancia de los datos. OnTimer martilleará principalmente en reposo, y cuando capte una nueva cita, el error de tiempo de llegada será igual a la periodicidad del temporizador.

La desventaja de la segunda variante es la pesadez, especialmente si hay decenas de símbolos.

¿He entendido bien que no hay otras opciones (más sencillas y elegantes)? ¿O (espero) estar equivocado?

 
Nikolai Semko:

Pregunta.

Supongamos que trabajo con varios símbolos en un Asesor Experto o indicador, o más bien con todos los símbolos que se muestran en la ventana de Observación del Mercado.

La tarea consiste en captar el momento de un nuevo tick en cualquiera de los símbolos.

De momento sólo veo un par de opciones:
  1. A través de un temporizador con sondeo de todos los símbolos. (por supuesto, sólo puede sondear el nuevo valor deTimeCurrent(), pero en este caso el error será de 1 segundo, porque esta función devuelve un valor en segundos)
  2. en cada símbolo en OnTick (o OnCalculate) para generar un evento personalizado a través de EventChartCustom

La desventaja de la primera opción es la falta de optimización de los recursos y la relevancia de los datos. OnTimer martilleará principalmente en reposo, y cuando capte una nueva cita, el error de tiempo de llegada será igual a la periodicidad del temporizador.

La desventaja de la segunda variante es la incomodidad, especialmente si hay decenas de símbolos.

¿He entendido bien que no hay otras opciones (más sencillas y elegantes)? ¿O (espero) estar equivocado?

¿Tal vez esto ayude? https://www.metatrader5.com/ru/terminal/help/trading_advanced/custom_instruments

Instrumentos sintéticos con cotizaciones en tiempo real

La plataforma de negociación permite crear instrumentos financieros sintéticos, es decir, instrumentos basados en uno o varios existentes. Sólo tiene que establecer una fórmula para calcular las cotizaciones y la plataforma generará los ticks del instrumento sintético en tiempo real y también creará su historial de minutos.
Cómo funciona

Creas un instrumento sintético y estableces la fórmula para él.
La plataforma calculará sus ticks con una frecuencia de 10 veces por segundo (y sólo si el precio de al menos un instrumento de la fórmula cambia).
 
SEM:

¿Tal vez esto ayude? https://www.metatrader5.com/ru/terminal/help/trading_advanced/custom_instruments

Instrumentos sintéticos con cotizaciones en tiempo real

La plataforma de negociación permite crear instrumentos financieros sintéticos, es decir, instrumentos basados en uno o varios existentes. Todo lo que tiene que hacer es especificar la fórmula para calcular las cotizaciones y la plataforma generará los ticks del instrumento sintético en tiempo real y creará su historial de minutos.
Cómo funciona

Creas un instrumento sintético y estableces la fórmula para él.
La plataforma calculará sus ticks con una frecuencia de 10 veces por segundo (y sólo si el precio de al menos un instrumento de la fórmula ha cambiado).

Sí, por supuesto, esa variante también tiene derecho a la vida. Gracias.
Pero, de hecho, es lo mismo que mi variante #1 con periodicidad de temporizador de 100 ms y con las mismas desventajas.

Sin embargo, la opción 2 me parece más racional.

Por cierto, he recordado que la opción 2 ya se ha discutido aquí.


 
Nikolai Semko:

Sí, por supuesto, esta variante también tiene derecho a la vida. Gracias.
Sin embargo, en esencia, es lo mismo que la variante #1 anterior con un período de temporización de 100 ms.

No sería más fácil hacer un EA vinculado al símbolo sobre el que se trabaja. Luego abra todos los símbolos y aplique la plantilla con este EA a cada gráfico.

for(int i=PositionsTotal()-1;i>=0;i--)
     {
      if(PositionGetSymbol(i)==Symbol())
        {
         //Код
        };

     }
 
SEM:
No sería más fácil hacer un EA vinculado al símbolo sobre el que se trabaja. Luego abra todos los símbolos, y para cada gráfico aplique una plantilla con este EA.

Está claro que podemos hacerlo. El asunto es que no sé algo y es posible rastrear el momento exacto de llegada de la cotización para otro símbolo a través del código de un solo EA multidivisa.
Pero parece que la variante 2 mediante interrupciones personalizadas es la única solución racional.

 
Nikolai Semko:

Sí, está claro que se puede hacer así. La cuestión es que no sé algo, y es posible captar el momento exacto de llegada de la cotización para otro símbolo a través del código de un solo Asesor Experto multidivisa.
Pero parece que la variante 2 mediante interrupciones personalizadas es la única solución racional.

La puesta en práctica.

Особенности языка mql5, тонкости и приёмы работы
Особенности языка mql5, тонкости и приёмы работы
  • 2018.01.28
  • www.mql5.com
В данной теме будут обсуждаться недокументированные приёмы работы с языком mql5, примеры решения тех, или иных задач...
 
Nikolai Semko:
  1. a través de un temporizador con sondeo de todos los caracteres. (Por supuesto, podría simplemente sondear el nuevo valor deTimeCurrent(), pero en este caso el error sería de 1 segundo, porque esta función devuelve un valor en segundos).

¿Estoy en lo cierto al suponer que no hay otras opciones (más sencillas y elegantes)? ¿O (espero) estar equivocado?

Temporizador de milisegundos + SymbolInfoTick() obtendrá el tiempo en milisegundos.

 
Sí, ya di este enlace a su aplicación en el post 22214. Lo diré de nuevo: creo que esta variante es la más razonable hasta ahora. Y parece que no hay una implementación mejor en términos de carga mínima de la CPU y relevancia del momento resultante de un nuevo tick.
 
Nikolai Semko:
  1. через таймер c опросом всех символов. (можно, конечно, только опрашивать новое значение функции TimeCurrent(), но в этом случае погрешность будет равна 1 секунде, т.к. эта функция возвращает значение в секундах)

Я правильно понимаю, что других вариантов (более простых и изящных) не существует? Или (надеюсь) я не прав?

Temporizador de milisegundos + SymbolInfoTick() obtiene el tiempo en milisegundos.

Alexey Kozitsyn:

Temporizador de milisegundos + SymbolInfoTick() obtiene el tiempo en milisegundos.

Es la variante 1. Me refería a una construcción de este tipo (temporizador de milisegundos + bucle SymbolInfoTick()). MencionéTimeCurrent() porque devuelve"la hora de llegada de la última cotización para cualquier símbolo disponible en la ventana de Market Watch", no sólo para el símbolo actual, pero desafortunadamente sólo devuelve segundos, lo cual es muy grosero para los ticks.
Objetivamente, la variante con interrupciones de usuario es más razonable, porque no hay necesidad de organizar un bucle con la costosa función SymbolInfoTick constantemente, incluso cuando las cotizaciones están durmiendo, cargando así el procesador con tiempos muertos. Además, el error de cálculo de un nuevo tic puede ser igual a la periodicidad del temporizador, y todos los tics se perderán entre la ejecución de OnTimer, si dichos tics fueran más de 1.
SZZ Estamos hablando de mql5. En mql4 las interrupciones del usuario no funcionan correctamente. Por lo tanto, el mql4 sólo puede utilizar el temporizador.