MetaEditor build 1490 - страница 2

 
Andrey Dik:

Как узнать, что сработал SL/TP в OnTradeTransaction()?

Чтобы понять логику сообщений в OnTrade*, делаю распечатку входных параметров на момент, когда произошло интересуемое событие.

Сделайте аналогично, сразу станет все понятно. 

ЗЫ Не забывайте, что TP в MT5 - это всегда (в отличие от MT4) маркет-ордер, который висит на MT5-сервере, а не на бирже/ECN. Соответственно, при его срабатывании будет latency + маркет-проскальзывание любого знака. На некоторых MT4 TP - это лимитные ордера, которые выставлены прямо на ECN. Поэтому там нет latency (MT-ECN) и нет отрицательного проскальзывания, но есть реджекты. Так что TP - это один из сильных минусов MT5 перед MT4.

 
fxsaber:

Чтобы понять логику сообщений в OnTrade*, делаю распечатку входных параметров на момент, когда произошло интересуемое событие.

Сделайте аналогично, сразу станет все понятно. 

Пробовал. От OnTrade() в данном случае нет никакого толка, даже вред, так как придется обрабатывать историю при каждом торговом событии.

Есть смысл узнать о срабатывании SL/TP в OnTradeTransaction(), так как можно отфильтровать по типу события. В данном случае я определил тип события как "Добавление в историю", далее тип сделки как "Выход", а далее  тупик.

 
Andrey Dik:

Пробовал. От OnTrade() в данном случае нет никакого толка, даже вред, так как придется обрабатывать историю при каждом торговом событии.

Речь шла об OnTrade*.
 
fxsaber:
Речь шла об OnTrade*.
Да, я понял. Пробовал. Ничего узнать (из того что нужно) мне не удалось.
 
#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));
}
Результат тестера
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:

Результат тестера 

Ну да, а дальше что?

Где видно, что сработал SL/TP? - в этом же трудность)) 

 

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

TakeProfit (и StopLoss) закрытой позиции

fxsaber, 2016.07.17 20:19

Мало того, что takeprofit в MT5 лучше не выставлять, если вы хотите лимитный аналог, то после закрытия позиции вы никак через MQL5 не сможете узнать ее значения takeprofit и stoploss.
В этом проблема. Но MT5 каким-то образом получает эту инфу, судя по логу и рисованию закрытых позиций.
 
fxsaber:
В этом проблема. Но MT5 каким-то образом получает эту инфу, судя по логу и рисованию закрытых позиций.

А так уже не работает?

 
Stanislav Korotky:

А так уже не работает?

а можно код?

...да да, можно Машку за ляжку, пардон... покажите, пожалуйста, код. 

 
Stanislav Korotky:

А так уже не работает?

Да никак нельзя определить.  SL и TP - сущность исключительно MT-сервера.
Причина обращения: