Klassenübergreifende Variablen

 

Guten Tag,

Ich baue mein Projekt derzeit um, da es zu groß für eine Datei geworden ist. Das klappt auch so weit gut. Ich bekomme es bloß nicht hin Variablen Klassen übergreifend ab zu fragen. Z.b. möchte ich in einer Nebenklasse Variablen aus meiner Hauptklasse abfragen. Habe aber keine Ahnung wie.

-Danke im Vorraus.

 
Dokumentation zu MQL5: Grundlagen der Sprache / Variablen / Sichtbereich und Lebensdauer der Variablen
Dokumentation zu MQL5: Grundlagen der Sprache / Variablen / Sichtbereich und Lebensdauer der Variablen
  • www.mql5.com
Variable, die ausser aller Funktionen erklärt wurde, wird in globalen Sichtbereich eingestellt.Zugang zu diesen Variablen kann aus jedem Programmplatz erfolgen. Solche Variablen befinden sich im globalen Pool des Speichers, darum faellt ihre Lebensdauer mit der Programmlebensdauer. Variable, erklärt innerhalb des Blocks (Codeteil in...
 
Carl Schreiber:
Globale Variablen?

Also brauch ich nicht "extendet" verwenden?

Muss ich die Variablen dann in jeder Klasse neu definieren?

Etwa so?:

class WriteParameters{
   private:
      double MA_Weight[5][2];
      double RSI_Weight[5][2];
      double CCI_Weight[5][2];
      double ADX_Weight[5][2];
      int IndicatorCombinerArray_MA[9999][4];
      int IndicatorCombinerArray_RSI[9999][4];
      int IndicatorCombinerArray_CCI[9999][4];
      int IndicatorCombinerArray_ADX[9999][3];
      int IndicatorCombinerCounter[4];
      string PROG_NAME;
      string PROG_VERSION;
      enum IndicatorName{
         E_MA=0,
         E_RSI=1,
         E_CCI=2,
         E_ADX=3,
      };
   public:
      bool WriteParameterCombination(IndicatorName name,int MagicNumber);
};
 
Marius May:

Guten Tag,

Ich baue mein Projekt derzeit um, da es zu groß für eine Datei geworden ist. Das klappt auch so weit gut. Ich bekomme es bloß nicht hin Variablen Klassen übergreifend ab zu fragen. Z.b. möchte ich in einer Nebenklasse Variablen aus meiner Hauptklasse abfragen. Habe aber keine Ahnung wie.

-Danke im Vorraus.

Ich hab das folgendermaßen gemacht:

1. Eine CTradeExt klasse erstellt die von CTrade abgeleitet ist. CTradeExt bedeutet bei mir eine erweiterte CTrade klasse.

2. Jeder Modul verwendet diese CTradeExt.mqh (#include)

3. Methoden aller Klassen dürfen auch Funktionsnamen wie OnInit, OnTick, etc besitzen

4. Alle Definitionen die du benötigst kommen in diese CTradeExt.mqh

5. Schreib alles modular, dadurch kannst du die einzelnen Module leicht austauschen. Wie TP, SL, Trailing, usw.

Das wichtigste hätte ich fast vergessen: Deklariere die Instanz IN dieser mqh, dadurch können alle Module auf diese Instanz zugreifen.
Bedenke daß der Constructor nur EINMAL ausgeführt wird und bau OnInit() Funktionen ein! Das wär ein Thema für sich. MQL hat schon auch seine Eigenheiten!

Weitere Fragen beantworte ich gerne, Ein Beispiel der TradeExt.mqh häng ich hier dran.

Ich sollt ein Buch schreiben oder eine YT Kanal betreiben, leider fehlt mir die Zeit.

Dateien:
 
Marius May:

Also brauch ich nicht "extendet" verwenden?

Muss ich die Variablen dann in jeder Klasse neu definieren?

Du brauchst das nur einmal definieren. Wofür soll "extended" stehen? Hab ich noch nie gebraucht.

 
Otto Pauser:

Du brauchst das nur einmal definieren. Wofür soll "extended" stehen? Hab ich noch nie gebraucht.

sry, nicht "extendet", sonder "extern"

https://www.mql5.com/de/docs/basis/variables/externvariables

Dokumentation zu MQL5: Grundlagen der Sprache / Variablen / Extern Variablen
Dokumentation zu MQL5: Grundlagen der Sprache / Variablen / Extern Variablen
  • www.mql5.com
wird verwendet, um Identifikatoren der Variablen als Identifikatoren statischer Speicherklasse mit globaler Lebensdauer zu erklären. Solche Variable existieren seit Anfang der Programmdurchführung und für sie wird Speicher sofort nach Anfang der Programmdurchführung verteilt und initialisiert. Man kann Programme erzeugen, die aus mehreren...
 
Otto Pauser:

Ich hab das folgendermaßen gemacht:

1. Eine CTradeExt klasse erstellt die von CTrade abgeleitet ist. CTradeExt bedeutet bei mir eine erweiterte CTrade klasse.

2. Jeder Modul verwendet diese CTradeExt.mqh (#include)

3. Methoden aller Klassen dürfen auch Funktionsnamen wie OnInit, OnTick, etc besitzen

4. Alle Definitionen die du benötigst kommen in diese CTradeExt.mqh

5. Schreib alles modular, dadurch kannst du die einzelnen Module leicht austauschen. Wie TP, SL, Trailing, usw.

Das wichtigste hätte ich fast vergessen: Deklariere die Instanz IN dieser mqh, dadurch können alle Module auf diese Instanz zugreifen.
Bedenke daß der Constructor nur EINMAL ausgeführt wird und bau OnInit() Funktionen ein! Das wär ein Thema für sich. MQL hat schon auch seine Eigenheiten!

Weitere Fragen beantworte ich gerne, Ein Beispiel der TradeExt.mqh häng ich hier dran.

Ich sollt ein Buch schreiben oder eine YT Kanal betreiben, leider fehlt mir die Zeit.

Phuu, das sieht nicht schlecht aus, aber mein Programm ist sehr Komplex. Ich brauche in manchen Methoden über 100 Variablen und Arrays und die meisten Dateien haben schon über 1000 Zeilen. Ich glaube ich sehe dann nicht mehr durch. :/

 
Marius May:

Also brauch ich nicht "extendet" verwenden?

Muss ich die Variablen dann in jeder Klasse neu definieren?

Etwa so?:

Mann!

Hinter meinem Link steht links Globale Variablen und dort gibt es ein Beispiel wo und wie sie definiert werden.

Dort gibt es auch noch mehr zu lesen..

 
Carl Schreiber:

Mann!

Hinter meinem Link steht links Globale Variablen und dort gibt es ein Beispiel wo und wie sie definiert werden.

Dort gibt es auch noch mehr zu lesen..

Ich glaub er meint was anderes. Ich denke er will auf gemeisame Klassen zugreifen. Da nützen ihm die Globals nix.
 
Otto Pauser:

Du brauchst das nur einmal definieren. Wofür soll "extended" stehen? Hab ich noch nie gebraucht.

Otto, könnte er nicht ein wenig mogeln?

Beim Erstellen der Nebenklasse den Pointer der Hauptklasse mitgeben und speichern.

Oder geht das bei MQL5 nicht?

Ich weiß, das wirft das OOP - Konzept über den Haufen. Ich mach das öfters mal in MATLAB.

Gerade, wenn man mal das Design der Klassen nicht ganz sauber getrennt hat.
 
Otto Pauser:
Ich glaub er meint was anderes. Ich denke er will auf gemeisame Klassen zugreifen. Da nützen ihm die Globals nix.

Jup, dass ist das Problem(Ich lese es mir aber trotzdem nochmal durch). Jetzt ist mir auch noch aufgefallen das ich die input-variablen nicht in den anderen Klassen verwenden kann. Mir fällt auch echt kein Ansatz ein. 

Mann das nervt richtig. In MQL ist das echt schlecht gelöst. Das geht in anderen Sprachen besser!

Grund der Beschwerde: