![MQL5 - Lenguaje de estrategias comerciales para el terminal de cliente MetaTrader 5](https://c.mql5.com/i/registerlandings/logo-2.png)
Está perdiendo oportunidades comerciales:
- Aplicaciones de trading gratuitas
- 8 000+ señales para copiar
- Noticias económicas para analizar los mercados financieros
Registro
Entrada
Usted acepta la política del sitio web y las condiciones de uso
Si no tiene cuenta de usuario, regístrese
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
¿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
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)
Pero en modo asíncrono (FOREX) funciona bien
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.
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.
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
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(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.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
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?
Sí, dos EAs en el mismo símbolo.
{
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".