Cómo trabajar correctamente en MT5 con OrderSend - página 5

 
Andrey Khatimlianskii:

He visto la foto. Todo está claro para la bolsa (con una orden limitada).

En el caso de las órdenes de mercado y de las divisas, no está claro. Todo está claro.

Lo mismo ocurre con una orden de mercado (en la Bolsa)

Añadido por

Si enviamos una orden de mercado, cuando recibimos el billete, vamos al historial con él y

vamos a la historia y vemos lo que pasó con ella. También puede consultar OnTradeTransaction

TRADE_TRANSACTION_HISTORY_ADD
 
Andrey Khatimlianskii:

¿Qué pasa con "si OrderSend devolvió el billete, se ejecuta"?

¿Debemos correr a la historia después de todo, o esperar a los acontecimientos? ¡¡¡Pues de eso va este hilo!!!

Correcto. ¿Qué no dije en la "taquilla"?

Incluso he publicado un EA (para la Bolsa) como ejemplo

 
Andrey Khatimlianskii:

Sí, en definitiva, no es muy on-topic ) Pero gracias por la aportación.

Se trata de que el OrderSend "sincrónico" termine antes de que el EA vea su impacto en la cuenta (no hay operaciones en el historial ni cambios en la posición).

Y para que funcione correctamente, tenemos que recurrir a muletas en forma de espera de un evento (¡una función muy útil! Pero no en este caso) o de búsqueda en el historial (también con espera).

De hecho, hay un problema para FOREX (corrí el mismo Asesor Experto en FOREX)

2016.10.14 02:18:20.229 Trades  '3941932': buy limit 1.00 GBPUSD at 1.22374
2016.10.14 02:18:20.276 Trades  '3941932': accepted buy limit 1.00 GBPUSD at 1.22374
2016.10.14 02:18:20.292 Trades  '3941932': order #102956267 buy limit 1.00 / 1.00 GBPUSD at market done in 62.769 ms
2016.10.14 02:18:20.292 Trades  '3941932': failed cancel order #102956267 buy limit 1.00 GBPUSD at 1.22374 [Invalid request]
2016.10.14 02:18:20.292 Trades  '3941932': cancel order #102956267 buy limit 1.00 GBPUSD at 1.22374
2016.10.14 02:18:20.354 Trades  '3941932': accepted cancel order #102956267 buy limit 1.00 GBPUSD at 1.22374
2016.10.14 02:18:20.354 Trades  '3941932': cancel #102956267 buy limit 1.00 GBPUSD at market done in 66.823 ms

2016.10.14 02:18:20.229 TestOrders (GBPUSD,H1)  OnChartEvent Send Order Sync mode
2016.10.14 02:18:20.292 TestOrders (GBPUSD,H1)  SendOrderSyncMode Order sent in sync mode
2016.10.14 02:18:20.292 TestOrders (GBPUSD,H1)  RemoveOrderSyncMode Order not sent (remove) in sync mode.
2016.10.14 02:18:20.292 TestOrders (GBPUSD,H1)  OnTradeTransaction Transaction type: TRADE_TRANSACTION_ORDER_ADD
2016.10.14 02:18:20.292 TestOrders (GBPUSD,H1)  OnTradeTransaction Transaction type: TRADE_TRANSACTION_REQUEST
2016.10.14 02:18:20.292 TestOrders (GBPUSD,H1)  OnTradeTransaction Transaction type: TRADE_TRANSACTION_ORDER_UPDATE
2016.10.14 02:18:20.292 TestOrders (GBPUSD,H1)  OnTradeTransaction Order update state = ORDER_STATE_PLACED
2016.10.14 02:18:20.292 TestOrders (GBPUSD,H1)  OnTradeTransaction Order plased done. Ticket = 102956267
2016.10.14 02:18:20.292 TestOrders (GBPUSD,H1)  RemoveOrderAsyncMode Order sent (remove) in async mode
2016.10.14 02:18:20.354 TestOrders (GBPUSD,H1)  OnTradeTransaction Transaction type: TRADE_TRANSACTION_ORDER_UPDATE
2016.10.14 02:18:20.354 TestOrders (GBPUSD,H1)  OnTradeTransaction Order update state = ORDER_STATE_REQUEST_CANCEL
2016.10.14 02:18:20.354 TestOrders (GBPUSD,H1)  OnTradeTransaction Transaction type: TRADE_TRANSACTION_ORDER_DELETE
2016.10.14 02:18:20.354 TestOrders (GBPUSD,H1)  OnTradeTransaction Transaction type: TRADE_TRANSACTION_HISTORY_ADD
2016.10.14 02:18:20.354 TestOrders (GBPUSD,H1)  OnTradeTransaction Order remove done. Ticket = 102956267
2016.10.14 02:18:20.354 TestOrders (GBPUSD,H1)  OnTradeTransaction Transaction type: TRADE_TRANSACTION_REQUEST
2016.10.14 02:18:20.354 TestOrders (GBPUSD,H1)  OnTradeTransaction Order get ticket done. Ticket = 102956267
 

Pero en modo asíncrono (FOREX) funciona bien

2016.10.14 02:31:26.145 Trades  '3941932': sell limit 1.00 GBPUSD at 1.22604
2016.10.14 02:31:26.206 Trades  '3941932': accepted sell limit 1.00 GBPUSD at 1.22604
2016.10.14 02:31:26.208 Trades  '3941932': order #102958649 sell limit 1.00 / 1.00 GBPUSD at market done in 63.027 ms
2016.10.14 02:31:26.208 Trades  '3941932': cancel order #102958649 sell limit 1.00 GBPUSD at 1.22604
2016.10.14 02:31:26.271 Trades  '3941932': accepted cancel order #102958649 sell limit 1.00 GBPUSD at 1.22604
2016.10.14 02:31:26.273 Trades  '3941932': cancel #102958649 sell limit 1.00 GBPUSD at market done in 64.700 ms

2016.10.14 02:31:26.145 TestOrders (GBPUSD,H1)  OnChartEvent Send Order Acync mode
2016.10.14 02:31:26.145 TestOrders (GBPUSD,H1)  SendOrderAsyncMode Order sent in async mode
2016.10.14 02:31:26.207 TestOrders (GBPUSD,H1)  OnTradeTransaction Transaction type: TRADE_TRANSACTION_ORDER_ADD
2016.10.14 02:31:26.208 TestOrders (GBPUSD,H1)  OnTradeTransaction Transaction type: TRADE_TRANSACTION_REQUEST
2016.10.14 02:31:26.208 TestOrders (GBPUSD,H1)  OnTradeTransaction Order get ticket done. Ticket = 102958649
2016.10.14 02:31:26.208 TestOrders (GBPUSD,H1)  OnTradeTransaction Transaction type: TRADE_TRANSACTION_ORDER_UPDATE
2016.10.14 02:31:26.208 TestOrders (GBPUSD,H1)  OnTradeTransaction Order update state = ORDER_STATE_PLACED
2016.10.14 02:31:26.208 TestOrders (GBPUSD,H1)  OnTradeTransaction Order plased done. Ticket = 102958649
2016.10.14 02:31:26.208 TestOrders (GBPUSD,H1)  RemoveOrderAsyncMode Order sent (remove) in async mode
2016.10.14 02:31:26.272 TestOrders (GBPUSD,H1)  OnTradeTransaction Transaction type: TRADE_TRANSACTION_ORDER_UPDATE
2016.10.14 02:31:26.272 TestOrders (GBPUSD,H1)  OnTradeTransaction Order update state = ORDER_STATE_REQUEST_CANCEL
2016.10.14 02:31:26.272 TestOrders (GBPUSD,H1)  OnTradeTransaction Transaction type: TRADE_TRANSACTION_ORDER_DELETE
2016.10.14 02:31:26.273 TestOrders (GBPUSD,H1)  OnTradeTransaction Transaction type: TRADE_TRANSACTION_REQUEST
2016.10.14 02:31:26.273 TestOrders (GBPUSD,H1)  OnTradeTransaction Order get ticket done. Ticket = 102958649
2016.10.14 02:31:26.273 TestOrders (GBPUSD,H1)  OnTradeTransaction Transaction type: TRADE_TRANSACTION_HISTORY_ADD
2016.10.14 02:31:26.273 TestOrders (GBPUSD,H1)  OnTradeTransaction Order remove done. Ticket = 102958649
 
Andrey Khatimlianskii:
Por supuesto, todo el mundo entenderá el mensaje. Pero no sabrán que alguien no ha recibido el mismo mensaje un rato antes y no ha activado un nuevo envío de pedidos.

Una nueva idea.

Escribe un sincronizador de EA. Una vez realizado el OrderSend, se envían los datos a este EA y se espera a que responda.

Aunque, la diferencia con la variante de deslizamiento son los mismos huevos. En definitiva, su variante es óptima, por desgracia.

 
prostotrader:

Lo mismo con una orden de mercado (en la Bolsa)

Añadido

Si se envía una orden de mercado, una vez que recibimos el billete, vamos con él al historial y

a ver qué pasa con él.

Teóricamente, es posible cuando CTrade ::ResultDeal() devuelve cero y CTrade::ResultOrder() devuelve 0€ Por ejemplo, con TRADE_RETCODE_TIMEOUT.
 
prostotrader:

OrderSend() es una función absolutamente sincrónica - si se recibe un ticket, todo se ejecuta.

A continuación, un ejemplo

Añadido, y aquí están los registros

https://www.mql5.com/ru/forum/38456/page85#comment_2888263

Gracias, por el enlace. Pero la pregunta era un poco diferente. Más bien, no era una pregunta, sino un argumento a favor de comprobar el estado de la orden en el momento, sin esperar a que se active el evento OnTrade().
 
Oleg Shenker:
Le agradezco el enlace. Pero mi pregunta era un poco diferente. Más bien, no era una pregunta sino un argumento a favor de comprobar el estado de la orden en el momento sin esperar a que se procese el evento OnTrade().

No debes haber mirado el código del ejemplo.

if(SendOrderSyncMode())
           {
            if(order_ticket>0)
              {
               if(OrderSelect(order_ticket))
                 {
                  RemoveOrderSyncMode(order_ticket);
                 }
               else
                 {
                  Print(__FUNCTION__," Order not select! Ticket = ",order_ticket);
                 }
              }
           }

El borrado de la orden en modo sincronizado (OrderSend()) debería haber sido después de la respuesta de

función SendOrserSyncMode, pero no ha ocurrido.

2016.10.14 02:18:20.292 Operaciones'3941932': falló la orden de cancelación #102956267 límite de compra 1,00 GBPUSD a 1,22374 [Solicitud no válida].

Aquí es donde está el error. Según la documentación, si hemos recibido un ticket, la orden se ha colocado en el sistema de comercio,

Pero esto (en FOREX) no se hace, y el borrado se produjo en el cuerpo de la funciónRemoveOrderAsyncMode, es decir

tras recibir un mensaje en OnTradeTransaction

Añadido

Para responder a la pregunta de la top-starter, después de enviar una orden utilizando el OrderSend(),

la orden puede ser manejada después de recibir el evento en OntradeTransaction (OnTrade).

Parece que los desarrolladores van a solucionar el problema.

Añadido

Ahora he mirado en FORTS - este problema también está allí

2016.10.17 18:45:19.074 Trades  '1007932': buy limit 1.00 GAZR-12.16 at 12847
2016.10.17 18:45:19.081 Trades  '1007932': accepted buy limit 1.00 GAZR-12.16 at 12847
2016.10.17 18:45:19.081 Trades  '1007932': buy limit 1.00 GAZR-12.16 at 12847 placed for execution
2016.10.17 18:45:19.091 Trades  '1007932': order #52178167 buy limit 1.00 / 1.00 GAZR-12.16 at 12847 done in 17.440 ms
2016.10.17 18:45:19.091 Trades  '1007932': failed cancel order #52178167 buy limit 1.00 GAZR-12.16 at 12847.00000 [Invalid request]
2016.10.17 18:45:19.091 Trades  '1007932': cancel order #52178167 buy limit 1.00 GAZR-12.16 at 12847
2016.10.17 18:45:19.098 Trades  '1007932': accepted cancel order #52178167 buy limit 1.00 GAZR-12.16 at 12847
2016.10.17 18:45:19.099 Trades  '1007932': cancel order #52178167 buy limit 1.00 GAZR-12.16 at 12847 placed for execution in 7.215 ms

2016.10.17 18:45:19.074 TestOrders (GAZR-12.16,M1)      OnChartEvent Send Order Sync mode
2016.10.17 18:45:19.091 TestOrders (GAZR-12.16,M1)      SendOrderSyncMode Order sent in sync mode
2016.10.17 18:45:19.091 TestOrders (GAZR-12.16,M1)      RemoveOrderSyncMode Order not sent (remove) in sync mode.
2016.10.17 18:45:19.091 TestOrders (GAZR-12.16,M1)      OnTradeTransaction Transaction type: TRADE_TRANSACTION_ORDER_ADD
2016.10.17 18:45:19.091 TestOrders (GAZR-12.16,M1)      OnTradeTransaction Transaction type: TRADE_TRANSACTION_REQUEST
2016.10.17 18:45:19.091 TestOrders (GAZR-12.16,M1)      OnTradeTransaction Transaction type: TRADE_TRANSACTION_ORDER_UPDATE
2016.10.17 18:45:19.091 TestOrders (GAZR-12.16,M1)      OnTradeTransaction Order update state = ORDER_STATE_REQUEST_ADD
2016.10.17 18:45:19.091 TestOrders (GAZR-12.16,M1)      OnTradeTransaction Transaction type: TRADE_TRANSACTION_REQUEST
2016.10.17 18:45:19.091 TestOrders (GAZR-12.16,M1)      OnTradeTransaction Transaction type: TRADE_TRANSACTION_ORDER_UPDATE
2016.10.17 18:45:19.091 TestOrders (GAZR-12.16,M1)      OnTradeTransaction Order update state = ORDER_STATE_PLACED
2016.10.17 18:45:19.091 TestOrders (GAZR-12.16,M1)      OnTradeTransaction Order plased done. Ticket = 52178167
2016.10.17 18:45:19.091 TestOrders (GAZR-12.16,M1)      RemoveOrderAsyncMode Order sent (remove) in async mode
2016.10.17 18:45:19.098 TestOrders (GAZR-12.16,M1)      OnTradeTransaction Transaction type: TRADE_TRANSACTION_ORDER_UPDATE
2016.10.17 18:45:19.098 TestOrders (GAZR-12.16,M1)      OnTradeTransaction Order update state = ORDER_STATE_REQUEST_CANCEL
2016.10.17 18:45:19.099 TestOrders (GAZR-12.16,M1)      OnTradeTransaction Transaction type: TRADE_TRANSACTION_REQUEST
2016.10.17 18:45:19.099 TestOrders (GAZR-12.16,M1)      OnTradeTransaction Order get ticket done. Ticket = 52178167
2016.10.17 18:45:19.099 TestOrders (GAZR-12.16,M1)      OnTradeTransaction Transaction type: TRADE_TRANSACTION_ORDER_UPDATE
2016.10.17 18:45:19.099 TestOrders (GAZR-12.16,M1)      OnTradeTransaction Order update state = ORDER_STATE_REQUEST_CANCEL
2016.10.17 18:45:19.108 TestOrders (GAZR-12.16,M1)      OnTradeTransaction Transaction type: TRADE_TRANSACTION_REQUEST
2016.10.17 18:45:19.108 TestOrders (GAZR-12.16,M1)      OnTradeTransaction Transaction type: TRADE_TRANSACTION_ORDER_DELETE
2016.10.17 18:45:19.108 TestOrders (GAZR-12.16,M1)      OnTradeTransaction Transaction type: TRADE_TRANSACTION_HISTORY_ADD
2016.10.17 18:45:19.108 TestOrders (GAZR-12.16,M1)      OnTradeTransaction Order remove done. Ticket = 52178167
 
prostotrader:

Para responder a la pregunta del top-trader, después de enviar una orden utilizando el OrderSend(),

puede operar con la orden después de recibir el evento en OntradeTransaction (OnTrade)

¿En el caso de dos EAs sobre el mismo símbolo?
 
fxsaber:
¿En el caso de dos EAs sobre el mismo símbolo?

Sí, dos EAs en el mismo símbolo.

struct MqlTradeRequest
  {
   ENUM_TRADE_REQUEST_ACTIONS    action;           // Тип выполняемого действия
   ulong                         magic;            // Штамп эксперта (идентификатор magic number)
   ulong                         order;            // Тикет ордера
   string                        symbol;           // Имя торгового инструмента
   double                        volume;           // Запрашиваемый объем сделки в лотах
   double                        price;            // Цена  
   double                        stoplimit;        // Уровень StopLimit ордера
   double                        sl;               // Уровень Stop Loss ордера
   double                        tp;               // Уровень Take Profit ордера
   ulong                         deviation;        // Максимально приемлемое отклонение от запрашиваемой цены
   ENUM_ORDER_TYPE               type;             // Тип ордера
   ENUM_ORDER_TYPE_FILLING       type_filling;     // Тип ордера по исполнению
   ENUM_ORDER_TYPE_TIME          type_time;        // Тип ордера по времени действия
   datetime                      expiration;       // Срок истечения ордера (для ордеров типа ORDER_TIME_SPECIFIED)
   string                        comment;          // Комментарий к ордеру
   ulong                         position;         // Тикет позиции
   ulong                         position_by;      // Тикет встречной позиции
  };

Eliminar las posiciones, órdenes y operaciones "equivocadas".