Con el uso de OnTradeTransaction, el tiempo de optimización ha cambiado extrañamente. Un sistema en 15M, muy simple, historia anual, una carrera ocurre en 0,3 - 0,4 segundos.
Tras el inicio de la optimización, las primeras 200-300 carreras van a menos de un segundo, las siguientes se ralentizan hasta 15-20 segundos (¡50 veces!);
No hay sobrecalentamiento del procesador ni trolling, más de la mitad de la memoria está libre (de 16GB).
Antes de utilizar el manejador OnTradeTransaction no había nada parecido - incluso los Asesores Expertos más complejos en marcos temporales pequeños se optimizaban con aproximadamente la misma velocidad.
¿Afecta tanto a la velocidad HistoryDealSelect? ¿Cómo podemos eliminar los retrasos?
¿Quién sabe - cómo mostrar las barras a la derecha de la barra cero en el indicador y cuántas como máximo? (previsión de precios a realizar)
Añade PeriodSeconds() a la hora de apertura de la última barra y dibuja allí una vela con objetos gráficos. La cantidad máxima se mostrará a la derecha. Pero no he comprobado cómo se mostrará si hay una salida. Probablemente, debería tenerse en cuenta por sí mismo.
Alexey Viktorov: Añade PeriodSeconds() a la hora de apertura de la última barra y dibuja allí una vela con objetos gráficos. Como mucho será visible a la derecha. Pero no he comprobado cómo se mostrará si hay una salida. Probablemente hay que tener en cuenta.
Alexey Viktorov: Añade PeriodSeconds() a la hora de apertura de la última barra y dibuja la vela allí. Como mucho, lo verás a la derecha. Pero no he comprobado su aspecto. Probablemente, hay que tenerlo en cuenta.
En el gráfico dibuja una continuación, pero lamentablemente no en la ventana del indicador.
Tal vez me equivoque, por supuesto...
¿Qué opinas? ¿Puedo continuar la línea del indicador más allá de la barra cero hacia la derecha?
Renat Akhtyamov: ¿Quién sabe si la línea del indicador puede extenderse más allá de la barra cero hacia la derecha?
Puedes hacerlo. Es posible establecer un desplazamiento, pero probablemente no será posible calcular por valores no existentes, y el tiempo no se utiliza en la visualización del indicador. Por eso hablaba de la visualización de barras mediante elementos gráficos. La función ObjectCreate() contiene tanto el número de ventana (subventana) como la hora. No debería haber ningún problema a la hora de crear elementos gráficos.
Alexey Viktorov: Puedes hacerlo. Se puede desplazar, pero probablemente el cálculo no se hará con valores no existentes y la hora no se utilizará en la visualización del indicador. Por eso hablaba de la visualización de barras mediante elementos gráficos. La función ObjectCreate() contiene tanto el número de ventana (subventana) como la hora. Por lo tanto, no debería haber problemas a la hora de crear elementos gráficos.
En la ventana del gráfico, utilizando las marcas de tiempo, puede referirse a las futuras barras previstas. Ha funcionado.
Sin embargo, no puedo hacer lo mismo en la ventana del indicador. Es decir, no puedo escribir valores en el buffer del indicador con el índice -1, -2, etc.
La cuestión es la siguiente.
En principio, está claro. La solución es crear un indicador mediante objetos gráficos.
En la ventana del gráfico, utilizando las marcas de tiempo, puede referirse a las futuras barras previstas. Ha funcionado.
Sin embargo, no puedo hacer lo mismo en la ventana del indicador. Es decir, no puedo escribir valores en el buffer del indicador con el índice -1, -2, etc.
La cuestión es la siguiente.
En principio, está claro. La solución es crear el indicador mediante objetos gráficos.
Calcule el segundo buffer en sus valores normales, por ejemplo (si queremos calcular 10 barras para mostrar el "futuro"), entonces calcule este buffer en los valores Buff[9] -- Buff[8] -- Buff[n] -- Buff[0], y luego muestre este buffer con un desplazamiento no nulo. Ajuste el desplazamiento del búfer al número deseado de barras en el futuro - 10 en este caso
Con el uso de OnTradeTransaction, el tiempo de optimización ha cambiado extrañamente. Un sistema en 15M, muy simple, historia anual, una carrera ocurre en 0,3 - 0,4 segundos.
Tras el inicio de la optimización, las primeras 200-300 carreras van a menos de un segundo, las siguientes se ralentizan hasta 15-20 segundos (¡50 veces!);
No hay sobrecalentamiento del procesador ni trolling, más de la mitad de la memoria está libre (de 16GB).
Antes de utilizar el manejador OnTradeTransaction no había nada parecido - incluso los Asesores Expertos más complejos en marcos temporales pequeños se optimizaban con aproximadamente la misma velocidad.
¿Afecta tanto a la velocidad HistoryDealSelect? ¿Cómo podemos eliminar los retrasos?
const MqlTradeRequest &request,
const MqlTradeResult &result)
{
if( trans.type != TRADE_TRANSACTION_DEAL_ADD) return;
ENUM_TRADE_TRANSACTION_TYPE type=trans.type;
long deal_type =0;
double deal_volume =0;
long deal_magic =0;
if(HistoryDealSelect(trans.deal))
{
deal_type =HistoryDealGetInteger(trans.deal,DEAL_TYPE);
deal_volume =HistoryDealGetDouble(trans.deal,DEAL_VOLUME);
deal_magic =HistoryDealGetInteger(trans.deal,DEAL_MAGIC);
}
else
return;
if (deal_type == DEAL_TYPE_BUY && deal_magic == MagicNumber) current_position += deal_volume;
if (deal_type == DEAL_TYPE_SELL && deal_magic == MagicNumber) current_position -= deal_volume;
}
¡Hola!
¿Quién sabe - cómo mostrar las barras a la derecha de la barra cero en el indicador y cuántas como máximo? (previsión de precios a realizar)
¿Es HistoryDealSelect lo que afecta negativamente a la velocidad? ¿Cómo se puede eliminar la ralentización?
Los desarrolladores recomiendan minimizar las llamadas a las funciones del Historial (costosas) - a través del almacenamiento en caché del historial.
He publicado una solución que funciona en kodobase (MT4Orders), pero probablemente no le convenga.
No he visto ningún lag después de usar la caché.
Sin embargo, su OnTradeTransaction no debería ralentizarse, aunque no esté escrito de forma óptima.
¡Hola!
¿Quién sabe - cómo mostrar las barras a la derecha de la barra cero en el indicador y cuántas como máximo? (previsión de precios a realizar)
Añade PeriodSeconds() a la hora de apertura de la última barra y dibuja allí una vela con objetos gráficos. Como mucho será visible a la derecha. Pero no he comprobado cómo se mostrará si hay una salida. Probablemente hay que tener en cuenta.
Añade PeriodSeconds() a la hora de apertura de la última barra y dibuja la vela allí. Como mucho, lo verás a la derecha. Pero no he comprobado su aspecto. Probablemente, hay que tenerlo en cuenta.
En el gráfico dibuja una continuación, pero lamentablemente no en la ventana del indicador.
Tal vez me equivoque, por supuesto...
¿Qué opinas? ¿Puedo continuar la línea del indicador más allá de la barra cero hacia la derecha?
¿Quién sabe si la línea del indicador puede extenderse más allá de la barra cero hacia la derecha?
Puedes hacerlo. Se puede desplazar, pero probablemente el cálculo no se hará con valores no existentes y la hora no se utilizará en la visualización del indicador. Por eso hablaba de la visualización de barras mediante elementos gráficos. La función ObjectCreate() contiene tanto el número de ventana (subventana) como la hora. Por lo tanto, no debería haber problemas a la hora de crear elementos gráficos.
En la ventana del gráfico, utilizando las marcas de tiempo, puede referirse a las futuras barras previstas. Ha funcionado.
Sin embargo, no puedo hacer lo mismo en la ventana del indicador. Es decir, no puedo escribir valores en el buffer del indicador con el índice -1, -2, etc.
La cuestión es la siguiente.
En principio, está claro. La solución es crear un indicador mediante objetos gráficos.
En la ventana del gráfico, utilizando las marcas de tiempo, puede referirse a las futuras barras previstas. Ha funcionado.
Sin embargo, no puedo hacer lo mismo en la ventana del indicador. Es decir, no puedo escribir valores en el buffer del indicador con el índice -1, -2, etc.
La cuestión es la siguiente.
En principio, está claro. La solución es crear el indicador mediante objetos gráficos.