Lass Dir jeden(!) Array-Zugriff mit Code-Zeile (__LINE__) und den jew. Werten und Var.-Name mit Comment anzeigen. Stürzt Dein Programm dann deswegen ab, zeigt es als letzten Atemzug genau das, was Du brauchst Deinen Fehler zu ändern ;)
Danke! Ich wusste garnicht, dass das geht. Sehr gut. Das muss ich mir merken.
Ich hab aber jetzt quasi 2 Probleme:
1. die historischen Daten werden im Terminal nicht "rechtzeitig" geladen, um dann für einen ordnungsgemäßen Array-Zugriff zu sorgen. Wenn diese initialen Daten fehlen, versucht der Indikator auf leere Arrays zuzugreifen, was scheitern muss. Bei der nächsten Änderung des Timeframe oder der nächten Initialisierung oder Aktualisierung, weil ich den Code erneut compile, sind die Daten vorhanden, die Arrays gefüllt und die Zugriffe reibungslos. Dann läuft er wieder wie ich es mir vorstelle. Ich versuche, mit Schleifen und 'Sleep(1000);' Wiederholungen und Verzögerungen einzubinden, damit er sich "die nötige Zeit nimmt", das klappt aber nicht. DeepSeek meint, es liegt daran, dass ich es in der 'OnCalculate'-Funktion eingebaut hatte. Also hab ich alles in eine separate Funktion ausgelagert - klappt auch nicht. Obwohl er eigentlich inzwischen 10 Durchlaufversuche machen und jedesmal 1 Sekunde "warten" soll, kommt nach Kompilierung die Fehlermeldung sofort. Er zeigt im Journal dann zwar die korrekte Anzahl der Versuche, es vergehen aber keine 10 Sekunden (was ja deutlich zu merken sein sollte). Wenn die Daten mal da sind - also für ein konkretes Timeframe-Paar, läuft alles. Auch wenn ich mehrere Paare "vorgeladen" hab, also ohne Neustart von MT5 z.B. H4-M5, H1-M5, H1-M15 ausprobiert hab, scheinen die Daten gespeichert zu sein und die Zugriffe flutschen wie im Lehrbuch. Wenn ich "was unvorhergesehenes" mach wie H2-M10 oder ich starte Mt5 neu, ist alles wieder weg und er stürzt beim 1. Laden ab.
2. Die Sache mit den automatischen Tests auf der Plattform, die ich bisher nicht mehr versucht hab, weil ich ja jetzt vor diesem neuen Problem steh.
Mir war ja vorher garnicht klar. dass es so große Unterschiede zwischen Tester und Terminal gibt. Im Tester scheinen die Daten unmittelbar zur Verfügung zu stehen. Da kommt garkeine Fehlermeldung mehr. Da ist "alles so schön bunt hier!" (um mal Nina Hagen zu zitieren). Ich wollt mir schon n Bier aufmachen und den Erfolg feiern. :-D Und dann passieren so unerklärliche Sachen.
Und dann scheint es nochmal Unterschiede zwischen Terminal und Marketplattform zu geben. Is ne verzwickte Angelegenheit. Und eigentlich wollte ich einen EA schreiben, der diesen Indikator als Handelsentscheidungshilfe benutzt. Wie soll das mal werden? Bin ich im autodidaktischen Studium Informatiker, wenn ich das in befürchteten 3 Jahren fertig hab?
Zu 1:
Statt DeepSeek stell den Kursor auf Sleep und drück F1, dann kannst Du lesen: "Die Funktion Sleep() kann aus Nutzerindikatoren nicht aufgerufen werden, .."
Das Vorhandensein der Daten sollte nicht in OnInit() abgefragt werden. Wenn die Funktion, die die hist. Daten lädt, fehlschlägt (weil noch nicht da), melde einen Fehler, verlass die Funktion und warte auf den nächsten Tick.
MT5 kennt nur M1 Daten alles weitere wird aus diesen errechnet.
Wen Du schnell zum Erfolg kommen willst Und das Bier auf danach verschieben kannst), dann such Dir einen Deinem Ziel vergleichbaren Indikator, EA oder Skript, speicher unter einem anderen Namen und ändere das.
Es gibt fast nix(!!), was nicht bereist für MT5 programmiert wurde!! Frag danach mal DeepSeek?
- Freie Handelsapplikationen
- Über 8.000 Signale zum Kopieren
- Wirtschaftsnachrichten für die Lage an den Finanzmärkte
Sie stimmen der Website-Richtlinie und den Nutzungsbedingungen zu.
Hallo liebe Community
Ich bin neu - sowohl in der MQL-Programmierung als auch hier im Forum. Darum verzeiht mir, wenn ich evtl. ein neues Topic öffne, obwohl diese Frage vielleicht schon irgendwo auftaucht. Ich hab jetzt bei meiner Durchsicht nichts passendes gefunden.
Und zwar:
Ich hab einen Indikator in MQL5 geschrieben, der Widerstände und Unterstützungen in einem vom Anwender einzugebenden Timeframe (Input-Variable -> Eingabeparameter) suchen und die "auslösenden Orderblocks" im laufenden Timeframe einzeichnen soll.
Beispiel: der Anwender möchte Widerstände im H4 angezeigt bekommen und stellt das so in den Eingabeparametern ein. Der Indikator läuft im M15. Dort identifiziert er dann die Kerze, die dem High des H4-Widerstands im M15 entspricht und zeichnet ein hübsches Rechteck von High bis Low dieser Kerze. Ursprünglich sollte er initial die gesamte Historie einmal absuchen und OBs einzeichnen. Im Tester ist das ja machbar, weil die Historie nicht so umfangreich ist - hab ich zumindest den Eindruck. Wenn das mal gemacht ist, soll er nur noch kerzenweise aktualisieren.
Läuft bis hierher wunderbar. Im Tester macht er es tadellos, inkl. Löschung invalider Orderblocks und allem, was ich mir vorstelle.
Im Terminal hat er bis heut früh Probleme gemacht. Das hab ich aber in den Griff bekommen, indem ich den initialen Zeitraum von "mach die komplette Historie" auf "mach nur bis 1 Jahr vor Initialisierung" beschränkt hab. Klappt perfekt. Alle ausgegebenen Werte in entsprechenden Print-Ausgaben sind plausibel. Er löst auch hier keine Fehler aus - also kein 'array out of range' oder sonst was. Im Chart sieht man hübsche Rechtecke in den passenden Farben und auf genauere Prüfung hin, sind sie auch alle valide.
Das Problem ist jetzt aber:
Wenn ich versuche, die Datei auf der Plattform hochzuladen, bekomm ich nach der automatischen Testung die Mitteilung, dass der Test mit einem Fehler beendet wurde. Und im Bericht steht dann "2022.05.02. 00:02:30 array out of range". Das kann meiner Meinung nach nicht sein. Das angegebene Datum liegt ja unzweifelhaft länger als 1 Jahr vor der Initialisierung/ dem Versuch, die Datei hochzuladen zurück. Das macht für mich keinen Sinn, weil ich den Zeitraum ja im Code beschränkt hab. Und die KI im Editor ist da keine große Hilfe. Sie sagt immer wieder, ich solle sicherstellen, dass die Zugriffe auf die Arrays fehlerfrei und logisch korrekt implementiert erfolgen oder so. Das ist ja aber der Fall, denn sonst würden ja Tester oder Terminal Fehlermeldungen erzeugen, oder nicht?
Hat da jemand einen Tipp, eine Lösung oder eine Erklärung, mit welchen Daten die Plattform arbeitet, warum sie bei ihren Tests meine Zeitfensterbeschränkung nicht respektiert und/ oder wie ich das Problem behebe?
Was braucht ihr, um der Lösung des Problems näher zu kommen? Soll ich noch Infos teilen oder so? Bin nach den vielen Wochen des Lernens und kodierens ziemlich gefrustet. :-D