Nutzung mehrere onInit Aufrufe?

 

Hallo.

Ich habe eine vielzahl an Dateien, welche eigene Funktionen beinhalten. Diese Dateien binde ich zu oberst in die mq5 Datei ein

"
#include <../Experts/include/my_functions1.mqh>

#include <../Experts/include/my_functions2.mqh>

..."


Nun habe ich in der mq5 Datei die onInit() Funktion. Ich benötige aber diese Funktion auch innerhalb der inkludierten Dateien. Der simple Aufruf dort führt zu zur Fehlermeldung "'__OnInit' - function already defined and has body".

Google brachte mich nur auf folgenden Ansatz:

in der eingebundenen .mqh-Datei jeweils

int OnInit()
{
   Print("onInit aus includedatei1..2..3..");
   //tu was

   int main_file_init = __OnInit();   
   return main_file_init;
}
#ifndef OnInit 
#define OnInit __OnInit
#endif

und in .mq5 Datei

int OnInit()
{
   Print("I am the OnInit func in the main file.");
   return(INIT_SUCCEEDED);
}

Wenn ich das nur mit 1 inkludierten Datei machen geht es sobald es aber mehr sind ist das Ergebnis/der Fehler der/das Gleiche.

Wie kann ich noch zum Ziel kommen die onInit() Funktion in den verschiedenen inkludierten Dateien zu nutzen?


Dokumentation zu MQL5: Konstanten, Enumerationen und Strukturen / Kodes der Fehler und Warnungen / Kompilierungsfehler
Dokumentation zu MQL5: Konstanten, Enumerationen und Strukturen / Kodes der Fehler und Warnungen / Kompilierungsfehler
  • www.mql5.com
Kompilierungsfehler - Kodes der Fehler und Warnungen - Konstanten, Enumerationen und Strukturen - Nachschlagewerk MQL5 - Nachschlagewerk über die Sprache des algothitmischen/automatischen Handels für MetaTrader 5
 

Das würde ich in OnInit() im EA machen und nicht mit mehreren _OnInit()-Funktionen.

Dort mit if (oder case) die versch. Funktionen aufrufen, die entweder alles anders heißen, oder denen jeweils andere Parameter übergeben werden.

 
ReLor:

Ich habe eine vielzahl an Dateien, welche eigene Funktionen beinhalten. Diese Dateien binde ich zu oberst in die mq5 Datei ein

Wie kann ich noch zum Ziel kommen die onInit() Funktion in den verschiedenen inkludierten Dateien zu nutzen?


Wenn die Dateien eingebunden sind stehen sie ja quasi alle auf dem selben "Blatt" und können aus OnInit aufgerufen werden.

Man kann auch die Inhalte von OnInit von außerhalb aufrufen indem man diese in einer extra Funktion zusammenfasst:

 OnInit()
{
CallInitFunctions();
return(INIT_SUCCEEDED);
}

OnDeinit(){}

OnTick(){}

void CallInitFunctions ()
{
//hier werden die zuvor in OnInit enthaltenen Funktionen ausgelagert. CallInitFunctions () kann 
//auch von außerhalb aufgerufen werden.
}

 
pennyhunter #:
Wenn die Dateien eingebunden sind stehen sie ja quasi alle auf dem selben "Blatt" und können aus OnInit aufgerufen werden.

Man kann auch die Inhalte von OnInit von außerhalb aufrufen indem man diese in einer extra Funktion zusammenfasst:

OnInit()
{
CallInitFunctions();
return(INIT_SUCCEEDED);
}

OnDeinit(){}

OnTick(){}

void CallInitFunctions ()
{
//hier werden die zuvor in OnInit enthaltenen //Funktionen ausgelagert. CallInitFunctions ()
//kann auch von außerhalb aufgerufen werden.
}

Ja, ich denke das genau ist der Weg. Da ich die Daten bewusst in einzelnen Datei stehen habe möchte ich so wenig wie möglich in die EA Datei schreiben. Danke für den  Gedankenanstoß!
 

ich versteh gerade das problem nicht


ich hab die Funktion x in einer .mqh Datei liegen

diese Funktion kann ich im gesamten code verwende, sogar in anderen .mqh Dateien wenn diese richtig verknüpft sind

 

OnInit() hat nichts in include Dateien verloren.

Der Einzige Zweck ist das beim Programmaufruf diverse Checks eingebaut werden können und das Hauptprogramm nicht startet falls ein check false ergibt.

 
Die Zugrundeliegende Proga
Christian #:

OnInit() hat nichts in include Dateien verloren.

Der Einzige Zweck ist das beim Programmaufruf diverse Checks eingebaut werden können und das Hauptprogramm nicht startet falls ein check false ergibt.

Aufgrund meiner Programmstruktur führt es am Ende genau dazu, jedoch haben in meinem Fall die Funktionen welche nun zentral in der EA Datei eingebunden werden, genau den von Dir genannten Zweck - also am Ende alles gut ;-)
Grund der Beschwerde: