Discusión sobre el artículo "Desarrollamos un Asesor Experto multidivisas (Parte 2): Transición a posiciones virtuales de estrategias comerciales" - página 2

 
Yuriy Bykov #:

Todavía no he considerado esta opción, pero tendré en cuenta que también es posible. Sin embargo, si consigo encontrar un buen conjunto de Asesores Expertos listos en el mercado, ¿cómo puedo utilizarlos juntos? ¿Simplemente ejecuto todo el conjunto con los parámetros de MM seleccionados?

Sí.

 

Yuriy Bykov #:

Estoy acostumbrado a las funciones de trading de MT5.

Se me dan bien, pero las abandoné por este motivo.

Foro sobre trading, sistemas automatizados de trading y prueba de estrategias de trading

Discusión del artículo "Desarrollo de un Asesor Experto multidivisa (Parte 2): Pasando a estrategias de trading con posiciones virtuales"

fxsaber, 2024.02.07 01:03 pm

Enfoque cuidadosamente la elección de la API de comercio para el comercio virtual. Elija entre las disponibles. Es lógico dar preferencia a la API, en la que es tan fácil como sea posible para programar el TS. Realmente no entiendo la práctica común de todas las plataformas de comercio de inventar su propia bicicleta - API de comercio. Dotarla de OOP-entidades "out of the box", etc. En este sentido, MQ tomó un buen camino - todas las API sin OOP.

 
fxsaber #:

El concepto en sí es bueno para el comercio real. Pero allí para el sincronizador tendrá que mantener la historia de comercio virtual. Muchas cosas. Un camino serio, por decirlo suavemente.

Aquí no entiendo por qué para el comercio real que tendría que mantener un historial de comercio virtual. Quizás tengamos una interpretación un poco diferente de "virtualidad". Yo simplemente no he encontrado la necesidad de mantener un historial, ya que siempre tengo las posiciones virtuales sincronizadas con las reales, y no hay posibilidad de desactivar la sincronización durante un tiempo (¿todavía no?).

 
¿Dónde puedo conseguir el archivo EA para probarlo?
 
fxsaber #:

Desde el punto de vista arquitectónico, la virtualización se desacoplaría de la CT.

Es decir, ¿el ST utiliza funciones de negociación ordinarias como OrderSend(), y nosotros utilizamos nuestra biblioteca para anularlas y utilizar posiciones virtuales?

 
fxsaber #:

Elija cuidadosamente una API de negociación para el comercio virtual. Elija entre las disponibles. Es lógico dar preferencia a la API en la que sea lo más fácil posible programar el ST.

He visto que de hecho desde finales de 2021 ya he utilizado mi API para el comercio virtual de mi TS. Por supuesto, me he acostumbrado a implementar todo lo que necesito en ella, utilizando sólo dos métodos comunes para posiciones y órdenes pendientes - Open() y Close().

Una vez más lamento no haber encontrado su biblioteca virtual a tiempo )

 
summertop #:
¿Dónde puedo conseguir el archivo EA para probarlo?

Hay una lista de archivos adjuntos al final del artículo

 
Yuriy Bykov #:

Aquí no entendí por qué habría que mantener un historial de operaciones virtuales para las operaciones reales. Tal vez tengamos una interpretación ligeramente diferente del concepto de "virtualidad". Yo simplemente no he encontrado la necesidad de mantener un historial, ya que siempre tengo las posiciones virtuales sincronizadas con las reales, y no hay posibilidad de desactivar la sincronización durante un tiempo (¿todavía no?).

Ejemplo.

  1. Sincronizado virtual y real con una posición y su takeout.
  2. El tick ha alcanzado el takeout: en la posición virtual se ha disparado, en la posición real - el re-jack del takeout (limitador).

Es imposible cerrar una posición real con una orden de mercado porque no hay posiciones en el mercado virtual (por ejemplo, rollover, deslizamiento enorme en una orden de mercado).

El precio no ha vuelto a tocar el takei, sino que ha ido en dirección contraria. Parece que es posible mantener un takei en el historial de una posición cerrada en una cuenta virtual. Pero puede que el precio nunca lo alcance. Entonces, ¿en qué niveles hay que sincronizar?

Y entonces aparece un terminal virtual que siempre opera - tiene un núcleo de señales. Y sólo se necesita para cerrar posiciones colgadas en el mercado real.

En general, es un gran tema. Tengo tres núcleos virtuales para la sincronización con el real:

  1. El kernel que opera con restricciones de tiempo - no se sincroniza con el real.
  2. BestInterval es empujado a la primera virtualización. - Se sincroniza con el real para abrir posiciones.
  3. El núcleo que negocia sin restricciones de tiempo (siempre en negociación) - se sincroniza con el real para cerrar posiciones.

 
Yuriy Bykov #:

Es decir, ¿el ST utiliza funciones de negociación normales como OrderSend(), y nosotros utilizamos nuestra biblioteca para anularlas y utilizar posiciones virtuales?

Sí, este principio no requiere reescribir nada en la TS, porque la TS no sabe dónde negocia. Su código no se modifica para que pueda operar en diferentes posiciones virtuales o reales.

 
fxsaber #:

Las entradas son un buen ejemplo. Cada parámetro de entrada debe escribirse cinco o seis veces.

Hice refactorización por entradas. Algunas piezas de código resultantes para el ejemplo.

//+------------------------------------------------------------------+
//| Función de inicialización experta|
//+------------------------------------------------------------------+
int OnInit() {
   expert = new CAdvisor(new CVolumeReceiver(magic_));

   // Añadir una instancia de la estrategia
   expert.Add(new CSimpleVolumesStrategy( symbol_, inStrategyInput + inSimpleVolumesStrategyInput));

   return(INIT_SUCCEEDED);
}
   InputBase.fixedLot = NormalizeDouble(0.01 / 0.16 * depoPart_, 2);
   const double Array0[] = {13, 0.3, 1.0, 0, 10500, 465, 1000, 3};
   strategies[0] = new CSimpleVolumesStrategy("EURGBP", InputBase + Input[Array0]);
//+------------------------------------------------------------------+
//| Constructor|
//+------------------------------------------------------------------+
CSimpleVolumesStrategy::CSimpleVolumesStrategy( string p_symbol, const string sInputs ) : CStrategy(p_symbol, sInputs)
{
   this.Input = sInputs;

   ArrayResize(m_orders, this.Input.maxCountOfOrders);

   // Cargar el indicador para obtener volúmenes de ticks
   iVolumesHandle = iVolumes(m_symbol, this.InputStrategy.timeframe, VOLUME_TICK);

// Establecer el tamaño del array-receptor de volúmenes tick y el direccionamiento requerido
   ArrayResize(volumes, this.Input.signalPeriod);
   ArraySetAsSeries(volumes, true);
}
Archivos adjuntos: