OnTradeTransaction - Seite 4

 
Andrey Dik:

Ich habe noch nie ein OnTradeTransaction ()-Ereignis behandelt. Es bestand keine Notwendigkeit, dies zu tun, da die Handelslogik nicht berücksichtigen musste, was das Ereignis auslöste. SL oder TP. Wollen Sie damit andeuten, dass dies ein Beweis für meine Handelserfahrung ist?)))

Ich lese sehr aufmerksam, aber ich sehe niemanden, der eine vernünftige Antwort in Form eines funktionierenden Codes gibt. Oder ist es ein verdammt großes Geheimnis und eine große Zauberei - das geheime Wissen und die Fähigkeit zu bestimmen, was funktioniert?

Ich schreibe keine EAs zu bestellen, vor allem für FOREX.

Sie haben nun alle notwendigen Kenntnisse, um einen vernünftigen Code zu schreiben,

die Ihren Bedürfnissen entspricht.

 
prostotrader:

Ich schreibe keine EAs auf Bestellung, insbesondere nicht für FOREX.

Jetzt haben Sie alle Kenntnisse, die Sie brauchen, um einen vernünftigen Code zu schreiben,

die Ihren Bedürfnissen entspricht.

Und wer hat Sie gebeten, auf Bestellung zu schreiben?

Eine Frage in diesem Forum zu stellen, bedeutet heutzutage, auf Bestellung zu schreiben?

Fahrt zur Hölle, ihr alle. Sie sind Verkäufer.

 
Andrey Dik:

...

Und wenn Sie sich die Kontohistorie ansehen, um den Kommentar des letzten Handels zu sehen, wäre das in Ordnung?

So etwas in der Art:

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

Und wenn Sie sich die Kontohistorie ansehen, um den Kommentar der letzten Transaktion zu sehen, wäre das in Ordnung?

So etwas in der Art:

Vielen Dank, lieber Mann!

Wahrscheinlich ist dies die zuverlässigste Methode, da SL und TP sich verschieben können und ein Preisvergleich sinnlos wäre.

 
Anatoli Kazharski:

Und wenn Sie sich die Kontohistorie ansehen, um den Kommentar zur letzten Transaktion zu sehen, wäre das in Ordnung?

So etwas in der Art:


Und wenn es keinen Kommentar gibt (was durchaus möglich ist)?

 
Andrey Dik:

Dies ist wahrscheinlich die zuverlässigste Methode, da SL und TP sich verschieben können und ein Preisvergleich nutzlos wäre.

Nein, diese Methode ist schlecht
   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:

Was ist, wenn es keinen Kommentar gibt (was durchaus möglich ist)?

Das ist natürlich gut möglich. Ich verwende diese Methode für die Analyse des Verlaufs im Tester, da sie am einfachsten und schnellsten ist.

In diesem Fall muss ich Tickets mit schwebenden Aufträgen erstellen und auswerten. Ich habe kein fertiges Beispiel zur Hand.

 
Ein altes Problem

Schließen einer Position zu erfahren.


Dies ist kein willkürlicher Vorwurf, sondern das Ergebnis stundenlanger Versuche, herauszufinden (kein HistorySelectByPosition und anderes Zeug hilft), wie alles funktioniert. Und ich entschuldige mich gerne, wenn ich falsch liege. Um nicht unbegründet zu sein, zeige ich einen Expert Advisor für den Tester (es ist leichter zu verstehen) auf dem Server RoboForexEU-MetaTrader 5, die eine Position eröffnet, dann setzt SL und TP Ebenen.

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;
    }
  }
}

In diesem EA können SL und TP einer einzelnen geschlossenen Position nicht definiert werden (in OnDeinit). Soll das so sein?

Wer kann das Problem lösen - SL und TP einer geschlossenen Position definieren?
 
Anatoli Kazharski:

Das ist natürlich gut möglich. Ich verwende diese Option, um den Verlauf im Tester zu analysieren, da sie am einfachsten und schnellsten ist.

Und so müssen Sie mit ausstehenden Aufträgen verfahren und die Tickets analysieren. Ich habe kein fertiges Beispiel zur Hand.

Was hat Ihnen an dieser Methode nicht gefallen?

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

Was ist an dieser Methode falsch?

case TRADE_TRANSACTION_DEAL_ADD:
  if (trans.order != my_order_ticket)
  {
   //Сработал SL или TP
  }
break;
Ja, das ist mehr oder weniger der Fall. Ich habe es nur noch nicht auf diese Weise getestet.