Ejecución de órdenes en paralelo en cTrader
Una de las características que hacen destacar a cTrader es la capacidad de usar tanto programación síncrona como asíncrona para ejecutar sus órdenes. Puede usar programación síncrona para implementar estrategias que necesitan esperar los resultados de la ejecución de la orden antes de continuar; alternativamente, la programación asíncrona se usa mejor cuando se crea una estrategia de alta velocidad que puede enviar múltiples órdenes simultáneamente.
En este video y su artículo correspondiente, explicaremos la diferencia entre la ejecución síncrona y asíncrona y le mostraremos cómo usar ambos enfoques para colocar nuevas órdenes.
Ejecución de órdenes síncrona vs asíncrona
Flujos básicos
La ejecución de órdenes síncrona se puede explicar usando un diagrama simple. Al colocar nuevas órdenes de forma síncrona, un cBot debe esperar a que se ejecute una orden antes de seguir cualquier otra instrucción. En otras palabras, cTrader envía una orden al servidor, espera la respuesta y solo entonces comienza a ejecutar la siguiente línea de código.
flowchart LR
A([Orden 1, 100 ms]) --> B([Orden 2, 70 ms]) --> C([Orden 3, 80 ms]) --> D([Instrucciones posteriores]) Al colocar las órdenes anteriores de forma síncrona, su cBot tendrá que gastar un total de 250 ms antes de proceder a las instrucciones que se especifican después de la Orden 3.
Por otro lado, la ejecución asíncrona permite a cTrader enviar múltiples órdenes en paralelo sin esperar una respuesta del servidor. Al usar programación asíncrona, una estrategia puede minimizar el tiempo total requerido para ejecutar múltiples órdenes.
flowchart LR
subgraph Orders
direction TB
A([Orden 1, 100 ms]) --- B([Orden 2, 70 ms]) --- C([Orden 3, 80 ms])
end
D([Instrucciones posteriores])
Orders --> D En el diagrama anterior, las tres órdenes se envían exactamente al mismo tiempo y el cBot no espera sus resultados de ejecución antes de proceder a las instrucciones subsiguientes.
Ejemplos de código
También podemos usar código para demostrar cómo funciona la ejecución síncrona.
1 2 3 4 5 6 7 8 9 | |
Si ejecutamos un cBot con este código, el registro mostrará que el recuento de posiciones solo aumenta después de que se ejecuta cada posición. El código está esperando a que se ejecute cada orden antes de enviar una solicitud para ejecutar la siguiente.
Para cambiar a la ejecución de órdenes asíncrona, podemos usar el método ExecuteMarketOrderAsync.
1 2 3 4 5 6 7 8 9 | |
También añadiremos un manejador de eventos para escuchar el evento Positions.Opened.
1 2 3 4 5 6 7 8 9 10 | |
En nuestro manejador de eventos imprimiremos un mensaje en el registro tan pronto como se abra una posición, así como el número de posiciones abiertas en ese momento.
Si ejecutamos un cBot con este código y echamos un vistazo al registro, veremos que todas las órdenes se han enviado sin recibir una confirmación sobre los resultados de las instrucciones anteriores. El contador de posiciones se ha mantenido en 0 todo el tiempo. Las confirmaciones llegaron y se imprimieron en el registro algunos milisegundos después de que todas las órdenes fueran enviadas al servidor.
Usar órdenes de devolución de llamada
Ahora podemos volver a nuestro código fuente y demostrar otra característica valiosa de la ejecución asíncrona, a saber, la opción de usar métodos de devolución de llamada que se llaman tan pronto como se termina la ejecución de la orden. Eliminaremos nuestro manejador del evento Positions.Opened e implementaremos un método de devolución de llamada que imprime una confirmación una vez que se ha ejecutado una orden.
1 2 3 4 5 6 7 8 9 10 11 | |
Luego pasaremos este método como argumento al método ExecuteMarketOrderAsync.
1 | |
A diferencia de nuestro enfoque anterior, el método de devolución de llamada se llamará independientemente de si una operación ha tenido éxito, lo que también significa que se le informa de las operaciones no exitosas y puede actuar en consecuencia.
Monitorear el estado de la ejecución asíncrona
cTrader también proporciona una herramienta fácil de usar para rastrear el estado de las operaciones asíncronas. El método ExecuteMarketOrderAsync devuelve un objeto TradeOperation que contiene información sobre si la orden aún se está ejecutando.
Podemos comenzar declarando un nuevo campo.
1 | |
Luego eliminaremos nuestro bucle for y asignaremos el resultado de la ejecución de la orden al nuevo campo.
1 | |
También añadiremos un temporizador a nuestro cBot. El temporizador comprobará el estado de una operación cada 100 milisegundos.
1 2 | |
Si una operación aún se está ejecutando, el temporizador lo imprimirá en el registro.
1 2 3 4 5 6 7 8 | |
Después de que se construya el cBot, podemos probar cómo funciona en una cuenta demo. En el registro, el temporizador debería imprimir actualizaciones regulares sobre el estado de la ejecución asíncrona.
Resumen
La ejecución asíncrona es una herramienta poderosa que puede hacer que la colocación automática de órdenes sea mucho más rápida en comparación con la programación síncrona. Sin embargo, la ejecución síncrona aún puede utilizarse en caso de que necesite conocer el resultado de una operación antes de proceder al siguiente paso. La ejecución asíncrona, por otro lado, es mejor utilizada cuando necesita enviar múltiples órdenes en paralelo sin ningún retraso.