MetaEditor build 1490 - página 2

 
Andrey Dik:

¿Cómo sé que el SL/TP se ha activado en OnTradeTransaction()?

Para entender la lógica de los mensajes en OnTrade*, hago una impresión de los parámetros de entrada en el momento en que se produjo el evento de interés.

Haz lo mismo, todo se aclara de inmediato.

Recuerde que el TP en MT5 es siempre (a diferencia de MT4) una orden de mercado, que se cuelga en el servidor de MT5, no en la bolsa/ECN. En consecuencia, cuando se active habrá latencia + deslizamiento del mercado de cualquier signo. En algunas MT4 TP son órdenes limitadas que se colocan directamente en la ECN. Por lo tanto, no hay latencia (MT-ECN) ni deslizamiento negativo, pero sí hay redireccionamiento. Así que el TP es una de las fuertes desventajas de MT5 sobre MT4.

 
fxsaber:

Para entender la lógica de los mensajes en OnTrade*, hago una impresión de los parámetros de entrada en el momento en que se produjo el evento de interés.

Haz lo mismo, todo se aclara de inmediato.

Lo he probado. En este caso OnTrade() no sirve de nada e incluso no es bueno, ya que tenemos que procesar el historial para cada evento de comercio.

Tiene sentido averiguar la activación de SL/TP en OnTradeTransaction() porque se puede filtrar por tipo de evento. En este caso he definido el tipo de evento como "Añadir al historial", luego el tipo de operación como "Salir" y luego un punto muerto.

 
Andrey Dik:

Lo he probado. OnTrade() en este caso no sirve de nada, incluso es perjudicial, ya que tendrá que procesar el historial en cada evento de negociación.

Me refería a OnTrade*.
 
fxsaber:
Estabas hablando de OnTrade*.
Sí, lo tengo. Lo probé. No he podido averiguar nada (de lo que necesito).
 
#include <MT4Orders.mqh> // https://www.mql5.com/ru/code/16006

bool FirstRun = true;

void OnTick()
{  
  if (FirstRun)    
  {
    const double Price = SymbolInfoDouble(_Symbol, SYMBOL_ASK);
    
    FirstRun = (OrderSend(_Symbol, OP_BUY, 1, Price, 0, 0, Price + 10 * _Point) <= 0);
  }
}

void OnTradeTransaction ( const MqlTradeTransaction &Trans, const MqlTradeRequest &Request, const MqlTradeResult &Result )
{
  if (!FirstRun)
    Print(ToString(Trans) + ToString(Request) + ToString(Result));
}

#define TOSTRING(A)  #A + " = " + (string)(A) + "\n"
#define TOSTRING2(A) #A + " = " + EnumToString(A) + "\n"

string ToString( const MqlTradeTransaction &Trans )
{
  return(TOSTRING(Trans.deal) + TOSTRING(Trans.order) + TOSTRING(Trans.symbol) +
         TOSTRING2(Trans.type) + TOSTRING2(Trans.order_type) + TOSTRING2(Trans.order_state) +
         TOSTRING2(Trans.deal_type) + TOSTRING2(Trans.time_type) +
         TOSTRING(Trans.time_expiration) + TOSTRING(Trans.price) + TOSTRING(Trans.price_trigger) +
         TOSTRING(Trans.price_sl) + TOSTRING(Trans.price_tp) + TOSTRING(Trans.volume) +
         TOSTRING(Trans.position) + TOSTRING(Trans.position_by));
}

string ToString( const MqlTradeRequest &Request )
{
  return(TOSTRING2(Request.action) + TOSTRING(Request.magic) + TOSTRING(Request.order) +
         TOSTRING(Request.symbol) + TOSTRING(Request.volume) + TOSTRING(Request.price) +
         TOSTRING(Request.stoplimit) + TOSTRING(Request.sl) +  TOSTRING(Request.tp) +
         TOSTRING(Request.deviation) + TOSTRING2(Request.type) + TOSTRING2(Request.type_filling) +
         TOSTRING2(Request.type_time) + TOSTRING(Request.expiration) + TOSTRING(Request.comment) +
         TOSTRING(Request.position) + TOSTRING(Request.position_by));
}

string ToString( const MqlTradeResult &Result )
{
  return(TOSTRING(Result.retcode) + TOSTRING(Result.deal) + TOSTRING(Result.order) +
         TOSTRING(Result.volume) + TOSTRING(Result.price) + TOSTRING(Result.bid) +  
         TOSTRING(Result.ask) + TOSTRING(Result.comment) + TOSTRING(Result.request_id) +  
         TOSTRING(Result.retcode_external));
}
Resultado de la prueba
2016.11.23 23:59:57   take profit triggered #2 buy 1.00 EURUSD 1.06235 tp: 1.06245 [#3 sell 1.00 EURUSD at 1.06245]
2016.11.23 23:59:57   deal #3 sell 1.00 EURUSD at 1.06245 done (based on order #3)
2016.11.23 23:59:57   deal performed [#3 sell 1.00 EURUSD at 1.06245]
2016.11.23 23:59:57   order performed sell 1.00 at 1.06245 [#3 sell 1.00 EURUSD at 1.06245]
2016.11.23 23:59:57   Trans.deal = 3
2016.11.23 23:59:57   Trans.order = 3
2016.11.23 23:59:57   Trans.type = TRADE_TRANSACTION_DEAL_ADD
2016.11.23 23:59:57   Trans.order_type = ORDER_TYPE_BUY
2016.11.23 23:59:57   Trans.order_state = ORDER_STATE_STARTED
2016.11.23 23:59:57   Trans.deal_type = DEAL_TYPE_SELL
2016.11.23 23:59:57   Trans.time_type = ORDER_TIME_GTC
2016.11.23 23:59:57   Trans.time_expiration = 1970.01.01 00:00:00
2016.11.23 23:59:57   Trans.price = 1.06245
2016.11.23 23:59:57   Trans.price_trigger = 0.0
2016.11.23 23:59:57   Trans.price_sl = 0.0
2016.11.23 23:59:57   Trans.volume = 1.0
2016.11.23 23:59:57   Trans.position = 2
2016.11.23 23:59:57   Trans.position_by = 0
2016.11.23 23:59:57   Request.action = ENUM_TRADE_REQUEST_ACTIONS::0
2016.11.23 23:59:57   Request.magic = 0
2016.11.23 23:59:57   Request.order = 0
2016.11.23 23:59:57   Request.symbol =
2016.11.23 23:59:57   Request.volume = 0.0
2016.11.23 23:59:57   Request.price = 0.0
2016.11.23 23:59:57   Request.sl = 0.0
2016.11.23 23:59:57   Request.tp = 0.0
2016.11.23 23:59:57   Request.deviation = 0
2016.11.23 23:59:57   Request.type = ORDER_TYPE_BUY
2016.11.23 23:59:57   Request.type_filling = ORDER_FILLING_FOK
2016.11.23 23:59:57   Request.type_time = ORDER_TIME_GTC
2016.11.23 23:59:57   Request.expiration = 1970.01.01 00:00:00
2016.11.23 23:59:57   Request.comment =
2016.11.23 23:59:57   Request.position = 0
2016.11.23 23:59:57   Result.retcode = 0
2016.11.23 23:59:57   Result.deal = 0
2016.11.23 23:59:57   Result.order = 0
2016.11.23 23:59:57   Result.volume = 0.0
2016.11.23 23:59:57   Result.price = 0.0
2016.11.23 23:59:57   Result.bid = 0.0
2016.11.23 23:59:57   Result.ask = 0.0
2016.11.23 23:59:57   Result.comment =
2016.11.23 23:59:57   Result.request_id = 0
2016.11.23 23:59:57  
2016.11.23 23:59:57   Trans.deal = 0
2016.11.23 23:59:57   Trans.order = 3
2016.11.23 23:59:57   Trans.symbol = EURUSD
2016.11.23 23:59:57   Trans.type = TRADE_TRANSACTION_ORDER_DELETE
2016.11.23 23:59:57   Trans.order_type = ORDER_TYPE_SELL
2016.11.23 23:59:57   Trans.order_state = ORDER_STATE_FILLED
2016.11.23 23:59:57   Trans.deal_type = DEAL_TYPE_BUY
2016.11.23 23:59:57   Trans.time_type = ORDER_TIME_GTC
2016.11.23 23:59:57   Trans.price = 1.06245
2016.11.23 23:59:57   Trans.price_trigger = 0.0
2016.11.23 23:59:57   Trans.price_sl = 0.0
2016.11.23 23:59:57   Trans.price_tp = 0.0
2016.11.23 23:59:57   Trans.volume = 1.0
2016.11.23 23:59:57   Trans.position = 2
2016.11.23 23:59:57   Trans.position_by = 0
2016.11.23 23:59:57   Request.action = ENUM_TRADE_REQUEST_ACTIONS::0
2016.11.23 23:59:57   Request.magic = 0
2016.11.23 23:59:57   Request.symbol =
2016.11.23 23:59:57   Request.volume = 0.0
2016.11.23 23:59:57   Request.price = 0.0
2016.11.23 23:59:57   Request.stoplimit = 0.0
2016.11.23 23:59:57   Request.sl = 0.0
2016.11.23 23:59:57   Request.tp = 0.0
2016.11.23 23:59:57   Request.deviation = 0
2016.11.23 23:59:57   Request.type = ORDER_TYPE_BUY
2016.11.23 23:59:57   Request.type_filling = ORDER_FILLING_FOK
2016.11.23 23:59:57   Request.expiration = 1970.01.01 00:00:00
2016.11.23 23:59:57   Request.comment =
2016.11.23 23:59:57   Request.position = 0
2016.11.23 23:59:57   Request.position_by = 0
2016.11.23 23:59:57   Result.retcode = 0
2016.11.23 23:59:57   Result.deal = 0
2016.11.23 23:59:57   Result.order = 0
2016.11.23 23:59:57   Result.volume = 0.0
2016.11.23 23:59:57   Result.price = 0.0
2016.11.23 23:59:57   Result.ask = 0.0
2016.11.23 23:59:57   Result.comment =
2016.11.23 23:59:57   Result.request_id = 0
2016.11.23 23:59:57   Result.retcode_external = 0
2016.11.23 23:59:57  
2016.11.23 23:59:57   Trans.deal = 0
2016.11.23 23:59:57   Trans.order = 3
2016.11.23 23:59:57   Trans.symbol = EURUSD
2016.11.23 23:59:57   Trans.type = TRADE_TRANSACTION_HISTORY_ADD
2016.11.23 23:59:57   Trans.order_state = ORDER_STATE_FILLED
2016.11.23 23:59:57   Trans.deal_type = DEAL_TYPE_BUY
2016.11.23 23:59:57   Trans.time_type = ORDER_TIME_GTC
2016.11.23 23:59:57   Trans.time_expiration = 1970.01.01 00:00:00
2016.11.23 23:59:57   Trans.price = 1.06245
2016.11.23 23:59:57   Trans.price_trigger = 0.0
2016.11.23 23:59:57   Trans.price_sl = 0.0
2016.11.23 23:59:57   Trans.price_tp = 0.0
2016.11.23 23:59:57   Trans.volume = 0.0
2016.11.23 23:59:57   Trans.position_by = 0
2016.11.23 23:59:57   Request.action = ENUM_TRADE_REQUEST_ACTIONS::0
2016.11.23 23:59:57   Request.magic = 0
2016.11.23 23:59:57   Request.order = 0
2016.11.23 23:59:57   Request.symbol =
2016.11.23 23:59:57   Request.volume = 0.0
2016.11.23 23:59:57   Request.price = 0.0
2016.11.23 23:59:57   Request.stoplimit = 0.0
2016.11.23 23:59:57   Request.sl = 0.0
2016.11.23 23:59:57   Request.deviation = 0
2016.11.23 23:59:57   Request.type = ORDER_TYPE_BUY
2016.11.23 23:59:57   Request.type_filling = ORDER_FILLING_FOK
2016.11.23 23:59:57   Request.type_time = ORDER_TIME_GTC
2016.11.23 23:59:57   Request.expiration = 1970.01.01 00:00:00
2016.11.23 23:59:57   Request.comment =
2016.11.23 23:59:57   Request.position = 0
2016.11.23 23:59:57   Request.position_by = 0
2016.11.23 23:59:57   Result.retcode = 0
2016.11.23 23:59:57   Result.order = 0
2016.11.23 23:59:57   Result.volume = 0.0
2016.11.23 23:59:57   Result.price = 0.0
2016.11.23 23:59:57   Result.bid = 0.0
2016.11.23 23:59:57   Result.ask = 0.0
2016.11.23 23:59:57   Result.comment =
2016.11.23 23:59:57   Result.request_id = 0
2016.11.23 23:59:57   Result.retcode_external = 0
 

fxsaber:

El resultado de la prueba

Sí, pero ¿entonces qué?

¿Dónde se indica que se activa el SL/TP? - Esa es la dificultad))

 
Ese es el problema. Pero MT5 recibe esta información de alguna manera, a juzgar por el registro y el dibujo de las posiciones cerradas.
 
fxsaber:
Este es el problema. Pero MT5 de alguna manera obtiene esta información, a juzgar por el registro y el dibujo de las posiciones cerradas.

¿Ya no funciona así?

 
Stanislav Korotky:

¿Ya no funciona?

¿Puedo tener el código?

...sí, sí, puedo tener a Mashka por el muslo, lo siento... Muéstrame el código, por favor.

 
Stanislav Korotky:

¿Ya no funciona así?

No hay manera de definirlo. SL y TP son únicamente una entidad del servidor MT.