OnTradeTransaction - страница 4

 
Andrey Dik:

Я никогда не обрабатывал раньше события OnTradeTransaction (), в этом не было никакой необходимости, поскольку в торговой логике не было необходимости учитывать что именно сработало. SL или TP. Полагаете, что это свидетельствует о моём торговом опыте?)))

 Я очень внимательно читаю, но не вижу, что бы кто то дал вразумительный ответ в виде рабочего кода. Или это охрененный секрет и великое колдунство - тайное знание и умение определять что сработало?

Я не пишу советников на заказ, тем более для ФОРЕКС.

У Вас, теперь, есть все необходимые знания для написания вразумительного кода,

соответствующего Вашим потребностям. 

 
prostotrader:

Я не пишу советников на заказ, тем более для ФОРЕКС.

У Вас, теперь, есть все необходимые знания для написания вразумительного кода,

соответствующего Вашим потребностям. 

А кто Вас просил писать на заказ?!

Нынче задать вопрос на этом форуме означает написать на заказ?

Да идите вы все нахер. Барыги. 

 
Andrey Dik:

...

А если по истории счёта посмотреть комментарий последней сделки, это устроит?

Что-то вроде этого:

//+------------------------------------------------------------------+
//| Возвращает причину закрытия позиции по Take Profit               |
//+------------------------------------------------------------------+
bool CAccountHistory::IsClosedByTakeProfit(const string symbol)
  {
//--- Получим комментарий последней сделки на указанном символе
   string last_comment=LastDealComment(symbol);
//--- Если в комментарии есть строка "tp"
   if(StringFind(last_comment,"tp",0)>-1)
      return(true);
//--- Если нет строки "tp"
   return(false);
  }
//+------------------------------------------------------------------+
//| Возвращает причину закрытия позиции по Stop Loss                 |
//+------------------------------------------------------------------+
bool CAccountHistory::IsClosedByStopLoss(const string symbol)
  {
//--- Получим комментарий последней сделки на указанном символе
   string last_comment=LastDealComment(symbol);
//--- Если в комментарии есть строка "sl"
   if(StringFind(last_comment,"sl",0)>-1)
      return(true);
//--- Если нет строки "sl"
   return(false);
  }
//+------------------------------------------------------------------+
//| Возвращает комментарий последней сделки на указанном символе     |
//+------------------------------------------------------------------+
string CAccountHistory::LastDealComment(const string symbol)
  {
   int    total_deals  =0;  // Всего сделок в списке выбранной истории
   string deal_symbol  =""; // Символ сделки
   string deal_comment =""; // Комментарий сделки
//--- Если история сделок получена
   if(HistorySelect(0,TimeCurrent()))
     {
      //--- Получим количество сделок в полученном списке
      total_deals=HistoryDealsTotal();
      //--- Пройдемся по всем сделкам в полученном списке от последней сделки к первой
      for(int i=total_deals-1; i>=0; i--)
        {
         //--- Получим комментарий сделки
         deal_comment=HistoryDealGetString(HistoryDealGetTicket(i),DEAL_COMMENT);
         //--- Получим символ сделки
         deal_symbol=HistoryDealGetString(HistoryDealGetTicket(i),DEAL_SYMBOL);
         //--- Если символ сделки и текущий символ равны, остановим цикл
         if(deal_symbol==symbol)
            break;
        }
     }
//---
   return(deal_comment);
  }
 
Anatoli Kazharski:

А если по истории счёта посмотреть комментарий последней сделки, это устроит?

Что-то вроде этого:

Спасибо, добрый человек!

Пожалуй это самый надёжный способ, если учитывать что SL и TP может проскользить и сравнивать цену окажется бесполезно. 

 
Anatoli Kazharski:

А если по истории счёта посмотреть комментарий последней сделки, это устроит?

Что-то вроде этого:


А если комментария нет (что в полне возможно)?

 
Andrey Dik:

Пожалуй это самый надёжный способ, если учитывать что SL и TP может проскользить и сравнивать цену окажется бесполезно. 

Не, этот метод плох
   static int GetOrderType(const ulong OrderTicket)
     {
      int OrderType=(int)::HistoryOrderGetInteger(OrderTicket,ORDER_TYPE);

      if((OrderType==ORDER_TYPE_BUY) || (OrderType==ORDER_TYPE_SELL))
        {
         const string OrderComment=HistoryOrderGetString(OrderTicket,ORDER_COMMENT);
         const string OrderPrice=::DoubleToString(::HistoryOrderGetDouble(OrderTicket,ORDER_PRICE_OPEN),
                                                  (int)::SymbolInfoInteger(HistoryOrderGetString(OrderTicket,ORDER_SYMBOL),SYMBOL_DIGITS));

         if(OrderComment=="tp "+OrderPrice)
            OrderType=ORDER_TYPE_TAKEPROFIT;
         else if(OrderComment=="sl "+OrderPrice)
            OrderType=ORDER_TYPE_STOPLOSS;
        }

      return(OrderType);
     }
 
prostotrader:

А если комментария нет (что в полне возиожно)?

Вполне возможно, конечно. Этот использую для анализа на истории в тестере, как самый простой и быстрый.

А так с отложенными ордерами нужно делать и анализировать тикеты. Готового примера у меня под рукой нет. 

 
Старая задачка

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

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

fxsaber, 2016.07.17 20:19

Мало того, что takeprofit в MT5 лучше не выставлять, если вы хотите лимитный аналог, то после закрытия позиции вы никак через MQL5 не сможете узнать ее значения takeprofit и stoploss.

Это не огульные обвинения, а результат многочасовых попыток разобраться (никакие HistorySelectByPosition и прочее не помогают), как же все работает. И я готов с радостью принести свои извинения, если ошибаюсь. Чтобы не быть голословным привожу советник для тестера (так проще разобраться) на сервере RoboForexEU-MetaTrader 5, который открывает позицию, затем ставит SL и TP-уровни.

void OnTick()
{
  static bool Flag = true;

  if (Flag)
  {
    // Открываем SELL-позицию
    MqlTradeRequest Request = {0};

    Request.action = TRADE_ACTION_DEAL;

    Request.symbol = Symbol();
    Request.volume = 1;
    Request.price = SymbolInfoDouble(Symbol(), SYMBOL_BID);

    Request.type = ORDER_TYPE_SELL;

    MqlTradeResult Result;

    if (OrderSend(Request, Result))
    {
      // Устанавливаем SL и TP
      Request.position = Result.deal;

      Request.action = TRADE_ACTION_SLTP;

      Request.tp = Result.ask - 10 * _Point;
      Request.sl = Result.ask + 10 * _Point;

      if (OrderSend(Request, Result))
        Print("Сделка в тестере закроется либо по SL, TP, либо по окончании бэктеста")    ;

      Flag = false;
    }
  }
}

В этом советнике невозможно определить (в OnDeinit) SL и TP единственной закрытой позиции. Это так задумано?

Кто сможет решить - определить SL и TP закрытой позиции?
 
Anatoli Kazharski:

Вполне возможно, конечно. Этот использую для анализа на истории в тестере, как самый простой и быстрый.

А так с отложенными ордерами нужно делать и анализировать тикеты. Готового примера у меня под рукой нет. 

А чем не устроил этот метод?

case TRADE_TRANSACTION_DEAL_ADD:
  if (trans.order != my_order_ticket)
  {
   //Сработал SL или TP
  }
break;


 

 
prostotrader:

А чем не устроил этот метод?

case TRADE_TRANSACTION_DEAL_ADD:
  if (trans.order != my_order_ticket)
  {
   //Сработал SL или TP
  }
break;
Да, примерно так. Просто не тестировал так пока.
Причина обращения: