Order werden im Strategietester nicht ausgeführt - Mir gehen die Ideen aus.

Einloggen oder registrieren, um einen Kommentar zu schreiben
Spronk
50
Spronk  

Hallo Zusammen,

ich habe einen EA geschrieben und wollte diesen im Strategietester laufen lassen.

Meine BuyOrder werden zwar gesetzt, aber der Preis ignoriert SL, TPs, Margin, etc. Es ist, als ob der Trade gar nicht abgesetzt wurde bzw. aktiv ist.
Ich nutze die Klasse CTrade, die auch keine Fehler zurückgibt. Alle Order sind erfolgreich und werden auch in der Visualisierung angezeigt.

Am Ende des Tests ist mein Account genauso groß, wie am Anfang.
In der History finden sich aber mehrere buy Order, die auch alle gefüllt wurden.

Liegt es daran, dass ich den EA auf CFDs anwende? Gibt es hier irgendwelche bekannten Probleme mit dem Strategietester?
Ich habe es mittlerweile mit Limit-, Stop und Market Order probiert. Immer das selbe Ergebnis. Habe sogar versucht Entries, SLs und TPs selber über MarketOrder zu verwalten. Bringt aber alles nichts.
Die AccountBalance steht still, egal wie viele Oder mir in der Hirtory angezeigt werden

Hat jemand ähnliche Erfahrungen gemacht und hat einen Tipp für mich?

Danke und Grüße.

Otto Pauser
905
Otto Pauser  

CTrade, also MT5.
Was steht im Journal bzw im Log?

Lass das ganze im Debugger laufen und setzte Haltepunkte dort wo er handelt.
Spronk
50
Spronk  
Otto Pauser:

CTrade, also MT5.
Was steht im Journal bzw im Log?

Lass das ganze im Debugger laufen und setzte Haltepunkte dort wo er handelt.

Alles schon gemacht. Wie gesagt, die Buy Order werden ohne Fehler angelegt. Beim debugging gibt es aus meiner Sicht keine Auffälligkeiten.

im Log stehen 11 Buy Order in dieser Form. Entry, SL, TP, alles da. Diese werden aber folgend vollständig ignoriert, auch wenn sie im Tester visualisiert werden.

"EO 0 21:56:56.540 Trade 2018.01.11 15:46:02   market buy 513.00 WMT.US-d sl: 99.300 tp: 99.983 (99.464 / 99.494 / 99.464)
HJ 0 21:56:56.540 Trades 2018.01.11 15:46:02   deal #2 buy 513.00 WMT.US-d at 99.494 done (based on order #2)
QF 2 21:56:56.540 Symbols 2018.01.11 15:46:02  no prices for symbol EURUSD (1970.01.01 00:00:00 0.00000, 0.00000)
RF 0 21:56:56.540 Trade 2018.01.11 15:46:02   deal performed [#2 buy 513.00 WMT.US-d at 99.494]
CR 0 21:56:56.541 Trade 2018.01.11 15:46:02   order performed buy 513.00 at 99.494 [#2 buy 513.00 WMT.US-d at 99.494]
NS 2 21:56:56.541 Symbols 2018.01.11 15:46:02  no prices for symbol EURUSD (1970.01.01 00:00:00 0.00000, 0.00000)
ML 0 21:56:56.561 TestAdvisor (WMT.US-d,H4) 2018.01.11 15:46:02   CTrade::OrderSend: market buy 513.00 WMT.US-d sl: 99.300 tp: 99.982 [done at 99.494]
OM 0 21:56:56.561 TestAdvisor (WMT.US-d,H4) 2018.01.11 15:46:02   PlaceBuyOrder() method executed successfully. Return code=10009 (done at 99.494)"

Was mich hier wundert ist, dass er permanent auf den EURUSD verweist... das zieht sich durch das ganze log. Habe ich aber bisher ignoriert.

Schließlich werden beim Beenden des Testers alle gefüllten Buy Positionen mit aufsummierten Volumen verkauft

"KD 0 21:57:24.610 Trade 2018.04.27 22:14:59   position closed due end of test at 85.830 [#2 buy 1.618K WMT.US-d 92.03093 sl: 85.330 tp: 87.141]
QF 0 21:57:24.610 Trades 2018.04.27 22:14:59   deal #12 sell 1.618K WMT.US-d at 85.830 done (based on order #12)
QN 0 21:57:24.610 Trade 2018.04.27 22:14:59   deal performed [#12 sell 1.618K WMT.US-d at 85.830]
NR 0 21:57:24.610 Trade 2018.04.27 22:14:59   order performed sell 1.618K at 85.830 [#12 sell 1.618K WMT.US-d at 85.830]
NM 0 21:57:24.610 Tester final balance 10000.00 EUR
FG 0 21:57:24.618 Tester WMT.US-d,H4: 2153760 ticks, 243 bars generated. Environment synchronized in 0:00:01.484. Test passed in 0:00:29.391 (including ticks preprocessing 0:00:00.235)."

Vielleicht ist das ein Anhaltspunkt auf meinen Fehler?
Hier sieht man auch, dass die final Balance der Start Balance entspricht... Bin ratlos.

Spronk
50
Spronk  

Hm... habe gerade das hier gefunden:

"Die vielleicht größte Veränderung beim Übergang von MetaTrader 4 zu MetaTrader 5 ist die Verwaltung offener Handelsaktivitäten als Positionen. Pro Symbol kann zu jedem Zeitpunkt nur eine Position offen sein und die Größe dieser Position passt sich jedes Mal, wenn Order durch den Broker verarbeitet werden, nach oben oder unten an. Dies entspricht der in den USA eingeführten FIFO-Regel NFA 2-43(b) und passt auch zum Handelsmodus vieler anderer Einheiten wie Termingeschäften, Gütern und Differenzkontrakten."

und weiter

"Damit stellt die positionszentrische Umgebung von MetaTrader 5 den Programmierer, der sich an den Orderverarbeitungsansatz von MetaTrader 4 gewöhnt hat, vor ungewohnte Herausforderungen. Was in MetaTrader 4 einfache Funktionen für die Orderverwaltung waren, wird in MetaTrader 5 komplexer, da mehrere Order zu einer Position verschmolzen werden können, beispielsweise durch mehrere EAs, die mit einem Symbol handeln, oder mehrere Order aus einem EA auf einem Symbol."

Lese mich da morgen mal ein. Scheint genau mein Problem zu sein... 

Spronk
50
Spronk  

Ok, ich habe nun verstanden, dass das Positionshandling in MQL5 völlig anders ist, als in MQL4.

Mein Konto funktioniert nur im Netting Mode. Ich kann also nur eine Position pro Symbol haben. Das erklärt auch, warum meine Positionen immer nur vom Volumen her aufsummiert wurden.

Ich hatte ja gestern schon alles so umgeschrieben, dass ich meine Entries, TPs und SLs selber verwalte und per Market Order (Buy, Sell, je nachdem) ausführe... Das ist für den Live Betrieb natürlich keine schöne Lösung, falls die Verbindung zum Server des Brokers ausfällt, aber das kann ich mir später anschauen.

Was mich umtreibt ist, dass meine Positionen in der Historie zwar alle angezeigt werden und ich dort sehr gut nachvollziehen kann, dass Entries, SLs und TPs richtig ausgeführt werden, aber mein Kontostand bewegt sich kein Stück. In der Backtest Summary zeigt er an, dass ich 8 erfolgreiche Buy Trades abgesetzt hätte (100%), was aber nicht stimmt. Irgendwie scheint er die Positionen nicht zu prozessieren und ich habe keine Ahnung warum. Nutze ich die falschen Funktionen?

Ich eröffne einen Trade über CTrade::Buy()
Ich schließe einen Trade über CTrade::PositionClose();

Sollte sich da im Account nicht irgendwas bewegen?
Sollte ich es lieber mit PositionOpen() statt Buy() probieren?

...bin total genervt von der Art, wie MQL5 das Positionshandling handhabt. Bin nur umgestiegen, weil mein Broker CFDs nur über MT5 und nicht über MT4 anbietet. Naja...

Wäre super, wenn mir jemand einen Hinweis geben kann, warum sich mein Account nicht bewegt. Danke.

Spronk
50
Spronk  

Update:

Ich habe jetzt einfach mal eine Position per CTrade::Buy() eröffnet.
10 Kerzen später schließe ich die Position mit CTrade::PositionClose().

Beide Transaktionen werden in der Historie angezeigt. 1x Buy, 1x Sell, jeweils mit Volumen 1.
Es wird zwar zu unterschiedlichen Preisen gekauft bzw. verkauft, aber an der Account Balance ändert sich nichts.

Keine Ahnung, wie ich hier im MT5 Profite/Verluste aus meinen Positionen realisieren kann. Irgendwie finde ich dazu auch nichts hilfreiches im Netz.
Der letzte Artikel, den ich gelesen habe beschrieb, dass eine Position geschlossen wird, wenn das Gesamtvolumen auf 0 sinkt. 
Das hat aber anscheinend keinen Effekt...

Christian
2095
Christian  
Spronk:

Update:

Ich habe jetzt einfach mal eine Position per CTrade::Buy() eröffnet.
10 Kerzen später schließe ich die Position mit CTrade::PositionClose().

Beide Transaktionen werden in der Historie angezeigt. 1x Buy, 1x Sell, jeweils mit Volumen 1.
Es wird zwar zu unterschiedlichen Preisen gekauft bzw. verkauft, aber an der Account Balance ändert sich nichts.

Keine Ahnung, wie ich hier im MT5 Profite/Verluste aus meinen Positionen realisieren kann. Irgendwie finde ich dazu auch nichts hilfreiches im Netz.
Der letzte Artikel, den ich gelesen habe beschrieb, dass eine Position geschlossen wird, wenn das Gesamtvolumen auf 0 sinkt. 
Das hat aber anscheinend keinen Effekt...

Herje ..der arme Man :-)


Poste doch einfach dein Patienten und dann schau ich mal drüber.

Bitte aber nur wenn es MQL5 ist

Gruß

Spronk
50
Spronk  
Christian:

Herje ..der arme Man :-)


Poste doch einfach dein Patienten und dann schau ich mal drüber.

Bitte aber nur wenn es MQL5 ist

Gruß

Moin,

das hier ist mein Testcode. Die Tick() Funktion wird über die OnTick() Funktion des EAs aufgerufen und zwar bei jedem Start einer neuen Kerze.
Getestet habe ich im H4 Timeframe.

Ich habe noch je einen Screenshot von der Historie und der Account Balance nach dem Test angehangen.

Hoffe du siehst den Fehler :)

Grüße

#include "..\..\..\Include\Trade\Trade.mqh"

class TradeManager
  {

public:
                     
                     TradeManager();
                    ~TradeManager();
                    
                    void Init(int magicNumber);
                    void Tick();
                    
private:
                     CTrade tradeHandler;
                     int count;
                     
                     void CloseOpenPositions();                   
                    
  };
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
TradeManager::TradeManager()
  {
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
TradeManager::~TradeManager()
  {
  
  }
//+------------------------------------------------------------------+
void TradeManager::Tick()
{
   
   if(count == 1)
   {
      this.tradeHandler.Buy(1,_Symbol);
      count++;
   }
   else if(count == 20)
   {
      this.CloseOpenPositions();
      count++;
   }
   else
      count++;
   
}
//+------------------------------------------------------------------+
void TradeManager::Init(int magicNumber)
{
   //--- set MagicNumber for your orders identification
   this.tradeHandler.SetExpertMagicNumber(magicNumber);
   
   //--- order execution mode
   this.tradeHandler.SetTypeFilling(ORDER_FILLING_RETURN);
   
   //--- what function is to be used for trading: true - OrderSendAsync(), false - OrderSend()
   this.tradeHandler.SetAsyncMode(true);
   
   count = 0;
}
//+------------------------------------------------------------------+
void TradeManager::CloseOpenPositions()
{
   int countPositions = PositionsTotal();
   for(int i = 0; i < countPositions; i++)
   {
      this.tradeHandler.PositionClose(PositionGetTicket(i));
   }
}
Dateien:
Positions.PNG 46 kb
Account.PNG 30 kb
Christian
2095
Christian  

Als erstes machst du mal OrderAsync aus

this.tradeHandler.SetAsyncMode(true);

Ich denke nicht das du schnell in den Markt musst. OrderAsync brauchst du nur für spezielle Stratiegien ( Bei CFDs meiner meinung sinnlos da kein DMA zu Markt)

Prpoblem ist hierbei das du KEINE rückmeldung über den Trade bekommst.

Du musst dann den kompletten OnTradeTransaction() Event auswerten um Info über deinen Status der Orders auf dem  Tradeserver zu bekommen.

Siehe hier -> https://www.mql5.com/de/docs/trading/ordersendasync

Des weiteren steht bei dir im Log

deal performed [#2 buy 513.00 WMT.US-d at 99.494]

Aber deine Menge in der Buy function ist 1

 this.tradeHandler.Buy(1,_Symbol);

Da passt was nicht. ( kompletter Code besser ?)


Teste erste mal ohne ...und Berichte...


Gruß

Ps: Schön wäre der komplette Code  damit ich selber das nachvollziehen könnte.

Dokumentation zu MQL5: Handelsfunktionen / OrderSendAsync
Dokumentation zu MQL5: Handelsfunktionen / OrderSendAsync
  • www.mql5.com
"und Nachrichtenausgabemodus in Experten Zeitschrift angeben. Standardmäßig werden alle Elemente angezeigt.\r\n" //| Expert initialization function                                   | //
Christian
2095
Christian  

Des weiteren ist das Konstrukt fehlerhaft


 if(count == 1)
   {
      this.tradeHandler.Buy(1,_Symbol);
      count++;
   }
   else if(count == 20)
   {
      this.CloseOpenPositions();
      count++;
   }
   else
      count++;

Du öffnest so maximal immer nur eine Position

Möchtest aber wenn du 20 offen ( der Zähler count sagt das ja) hast alle schließen .Er kann aber maximal eine schließen.


Der tester Schließt beim Ende selber und da wird eventuell ein BUG im MT sein bei der Berechnung

Nimm das mal alles raus und nur einmal

 this.tradeHandler.Buy(1,_Symbol);


Gruß

Christian
2095
Christian  
Spronk:

Hm... habe gerade das hier gefunden:

"Die vielleicht größte Veränderung beim Übergang von MetaTrader 4 zu MetaTrader 5 ist die Verwaltung offener Handelsaktivitäten als Positionen. Pro Symbol kann zu jedem Zeitpunkt nur eine Position offen sein und die Größe dieser Position passt sich jedes Mal, wenn Order durch den Broker verarbeitet werden, nach oben oder unten an. Dies entspricht der in den USA eingeführten FIFO-Regel NFA 2-43(b) und passt auch zum Handelsmodus vieler anderer Einheiten wie Termingeschäften, Gütern und Differenzkontrakten."

und weiter

"Damit stellt die positionszentrische Umgebung von MetaTrader 5 den Programmierer, der sich an den Orderverarbeitungsansatz von MetaTrader 4 gewöhnt hat, vor ungewohnte Herausforderungen. Was in MetaTrader 4 einfache Funktionen für die Orderverwaltung waren, wird in MetaTrader 5 komplexer, da mehrere Order zu einer Position verschmolzen werden können, beispielsweise durch mehrere EAs, die mit einem Symbol handeln, oder mehrere Order aus einem EA auf einem Symbol."

Lese mich da morgen mal ein. Scheint genau mein Problem zu sein... 

Ist eigentlich ganz einfach :

MT5:


Konto Art noHedge:


   Buy 0.1 EURUSD

   Buy 0.1 EURUSD

   Buy 0.1 EURUSD


      Offene Positionen  =    1 x 0,3 EURUSD


Konto Art Hedge:


   Buy 0.1 EURUSD

   Buy 0.1 EURUSD

   Buy 0.1 EURUSD


     Offene Positionen  =   

                   1 x 0,1 EURUSD

                  1 x 0,1 EURUSD

                  1 x 0,1 EURUSD


Gruß

123
Einloggen oder registrieren, um einen Kommentar zu schreiben