Zum Inhalt springen
View in the app

A better way to browse. Learn more.

#T/N/X/T

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Strategietester bleibt einfach stehen

Geschrieben

Houston, habe ein Problem!

 

Bin mir nicht sicher, ob ich im Einsteigerthread richtig bin, in den Experts-Thread komm ich aber leider nicht rein.

 

Also...

 

Bin dabei meinen EA mit dem Strategietester zu testen. Das funktioniert soweit recht gut, es gibt allerdings zwei Stellen,

da stellt der Tester ganz einfach seine Arbeit ein.

Der EA läuft auf M5 Basis. Ich teste ihn mit EURUSD-Kursen von Maerz 2010 im visuellen Mode.

Am und am 1.3.10 12:42:20 und 26.3.10 14:49:45 bleibt der Test hängen, d.h. der Vortschrittsbalken bleibt stehen und es

werden keine neuen Bars mehr im Chart gezeichnet. Teste ich zwischen 2.3 und 25.3. hab ich kein Problem.

 

Ich hab jetzt mal soweit möglich debuggt, d.h. mir in Ausgabefiles an verschiedenen Positionen des EAs Werte ausgeben

lassen um rauszufinden, wo ich hängen bleib und bin dabei auf folgendes gestossen:

 

Start()
 ...
     if (Bedingung für Signalberechnung)
     {
     	Ausgabe in Log-File1a   
     	CalculateSignal();      //liefert die Long- und Short-Einstiegsschwellen
     	Ausgabe in Log-File1d     
       EvaluateSignal();       //wertet die Einstiegsschwellen aus setzt EA_OrderToPlace, ORDERINPRICE, ORDERSL_INIT und ORDERTYPE
     } 
 ...

 

Dabei stell ich fest, dass ich zu besagtem Zeitpunkt immer in die Funktion CalculateSignal() rein, aber nichtmehr

raus springe.

Also hab ich die Ausgabe in's Log-Fiel um CalculateSignal() erweitert.

 

void CalculateSignal()
{
/*Diese Funktion liefert LongThresh und ShortThresh zurück, die dann in der Funktion EvaluateSignal ausgewertet werden*/
  LongThresh  =iCustom(Symb,M5,"Indikatorname",Parameter,1,1); 
  Ausgabe in Log-File1b         
  ShortThresh =iCustom(Symb,M5,"Indikatorname",Parameter,2,1);
  Ausgabe in Log-File1c
  return(0);
}

 

Zusätzlich generiere ich mir noch bei jedem Indikatoraufruf ein Log-File um zu sehen, ob der Indikator sauber abgearbeitet wird.

Über eine Globale Variable lass ich einen Zähler mitlaufen, der bei jedem Start-Durchlauf des EAs um 1 hochgezählt wird

und den ich zur Synchronisation in alle Log-Files mitausgebe.

In die Log-Files lass ich mir auch noch die Werte von LongThresh und ShortThresh ausgeben, um zu sehen ob hier etwas

merkwürdiges passiert.

 

Das Ergebnis ist, das Programm gibt noch die Ausgabe Log-File1c aus 1d erscheint dann aber nichtmehr.

D.h. die Funktion CalculateSignal() wird bis zum Ende durchlaufen, das Programm springt aber nichtmehr zurück

zu Start().

 

Ich hab auch noch folgendes probiert:

*historische Daten über "Vollständige Historie" gecheckt, ob die Kurse zu besagten Zeitpunkten merkwürdig sind ==> alles normal

*visuellen Modus abgeschaltet ==> Problem bleibt bestehen

*Funktion CalculateSignal() auskommentiert ==> dann funktionierts

*Funktion EvaluateSignal() auskommentiert ==> Problem bleibt bestehen

*return(0) in Funktion CalculateSignal rausgenommen ==> Problem bleibt bestehen

 

Ich hab also ein Problem in der Funktion CalculateSignal(), mir gehen aber langsam die Ideen aus, was ich noch probieren könnte.

Fakt ist, der Indikator funktioniert, wenn ich ihn nur in einem Chart anzeigen lasse und alle ausgegebenen Werte scheinen plausibel zu sein.

 

Hat irgendjemand eine Idee, welcher Umstand in einem Programm den Strategietester dazu bringt seine Arbeit einzustellen?

 

Vielen Dank,

Wogo

Featured Replies

Geschrieben

Sind „Ausgbe in Log-File1b“ Kommentare von dir? Oder steht das so in deinem Code?

 

Arbeitet dein Indikator in einem anderen TimeFrame da du dort speziell M5 angegeben hast.

„ShortThresh =iCustom(NULL, 0, "Indikatorname ",Parameter ,2,1);“ //Sollte aber eigentlich keinen Unterschied machen...

 

Du weisst schon dass der Indikatorbuffer bei 0 anfängt.

0-7

Wenn dein „Indikatorname“ nur 2 Bufferlinien hat so wären

LongThresh =iCustom(NULL,0,"Indikatorname",Parameter,0,1);

ShortThresh =iCustom(NULL, 0, "Indikatorname ",Parameter ,1,1);

besser geeignet.

Bei einer void-Funktion ist return(0) unnötig //das ist aber ehr eine Nebensache

 

Sorry ich kenne deinen Wissenstand über das coden nicht deswegen muss ich mit solchen kleinen Sachen anfangen.

 

Falls du dich jedoch mit MT4 auskennst so könntest du eventuell mit MT4-Spreads rumspielen und da gibt es noch eine andere Möglichkeit warum der in bestimmten Zeiten sich aufhängt.

Wenn du die Symbol.sel von einem anderen Anbieter bzw. eine die zu sehr von dem anderen 2 dazugehörigen Dateien unterscheidest nimmst so tritt genau dieser Fehler auch auf da er bei bestimmten Historybalken in Konflikt gerät.

Geschrieben
  • Autor
Sind „Ausgbe in Log-File1b“ Kommentare von dir? Oder steht das so in deinem Code?

 

Das ist nur ein Kommentar für das Forum. Im Code steht hier ein FileWrite-Anweisung mit der ich dann in ein csv-file schreibe.

 

Arbeitet dein Indikator in einem anderen TimeFrame da du dort speziell M5 angegeben hast.

„ShortThresh =iCustom(NULL, 0, "Indikatorname ",Parameter ,2,1);“ //Sollte aber eigentlich keinen Unterschied machen...

 

Nein, der Indikator arbeitet schon im selben Timeframe. Die M5 stammen noch aus der Phase, wo ich die Funktion debuggt hab.

Hab ich vergessen rauszunehmen, sollte aber wie du schon sagst keinen Einfluss haben.

 

 

Du weisst schon dass der Indikatorbuffer bei 0 anfängt.

 

Ja schon. Der Indikator selbst benutzt 7 Buffer. 0 bereitet das Signal auf, 1 und 2 dienen als Long/Short-Einstiegsschwellen und werden

im EA verwendet 3-6 dienen der Trenderkennung und als Stop-Schwellen, werden aber im EA nicht verwendet.

 

Bei einer void-Funktion ist return(0) unnötig //das ist aber ehr eine Nebensache

 

Ja, das hatte ich anfangs auch nicht drin. Hab's nur beim Rumprobieren mal eingefügt...

 

Sorry ich kenne deinen Wissenstand über das coden nicht deswegen muss ich mit solchen kleinen Sachen anfangen.

Nun, ich hab früher beruflich programmiert, so dass ich mich hierzu schon auskenne. Mit MQL befass ich mich aber erst seit ein paar Monaten und

hab hier sicher noch viele Wissenslücken.

 

Falls du dich jedoch mit MT4 auskennst so könntest du eventuell mit MT4-Spreads rumspielen

 

Soweit reicht mein Wissen leider nicht. Kannst du das kurz erklären?

und da gibt es noch eine andere Möglichkeit warum der in bestimmten Zeiten sich aufhängt.

Wenn du die Symbol.sel von einem anderen Anbieter bzw. eine die zu sehr von dem anderen 2 dazugehörigen Dateien unterscheidest nimmst so tritt genau dieser Fehler auch auf da er bei bestimmten Historybalken in Konflikt gerät.

.

Hmm, eine Symbol.sel kann ich im Installationsverzeichnis garnicht finden. Ich benutze das XTB-Installationspacket und hab dabei auch nichts verändert

Wo sollte diese Datei denn sein?

Geschrieben

Wenn du mit dem Spread nicht rumgespielt hast dann vergiss den letzten Absatz.

 

Schreibe doch mal verschiedene

Print ("test1");

Print ("test2");

...

Print ("testn");

 

in deinem EA bzw Indikator um die genaue Stelle zu filtern wo dein System sich aufhängt.

Das müsste doch dann die letzte Zeile im Log aufzeigen ;-)

Ganze Zeilen auszukommentieren finde ich ehr ungeeignet für so eine Fehlersuche.

Geschrieben
  • Autor
Schreibe doch mal verschiedene

Print ("test1");

Print ("test2");

...

Print ("testn");

 

in deinem EA bzw Indikator um die genaue Stelle zu filtern wo dein System sich aufhängt.

 

Naja, das ist eigentliche genau das, was ich mit meinen FileWrite()-Anweisungen gemacht hab.

Hab's der Einfachheithalber nochmal mit Print gemacht:

 

...

13:29:11 2010.03.01 12:39 EA_Wogo_Markttechnik_201004 EURUSD,M5: 14VorCalculateSignal

13:29:11 2010.03.01 12:39 EA_Wogo_Markttechnik_201004 EURUSD,M5: 14In CalculateSignal vor 2. Aufruf von iCustom

13:29:11 2010.03.01 12:39 EA_Wogo_Markttechnik_201004 EURUSD,M5: 14In CalculateSignal nach 2. Aufruf von iCustom

13:29:11 2010.03.01 12:39 EA_Wogo_Markttechnik_201004 EURUSD,M5: 14Nach CalculateSignal

13:29:11 2010.03.01 12:39 EA_Wogo_Markttechnik_201004 EURUSD,M5: 15VorCalculateSignal

13:29:12 2010.03.01 12:39 EA_Wogo_Markttechnik_201004 EURUSD,M5: 15In CalculateSignal vor 2. Aufruf von iCustom

13:29:12 2010.03.01 12:39 EA_Wogo_Markttechnik_201004 EURUSD,M5: 15In CalculateSignal nach 2. Aufruf von iCustom

 

Der letzte ausgegebene Print-Aufruf ist direkt in der letzten Zeile von CalculateSignal(). Danach sollte CalculateSignal verlassen werden und

Start() weiter abgearbeitet werden.

Der nächste Aufruf wäre dann die Print-Anweisung mit "Nach CalculateSignal".

 

D.h. es ist eigentlich keine Code mehr dazwischen, der schiefgehen könnte.

Aus meiner Programmiererfahrung weiss ich aber, dass man meistens an der falschen Stelle sucht.

Ich werd mir jetzt den Indikator nochmal genauer ansehen, den ich per iCustom aufrufe.

Das verdächtige ist, dass an beiden Stellen, an denen der EA hängen bleibt ein relativ langer Bar zu sehen ist...

Geschrieben
  • Autor

Das echt zum Davonlaufen :twiddle:

 

Bekomme das Problem inzwischen auch für andere Daten als den beiden bisher bekannten.

Hab das Problem jetzt auch eingegrenzt.

 

In meinem Indikator berechne ich den markttechnischen Trend basierend auf einer 1-2-3 Erkennung und schreibe hierbei

die gefundenen lokalen Hochs/Tiefs in einen Buffer.

 

Vom Prinzip her sieht die Struktur des Programmes so aus:

 

int init()
{
  downloadhistory=false;
}

int start()
 {
  counted_bars = IndicatorCounted();
  //---- check for possible errors
  if(counted_bars < 0) return(-1);   
  Index=Bars-counted_bars-1;	 

  if (counted_bars==0 && downloadhistory)
  {  //dieser Codeteil wird nur ausgeführt, wenn beim Chart-Start die historischen Daten noch nachgeladen werden.
  //dabei ergibt nämlich IndicatorCOunted() immer 0
  if(ArraySize(ZigZagBuffer)>0)			 ArrayInitialize(ZigZagBuffer,0.0);
  Print("History wird nachgeladen");
  }
  else
  Print("History OK");
  if (counted_bars==0)				   
  {
  downloadhistory=true;
  }

  while(Index>=0)
  {
//Hier wird der Indikator für alle Bars berechnet

EvaluateMarkttechnik(); //Diese Funktion wertet den Trend aus
Index--;
  }

 

Ich hab festgestellt, dass der Strategietester immer bei dem Durchlauf hängenbleibt, wenn die historischen Daten nachgeladen werden, also

wenn Print("History wird nachgeladen") ausgegeben wird.

Zu diesem Zeitpunkt dauert die Indikatorberechnung natürlich besonders lange, da die While-Schleife nicht nur 1x sondern tausendemale

durchlaufen wird. Zudem hat die Funktion EvaluateMarkttechnik() auch noch for-Schleifen, die dann jeweils auch noch über 100x durchlaufen

werden müssen.

 

Ich vermute mal, der Strategietester kommt zu diesen Zeiten einfach mit der langen Programmlaufzeit nicht zurecht.

 

Ich habe allerdings noch kein Muster erkennen können, wann die historischen Daten nachgeladen werden. Dies scheint auch von den

Parametern abhängig zu sein, die ich meinem Indikator übergebe.

 

Mein Verständnis war immer folgendes:

Ich öffne einen Chart, lade einen Indikator und bis dann alle Balken geladen sind kann IndicatorCounted() mehrmals "0" liefern.

Dann sollte es aber gut sein.

 

Kann mir jemand erklären, nach welchem Muster der Metatrader die Kurshistorie nachlädt?

 

Vielleicht bin ich auch komplett auf dem Holzweg, aber alle Indizien sprechen dafür, dass der geschilderte Umstand mein Problem verursacht...

 

Bin für jeden Tip dankbar.

Geschrieben

Leider kenne ich das Phänomen das MT4 Daten während eines Backtests nachlädt nicht. Aber das liegt vielleicht daran, dass ich kaum im visuellen Modus arbeite, bzw. vorher den Chart im 1-4h Chart durchgehe bevor ich einen Test durchführe.

 

Wie auch immer. Vielleicht führt MT4 das Laden der Historie nicht einmal sondern mehrfach aus wodurch dein System in die Knie geht, also die volle while-Schleife mehrfach abarbeiten will. Evtl. hilft es also einfach die Berechnung beim 'Nachladen' auszusetzen dann verlierst du zwar die älteste Bar aber das sollte eigentlich keine Probleme machen. Du kannst das also vielleicht so testen:

   if (counted_bars==0)				  
  {
  downloadhistory=true;
  } 
  else {
 while(Index>=0)
 { // sonstiger Code
 }
  }

Geschrieben
  • Autor

Hallo Tommyknocker,

 

danke für den Tip.

Das komische ist, ich hab das Problem auch dann, wenn ich nicht im visuellen Modus teste und den Chart nicht

offen habe.

Hab auch schon probiert, ob es was bringt vor dem Test im Chart durch alle Timeframes zu schalten um sicherzugehen,

dass wirklich nichtsmehr nachgeladen wird, das scheint aber keinen Einfluss auf den Strategietester zu haben.

 

Dein Code funktioniert so leider nicht.

Wenn ich bei counted_bars==0 den Indikator nicht berechne, so berechne ich ja nie die komplette History.

Auch beim ersten Durchlauf nicht. :twiddle:

 

Ich werd heute nochmal ausprobieren, ob es was hilft, wenn ich die Anzahl der berechneten Bars begrenze,

also nicht die komplette Historie neu auswerte, sondern nur ein paar hundert Bars.

 

Trotzdem würd ich gerne genauer verstehen wie das mit dem Nachladen der Bars funktioniert.

So komplex ist mein Indikator nun auch wieder nicht, darum versteh ich nicht, dass andere dieses Problem

nicht auch haben. Vielleicht mach ich ja noch irgenwo was falsch...

Geschrieben

Lädt er die History vom Netz neu runter? Wie wäre es mit offline Backtesten mit M1 History bis ein paar Jahre zurück gehen.

Vom Nachladen der History wärend des Tests habe ich leider auch noch nicht erlebt.

Geschrieben
  • Autor
Lädt er die History vom Netz neu runter?

 

Das Problem besteht auch, wenn ich offline teste. Hab jetzt noch die Anzahl der Bars mitgeloggt.

Das frustrierende ist, wenn die Bedingung

counted_bars==0 && downloadhistory

erfüllt ist, sind genau soviele Bars im Chart wie im vorhergehenden Durchlauf. counted_bars wird am Anfang vom Start() über

counted_bars = IndicatorCounted(); aktualisiert.

Irgendwas bringt IndicatorCounted() dazu sporadisch "0" zurückzugeben.

 

Hab jetzt mal mit unterschiedlichen Timeframes und verschiedenen Underlyings getestet. Erst dachte ich, der Effekt tritt bei M1 nicht auf,

dann hab ich meine Indikatorparameter aber eingeengt und schwupps, schon hing er wieder.

 

Es muss also noch irgendein logischer Fehler im Indikator sein. Mittlerweile glaub ich auch, dass das Problem nichts mit IndicatorCounted() zu tun hat,

sondern dass das Null-Setzen hier nur ein zusätzlicher Nebeneffekt des Fehlers ist.

 

Ich such also mal weiter, ächtz :twiddle:

Geschrieben
  • Autor

Hab's gefunden!

 

Man soll halt keine while-Schleife einbauen, bei der (unter sehr seltenen Umständen) die Abbruchbedingung nie erreicht wird. :twiddle:

 

Was hab ich aus der Aktion gelernt?

*Der Strategietester lädt im Betrieb KEINE Bars nach

*Ein Log-file über eine Sekunde Test kann schnell mal 50MB haben

*zum loggen von Daten die FileWrite()-Funktion zu verwenden ist eher unzuverlässig

 

Danke allen, die mitgeholfen haben,

Wogo

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

Account

Navigation

Suche

Suche

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.