OrderSend() - open Buy (instead of sell) or open Sell (instead of buy)

BM Trading GmbH
143
Rene Balke  

Hey, I experience a strange behavior in one of my EAs. The EA was unable to open a sell order and then opened a buy order instead (also in the wrong symbol!!) and commented it like this:

TTT GBPJPY, H1: open #53037131 buy (instead of sell) 0.03 CHFJPY at 115.551 sl 115.678 ok   (see image below)


Below you see the code I use to open the order. In the experts logs it clearly says that the order was executed after calling the "executeSell" function (see image below)... I am kinda lost here. Is this a bug. Did someone experience this error before? I can post more code if needed. Any help is highly appreciated!!


Cheers, René

int executeSell(){ 
   //calculatae entry
   double entry = Bid;
   entry = roundDn(entry);

   //calculate SL
   double sl = 0;
   sl = roundDn(sl);
   
   //calculate tp
   double tp = 0;
   tp = roundDn(tp);
 
   //calc lots
   double lots = Lots;
   for(int i = 0; i < ticketsSell.Total(); i++){
      lots *= LotsMultiplier;
   }
   lots = roundLots(lots);
  
   //open position
   int ticket = OrderSend(Symbol(),OP_SELL,lots,entry,100000,sl,tp,Commentary,Magic);  
   if(ticket <= 0){
      static datetime lastAlert;
      if(TimeCurrent() > lastAlert + PeriodSeconds(PERIOD_M1)){
         lastAlert = TimeCurrent();
         int error = GetLastError();
         Alert("Error: ",error," > Sell Trade konnte nicht eröffnet werden...");
         Alert("Entry: ",DoubleToString(entry,_Digits),", Lots: ",DoubleToString(lots,2),", SL: ",DoubleToString(sl,_Digits),", TP: ",DoubleToString(tp,_Digits));
      }
   }else{
      ticketsSell.Add(ticket);
      ticketsSell.CalcBePrice();
      Print(__FUNCTION__," > Executed ",ticketsSell.Total(),". trade #",ticket," for magic number ",Magic,"..."); 
   }
   return ticket;
}


Carl Schreiber
Moderator
11240
Carl Schreiber  

Das Problem ist wohl de Code des EAs und aus der Funktion executeSell ist es nicht erkennbar. Erkennbar ist, dass er alle paar Sekunden Aufträge 'rauschießt.

Verwende mal den Debugger mit historischen Daten (im Editor Strg+F5).

BM Trading GmbH
143
Rene Balke  
Carl Schreiber:

Das Problem ist wohl de Code des EAs und aus der Funktion executeSell ist es nicht erkennbar. Erkennbar ist, dass er alle paar Sekunden Aufträge 'rauschießt.

Verwende mal den Debugger mit historischen Daten (im Editor Strg+F5).

Danke für die Antwort. Der EA prüft, ob der letzte Trade in diese Richtung (werden in einem Array gespeichert - "ticketsSell" in diesem Fall) x Punkte im Verlust ist. Wenn das der Fall ist, dann wird ein neuer Trade eröffnet. Dazu vergleicht er den Einstiegspreis der letzten Order in dem Array mit dem aktuellen Kurs. Das macht er bei jedem Tick. Das Problem ist hier aber, dass er einen Buy Trade anstelle von einem Sell Trade macht. Hinzukommt, dass er diesen im falschen Symbol absetzt. Deshalb hat die letzte Order in dem Array dann auch einen komplett anderen Einstiegspreis als der Kurs des EA-Symbols und triggert natürlich direkt den nächsten Trade. Deshalb eröffnet er bei jedem Tick einen Trade. Im Tester verläuft alles einwandfrei.

TTT GBPJPY, H1: open #53037131 buy (instead of sell) 0.03 CHFJPY at 115.551 sl 115.678 ok

-> Das EA Symbol ist GBPJPY und er eröffnet CHFJPY obwohl der OrderSend() in der executeSell() die Symbol()-Funktion als Parameter für das Symbol übergeben wird.

Anbei die OnTick()-Funktion des EAs:

void OnTick(){   
   //open first trade of setup
   double rsi = iRSI(_Symbol,RsiTimeframe,RsiPeriod,RsiAppPrice,0);
   if(IsRsi){      
      if(rsi < RsiLowerBound){
         if(IsBuy && ticketsBuy.Total() == 0) executeBuy();
      }else if(rsi > RsiUpperBound){
         if(IsSell && ticketsSell.Total() == 0) executeSell();
      }
   }else{
      if(IsBuy && ticketsBuy.Total() == 0) executeBuy();
      if(IsSell && ticketsSell.Total() == 0) executeSell();         
   }

   //open martingale trades
   if(ticketsBuy.Total() > 0 && ticketsBuy.Total() < MaxTrades){
      if(OrderSelect(ticketsBuy.At(ticketsBuy.Total()-1),SELECT_BY_TICKET)){
         if(Bid < OrderOpenPrice() - calcPoints(GridPips) * _Point * MathPow(GridMultiplier,ticketsBuy.Total()-1)){
            executeBuy();
         }
      }
   }
   if(ticketsSell.Total() > 0 && ticketsSell.Total() < MaxTrades){
      if(OrderSelect(ticketsSell.At(ticketsSell.Total()-1),SELECT_BY_TICKET)){
         if(Ask > OrderOpenPrice() + calcPoints(GridPips) * _Point * MathPow(GridMultiplier,ticketsSell.Total()-1)){
            executeSell();
         }
      }
   }
}
Carl Schreiber
Moderator
11240
Carl Schreiber  
Wenn es da kein anderen EA gibt - woher kommt die MagicNummer 6.. nach 1.. und 2..? In dem Fall würde ich einmal mit dem Broker sprechen.
Clim Fandeev
12876
Clim Fandeev  
Carl Schreiber:
Wenn es da kein anderen EA gibt - woher kommt die MagicNummer 6.. nach 1.. und 2..? In dem Fall würde ich einmal mit dem Broker sprechen.
Manche Logiks der EAs haben random-magic-Funktion. Das könnte das Grund sein. 
BM Trading GmbH
143
Rene Balke  

Sorry, dass ich nichts mehr geschrieben habe. Den EA habe ich für jemand anderes geschrieben und es läuft auf seinem System. Leider konnte ich das genaue Setup dort nicht mehr nachstellen, da er schon Änderungen vorgenommen hat. Es gab aber dann auch noch häufiger den "Trade Timeout" Error, was bei diesem EA ebenfalls zu Problemen geführt hat. Ich vermute, dass es eine ungünstige Kombination aus Verbindungsabbrüchen zum Server und eventuell auch an dem Servercode bei dem Broker generell liegt. Da habe ich leider zu wenig Einblick... Ich habe jetzt eine andere Lösung versucht. Ich hatte einfach gehofft, dass jemand diesen Fall schon einmal hatte und etwas dazu sagen kann. Trotzdem vielen Dank für die Kommentare :)