OnTradeTransaction - page 4

 
Andrey Dik:

Je n'ai jamais manipulé d'événement OnTradeTransaction () auparavant, il n'y avait pas besoin de le faire car la logique de trading n'avait pas besoin de prendre en compte ce qui avait déclenché l'événement. SL ou TP. Suggérez-vous que c'est une preuve de mon expérience commerciale ?))))

Je lis très attentivement, mais je ne vois personne donner une réponse sensée sous la forme d'un code fonctionnel. Ou est-ce un putain de grand secret et une grande magie - la connaissance secrète et la capacité de déterminer ce qui fonctionne ?

Je n'écris pas d'EAs sur commande, surtout pour le FOREX.

Vous avez maintenant toutes les connaissances nécessaires pour écrire un code raisonnable,

qui répond à vos besoins.

 
prostotrader:

Je n'écris pas d'EAs sur commande, surtout pour le FOREX.

Vous avez maintenant toutes les connaissances nécessaires pour écrire un code judicieux,

qui répond à vos besoins.

Et qui vous a demandé d'écrire sur commande ?

Poser une question sur ce forum signifie aujourd'hui écrire pour commander ?

Allez au diable, vous tous. Vous êtes des vendeurs.

 
Andrey Dik:

...

Et si vous regardez l'historique du compte pour voir le commentaire de la dernière transaction, cela vous convient-il ?

Quelque chose comme ça :

//+------------------------------------------------------------------+
//| Возвращает причину закрытия позиции по 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:

Et si vous regardez l'historique du compte pour voir le commentaire de la dernière transaction, cela vous convient-il ?

Quelque chose comme ça :

Merci, gentil monsieur !

Probablement le moyen le plus fiable, étant donné que SL et TP peuvent glisser et que la comparaison des prix serait inutile.

 
Anatoli Kazharski:

Et si vous regardez l'historique du compte pour voir le commentaire de la dernière transaction, cela vous convient-il ?

Quelque chose comme ça :


Et s'il n'y a pas de commentaire (ce qui est tout à fait possible) ?

 
Andrey Dik:

C'est probablement le moyen le plus fiable, étant donné que SL et TP peuvent glisser et qu'une comparaison des prix serait inutile.

Nah, cette méthode est mauvaise
   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:

Et s'il n'y a pas de commentaire (ce qui est tout à fait possible) ?

Tout à fait possible, bien sûr. J'utilise cette méthode pour analyser l'historique dans le testeur, car c'est la plus simple et la plus rapide.

Dans ce cas, je dois faire et analyser des tickets avec des ordres en attente. Je n'ai pas d'exemple sous la main.

 
Un vieux problème

fermé une position .


Il ne s'agit pas d'une accusation sans discernement, mais du résultat d'heures passées à essayer de comprendre (l'absence de HistorySelectByPosition et d'autres trucs n'aide pas) comment tout fonctionne. Et je suis heureux de m'excuser si je me trompe. Pour ne pas être sans fondement, je montre un Expert Advisor pour le testeur (il est plus facile à comprendre) sur le serveur RoboForexEU-MetaTrader 5, qui ouvre une position, puis met des niveaux SL et 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;
    }
  }
}

Dans cet EA, le SL et le TP d'une seule position fermée ne peuvent pas être définis (dans OnDeinit). C'est censé faire ça ?

Qui peut résoudre - définir SL et TP d'une position fermée ?
 
Anatoli Kazharski:

Tout à fait possible, bien sûr. J'utilise celui-ci pour analyser l'historique dans le testeur, car c'est le plus facile et le plus rapide.

Et donc, avec les ordres en suspens, vous devez faire et analyser des tickets. Je n'ai pas d'exemple tout fait sous la main.

Qu'est-ce qui ne vous a pas convenu dans cette méthode ?

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

Quel est le problème de cette méthode ?

case TRADE_TRANSACTION_DEAL_ADD:
  if (trans.order != my_order_ticket)
  {
   //Сработал SL или TP
  }
break;
Oui, c'est plus ou moins comme ça. Je ne l'ai pas encore testé de cette façon.
Raison: