Custom Indikator

 
Ich habe einen Benutzer-Indikator in MT5 geschrieben: Name="Kerzenmuster.mq5  Exe: Kerzenmuster.ex5.
INDIKATOR
Der Indikator ermittelt mögliche Kerzenmuster und schreibt dann den Integerwert in das double
array  Patternbuffer[0], mit dem Ziel, das ich diesen Wert im EA abrufen kann.

Die Integerwerte sind definiert mit: 
#define SHOOTING_STAR_LOW           1
#define HANGING_MAN                 4  usw.

Meine Property-Definitionen sehen folgendermaßen aus:
#property indicator_chart_window //also kein eigenes Fenster
#property indicator_buffers   1
#property indicator_plots     1
#property indicator_type1 DRAW_NONE
#property indicator_label1 "Patternbuffer"
Als globale Variable wird dann das array Patternbuffer[] definiert mit:
double Patternbuffer[];

In der Funktion OnInit() erledige ich das indicator butter mapping mit:
SetIndexBuffer(0, Patternbuffer, INDICATOR_CALCULATIONS);
und initialisiere den Patternbuffer mit Patternbuffer[0] = 0;

In der Funktion OnCalculate(..) rufe ich die Funktion
ArraySetAsSeries(Patternbuffer,true);

und ermittle mögliche Kerzenmuster. Wird ein Kerzenmuster gefunden, dann wird der Wert in Patternbuffer[0] geschrieben.


EXPERT-ADVISOR:
Als globale Variable definiere ich die Handle  int handleKM;
In der Funktion  OnInit() erstelle ich die Handle für den Indikator mit:
handleKM = iCustom(_Symbol,PERIOD_CURRENT,"Kerzenmuster.ex5");
In der Funktion  OnTick() habe ich das Array  double Pattern[]; definiert.
Ich führe die Funktion CopyBuffer(handleKM,0,0,1,Pattern) aus um im nächsten Schritt
den Wert des Kerzenmusters abzugreifen, und zwar mit:
Kerzenmuster = (int)Pattern[0].

Die Handle-Erstellung in OnInit() funktioniert fehlerfrei. Aber nach der fehlerfreien Erstellung der Handle
wird folgende Fehlermeldung immer wieder angezeigt:
array out of range in 'Kerzenmuster.mq5'
Was mache ich hier falsch? Ich bin seit zwei Tagen dran und finde keine Lösung.
 
  1. Bei solchen Fehlermeldungen steht auch immer eine Zeilen und eine Zeichennummer dabei. Da weiß man gleich um welches Array es sich handelt.
  2. Ich vermute, dass das Array nicht (richtig) auf 'Größe' gebracht wurde.
  3. Warum so:
    #define SHOOTING_STAR_LOW           1
    #define HANGING_MAN                 4  usw.
    Wenn Du ein enum nimmst kannst Du beim, Ausdruck mit EnumToString die Zahlen als erklärenden Text ausgeben:
    enum japKerze {
       SHOOTING_STAR_LO,
       HANGING_MAN ,
      ...
    ]
    Außerdem kannst Du im Programm dann sagen: if (sig == SHOOTING_STAR_LO ) ...
    Liest sich doch viel besser :)
 
Bitte KEINE Doppel-Posts! Den anderen hab ich gelöscht.
 
Carl Schreiber #:
  1. Bei solchen Fehlermeldungen steht auch immer eine Zeilen und eine Zeichennummer dabei. Da weiß man gleich um welches Array es sich handelt.
  2. Ich vermute, dass das Array nicht (richtig) auf 'Größe' gebracht wurde.
  3. Warum so:
    #define SHOOTING_STAR_LOW           1
    #define HANGING_MAN                 4  usw.
    Wenn Du ein enum nimmst kannst Du beim, Ausdruck mit EnumToString die Zahlen als erklärenden Text ausgeben:
    enum japKerze {
       SHOOTING_STAR_LO,
       HANGING_MAN ,
      ...
    ]
    Außerdem kannst Du im Programm dann sagen: if (sig == SHOOTING_STAR_LO ) ...
    Liest sich doch viel besser :)

Hallo Carl!

Erst mal vielen Dank für die rasche Antwort! Und das an einem Samstag!

Die vollständige Fehlermeldung lautet:   2022.12.03 18:56:11.533 2022.01.03 01:16:02 array out of range in 'Kerzenmuster.mq5' (61,18)

Geben die Werte in den runden Klammen am Zeilenende (61,18) die Zeilennummer und die Zeichennummer an? Ich denke nicht! Ich habe mit Kommentaren

so experimentiert, das in der Zeile 61 immer unterschiedliche Werte stehen. Dennoch ändert sich die fehlerhafte Anzeige nicht.

Sobald ich aber die Handle  

handleKM = iCustom(_Symbol,PERIOD_CURRENT,"Kerzenmuster.ex5");  lösche, ist die Fehlermeldung weg, aber auch die Verbindung zum Indikator. 
 

Seufz, stell einmal den Cursor auf iCustom, drück F1 und schau wir der Aufruf genau aussieht - mit oder ohne ex5?

Die Werte in den Klammern geben Zeile und Zeichen-'Spalte' an.

Wieso probierst Du mit Kommentaren? Löst das Dein Problem?

 
Carl Schreiber #:

Seufz, stell einmal den Cursor auf iCustom, drück F1 und schau wir der Aufruf genau aussieht - mit oder ohne ex5?

Die Werte in den Klammern geben Zeile und Zeichen-'Spalte' an.

Wieso probierst Du mit Kommentaren? Löst das Dein Problem?

int  iCustom( 

   string           symbol,     // Symbolname 

   ENUM_TIMEFRAMES  period,     // Periode 

   string           name        // Ordner/Name_des Benutzerindikators 

   ...                          // Liste der Eingabeparameter des Indikators  

   );


handleKM = iCustom(_Symbol,PERIOD_CURRENT,"Kerzenmuster");

Ich habe keine Eingabeparameter, die ich in eine Liste schreiben könnte.

In der MQL5-Hilfe steht, wenn keine Parameter für die Liste eingetragen werden,

verwendet der Compiler Default-Werte.

Zur Zeilennummer 61:

Die Zeilennummer 61 befindet sich in der Funktion OnInit() und lautet:

long Subtrahend = 0;

Einen Fehler kann ich hier nicht sehen!

 

Zur Zeilennummer 61:

Die Zeilennummer 61 befindet sich in der Funktion OnInit() und lautet:

long Subtrahend = 0;

Einen Fehler kann ich hier nicht sehen!

Das kann eigentlich nicht sein! Also lösch alle Kommentare // und //* .. */ und versuch es erneut.

 
Carl Schreiber #:

Das kann eigentlich nicht sein! Also lösch alle Kommentare // und //* .. */ und versuch es erneut.

Hallo Carl. Sorry, dass ich gestern nicht mehr geantwortet habe. Ich bin buchstäblich vor dem Computer eingeschlafen.

Als ich heute morgen, so gegen 5:00 Uhr, deinen Info mit dem Satz: "Das kann eigentlich nicht sein!" gelesen habe,

erhöhte sich mein Adrenalinspiegel so stark, dass ich den File-Explorer geöffnet habe um die Daten-Struktur im Verzeichnis

Indicators genauer zu betrachten. Da habe ich bemerkt, dass die Datei Kerzenmuster.ex5 zwar richtig vorhanden war, weil ich

sie irgendwann mal dahin kopiert habe. Mein Sourcefile und die zugehörende ex5-Datei lagen aber immer noch im Verzeichnis

...\Indicators\BAUMGARTNER\Kerzen. Ich kopierte also beide Dateien in das Verzeichnis Indicators und schon war die Fehlermeldung

verschwunden.

Ich danke dir für deine Geduld und Hilfe.