Preguntas de los principiantes MQL5 MT5 MetaTrader 5 - página 714

 
dimnik:

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?

void OnTradeTransaction(const MqlTradeTransaction &trans,
                        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;
      
  }


Muéstrame todo el código.
 

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

 
dimnik:

¿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.

 
Renat Akhtyamov:

¡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. 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.
Gracias, lo tengo.
 
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?

 
¿Quién sabe si es posible 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.

 
Renat Akhtyamov:

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