Strategietester dreht durch

Einloggen oder registrieren, um einen Kommentar zu schreiben
lindomatic
323
lindomatic  

Hallo,

im Bild anbei sieht man, dass alles gut losgeht: 00:47 ein sell trade, 1:26 ein buy trade, 2:05 wieder einer und die letzte saubere um 2:27.. es soll nur eine Order abgesetzt werden, wenn:

if(signal == "sell" && PositionsTotal()<1) oder wenn

if(signal == "buy" && PositionsTotal()<1)

Das funktioniert ja auch gut, bis 02:48, ab hier werden gleichzeitig buy und sell orders abgefeuert.. Wie kann das?! 

Nach den Bedingungen darf um 02:48 nur eine sell order geplaced werden, die buy ist verkehrt, hier der Code:

void OnTick()
  {
   if(started)
      SimpleTradeProcessor();
   else
      InitCounters();

   if(StopAtDate.Check("2020.04.01", "02:47"))
      DebugBreak();

   double Ask=NormalizeDouble(SymbolInfoDouble(_Symbol,SYMBOL_ASK),_Digits);
   double Bid=NormalizeDouble(SymbolInfoDouble(_Symbol,SYMBOL_BID),_Digits);
   MqlRates PriceInfo[];
   ArraySetAsSeries(PriceInfo,true);
   int PriceData = CopyRates(_Symbol,_Period,0,3,PriceInfo);
   string signal="";
   double myMovingAverageArray[];
   ArraySetAsSeries(myMovingAverageArray,true);
   int movingAverageDefinition = iMA(_Symbol,_Period,20,0,MODE_SMA,PRICE_CLOSE);
   CopyBuffer(movingAverageDefinition,0,0,3,myMovingAverageArray);
   if(PriceInfo[1].close < myMovingAverageArray[1])
      if(PriceInfo[0].close > myMovingAverageArray[0])
        {
         signal = "buy";
        }
   if(PriceInfo[1].close > myMovingAverageArray[1])
      if(PriceInfo[0].close < myMovingAverageArray[0])
        {
         signal = "sell";
        }

Beide Arrays sind so indiziert, dass 0 die aktuelle Kerze und der aktuelle MA ist und 1 die davor. Der Debugger zeigt mir, wie der Chart, dass das Signal "sell" ansteht, das ist korrekt.
Wo kommt die buy order her?
Wieso wird die Abfrage mit "nur wenn PositionsTotal()<1" plötzlich ignoriert?


Otto Pauser
2167
Otto Pauser  

Ohjeh, schon wieder jemand der auf den Typen reingefallen ist, der alles oberhalb der OnTick() löscht. Du hast hoffentlich nichts für eine Ausbildung dort gezahlt!

Prinzipiell sind die Dinge die er da programmiert nicht falsch, aber wie man schnellen MQL5 code schreibt hat er keine Ahnung und auf meine freundlichen Hinweise hat er nicht reagiert.

Der ist total stur und lernresistent.

Poste bitten den kompletten Code und ich reparier dir den. Es ist nicht der Tester der durchdreht!

Christian
3194
Christian  
lindomatic:

Wo kommt die buy order her?


Signal gesetzt aber nicht wieder gelöscht nach Trade-Entry ?

Prüfen mit Debugger .....oder Code her damit Otto nicht wieder im Kreis rotiert :-)

lindomatic
323
lindomatic  
Christian:


Signal gesetzt aber nicht wieder gelöscht nach Trade-Entry ?

Prüfen mit Debugger .....oder Code her damit Otto nicht wieder im Kreis rotiert :-)

lol, nee bei Leuten, die so schlecht Englisch sprechen, zahl' ich nichts. Aber entweder gibt es sehr wenige, die MQL5-Vids machen oder der macht viel mit G-Ad-Words..
.. war jedenfalls hilfreich, schnell die Syntax für den iMA zu finden.. das ist ja nicht allzuviel von ihm, bin sehr gespannt, was da diesen Fehler versursacht!

hier der Code, das ist nun ein paar Monate gewachsen und einige Ideen und Versuche schießen darin quer.. :
Hmm.. max 64000 Zeichen.. "C64 für Profis" habe ich auch hier liegen.. also als Anhang.

Dateien:
lindomatic
323
lindomatic  
Otto Pauser:

Ohjeh, schon wieder jemand der auf den Typen reingefallen ist, der alles oberhalb der OnTick() löscht. Du hast hoffentlich nichts für eine Ausbildung dort gezahlt!

Prinzipiell sind die Dinge die er da programmiert nicht falsch, aber wie man schnellen MQL5 code schreibt hat er keine Ahnung und auf meine freundlichen Hinweise hat er nicht reagiert.

Der ist total stur und lernresistent.

Poste bitten den kompletten Code und ich reparier dir den. Es ist nicht der Tester der durchdreht!

Code ist unten angehängt, aber ich wünsche Dir erstmal ein schönes Wochenende.

lindomatic
323
lindomatic  
Christian:


Signal gesetzt aber nicht wieder gelöscht nach Trade-Entry ?

Prüfen mit Debugger .....oder Code her damit Otto nicht wieder im Kreis rotiert :-)

nein, das Signal ist gar nicht da und es sollte gar nicht gegeben werden, ich erkenne den Grund zur Order nicht und bin sehr gespannt auf Ottos Fix!

Otto Pauser
2167
Otto Pauser  
lindomatic:

nein, das Signal ist gar nicht da und es sollte gar nicht gegeben werden, ich erkenne den Grund zur Order nicht und bin sehr gespannt auf Ottos Fix!

Ich glaub ich hab da zu viel versprochen. Der Code ist, entschuldige, schrecklich und unübersichtlich.

Ich stelle ein Beispiel auf Basis des Codefragments rein, wie das prinzipiell geht.Umschreiben (besser neu schreiben) musst du dir das selbst :(

Kann ich aber erst Montag oder Dienstag reinstellen weil ich an meinem 'Ding' über's Wochenenden was verbessern möchte.

Bis dahin: Schönes Wochenende!

PS: Home Office ist perfekt zum Traden ;)

Christian
3194
Christian  
lindomatic:

nein, das Signal ist gar nicht da und es sollte gar nicht gegeben werden, ich erkenne den Grund zur Order nicht und bin sehr gespannt auf Ottos Fix!

Ich hab abgewartet bis Otto was sagt. Den Code bin ich teils durchgegangen. Werde gleich was dazu sagen

Wollte da jetzt nicht Zwischenfunken. Erstmal Kaffee damit das Hirn Betriebstemperatur bekommt.
Christian
3194
Christian  
lindomatic:

Wieso wird die Abfrage mit "nur wenn PositionsTotal()<1" plötzlich ignoriert?

Die Abfrage wird nicht ignoriert.


Du hast ein Ablaufproblem wo ein Zeitpuffer fehlt.

Bei dir werden die Trades regulär geschlossen aber bevor der nächste geöffnet wird fehlt ein Zeitpuffer.

Das sieht man schon ohne Debugger:


Es werden innerhalb einer Sekunde 4 Trades ausgeführt !

Du musst vor dem TradeEntry als Bedingung einen Zeitpuffer machen.

Über IsNewBar() oder ähnliches.

Es steht quasi ja schon da ist aber ausgeklammert. Ob es funktioniert habe ich jetzt nicht geprüft.


Des Weiteren steht die Frage warum der Trade so schnell geschlossen wird.

Ursachen sind oft zu enge stopps.



Noch was zum Code:


Gehe sparsam mit Print() um . Eben beim Test war die Log Datei mal eben 4 GB !

Nutze Debug Schalter wie sowas hier

input bool DebugLog = false;



OnTick()

  if (DebugLog) Print("..........")

    

So kannst du auch mal schneller Testen ohne die Ausgaben.

Das CTrade Objekt brauchst du auch nur einmal. Solche Objekte sind groß im Hintergrund

Aber das nur am Rande.

Carl Schreiber
Moderator
9919
Carl Schreiber  

Ich selber nehme (immer noch) einen bestehenden EA und ändere ihn dann Stück für Stück, damit ich jeden meiner Schritte auf Fehler prüfen kann, so ab, wie ich das will.

Ich halte das für mich für den schnellsten und einfachsten Weg, aber auch und besonders für Neulinge.

Christian
3194
Christian  
Carl Schreiber:

Ich selber nehme (immer noch) einen bestehenden EA und ändere ihn dann Stück für Stück, damit ich jeden meiner Schritte auf Fehler prüfen kann, so ab, wie ich das will.

Ich halte das für mich für den schnellsten und einfachsten Weg, aber auch und besonders für Neulinge.

Ich finde die Arbeitsweise von einigen wie auch @lindomatic genau richtig.

Man erkennt das vieles schnell verstanden wird. Egal wie "wild" der Code auch aussieht.

Und genau so arbeite ich heute noch mit dem Unterschied das ich nach dem Prototyp dann den Code mit Struktur und System neu schreibe.

Der Vorteil in meinen Augen ist:

Schnelles erstellen eines Prototyps, ausloten der Fähigkeiten, und am Ende ist dann doch der "richtige" Code da.

Aber darüber kann man eine Menge Philosophieren und jeder entwickelt einen eigenen Stil beim Programmieren.

lindomatic
lindomatic
  • www.mql5.com
Hat das Thema Strategietester dreht durch hinzugefügt Hallo, im Bild anbei sieht man, dass alles gut losgeht: 00:47 ein sell trade, 1:26 ein buy trade, 2:05 wieder einer und die letzte saubere um 2:27.. es soll nur eine Order abgesetzt werden, wenn: if(signal == "sell" && PositionsTotal()<1) Hat das Thema Und noch1x: GetPositionProperties...
Einloggen oder registrieren, um einen Kommentar zu schreiben