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.

Global variables

Geschrieben

Hallo Freunde des adrenalinbetonten Geldverdienens.

 

Diesmal hätte ich ein paar Fragen zu den Funktionen

GlobalVariableSet

GlobalVariableGet

GlobalVariableTotal

 

Was genau ist der Unterschied zwischen den beiden Funktionen GlobalVariableGet und GlobalVariableTotal.

Wenn ich die Beschreibungen richtig verstehe, dann geben beide Funktionen die Anzahl der bestehenden GV wieder.

Oder gibt "Get" die bestehenden GV wieder und "Total" alle jemals existierenden GV?

 

Und beim Thema GlobalVariableSet:

"datetime GlobalVariableSet( string name, double value)"

Wird in diesem Fall die GV nur unter "datetime" gespeichert oder geht das ganze auch in "double"?

Oder wird dieser Vorgang in etwa so durchlaufen, dass die GV mit drei Daten abgespeichert wird?

Die Zeit, wann sie gespeichert wurde. Der Name, den die GV trägt und ein gespeicherter Wert, den die GV enthält.

 

...oder vll doch Variante C: der berühmte Holzweg :nictation:

 

lg NC

Featured Replies

Geschrieben

Hallo Freunde des adrenalinbetonten Geldverdienens

 

Eindeutig Quote of the week!

:nictation:

 

 

 

€dit: Sorry das ich nicht mehr dazu beitragen kann ... :door:

Geschrieben

Nur um sicherzustellen, daß wir vom selben Reden:

 

MQL hat zwei total unterschiedliche "globale" Variablen, die nichts miteinander zu tun haben:

 

globale Variablen im Code sind diejenigen, die jeder normale Coder auch so versteht: eben Variablen die im kompletten Script existieren.

 

Das was du hier ansprichst sind auch globale Variablen, aber nicht deswegen weil sie im kompletten Script existieren (das tun sie auch garnicht), sondern weil man mit den von dir genannten Funktionen aus verschiedenen Scrips/EAs/Indikatoren darauf zugreifen (erstellen/lesen/schreiben/löschen) kann. Um nicht durcheinander zu kommen nenne ich diese Art "Terminal Variablen" weil sie eben quasi im MT4-Terminal gespeichert werden ( mit F3 kannst dir die Liste anzeigen lassen).

 

Was genau ist der Unterschied zwischen den beiden Funktionen GlobalVariableGet und GlobalVariableTotal.

Wenn ich die Beschreibungen richtig verstehe, dann geben beide Funktionen die Anzahl der bestehenden GV wieder.

Oder gibt "Get" die bestehenden GV wieder und "Total" alle jemals existierenden GV?

 

GlobalVariableSet() schreibt die TerminalVariable

GlobalVariableGet() liest die TerminalVariable aus

GlobalVariableTotal() hab ich noch nicht benutzt; sollte dir aber die Anzahl der aktuell existierenden TerminalVariable liefern

 

Und beim Thema GlobalVariableSet:

"datetime GlobalVariableSet( string name, double value)"

Wird in diesem Fall die GV nur unter "datetime" gespeichert oder geht das ganze auch in "double"?

Oder wird dieser Vorgang in etwa so durchlaufen, dass die GV mit drei Daten abgespeichert wird?

Die Zeit, wann sie gespeichert wurde. Der Name, den die GV trägt und ein gespeicherter Wert, den die GV enthält.

 

Jede TerminalVariable hat einen Namen und einen Wert (TerminalVariablen sind IMMER double). Wenn du also ein DateTime zu einem Wert speichern willst mußt du das aufteilen in:

 

GlobalVariableSet( variable1_value, value1 );

GlobalVariableSet( variable1_datetime, datetime );

 

Zu beachten ist: datetime muß im Format "Sekunden seit 01.01.1980(oder so)" vorliegen, da es als String (10.09.2010 15:25:00) nicht gespeichert werden kann.

 

==> EDIT: DateTime muß in TimeCurrent() vorliegen

Geschrieben
  • Autor

Nur um sicherzustellen, daß wir vom selben Reden:

jup, wir reden vom selben Thema :nictation:

Jede TerminalVariable hat einen Namen und einen Wert (TerminalVariablen sind IMMER double). Wenn du also ein DateTime zu einem Wert speichern willst mußt du das aufteilen in:

 

GlobalVariableSet( variable1_value, value1 );

GlobalVariableSet( variable1_datetime, datetime );

Mich hat die Erläuterung im MT4 ein wenig verunsichert.

Dort steht "datetime GlobalVariableSet(string name,double value)".

Habe jetzt aber auch geschnallt, warum dort DateTime steht.

Wenn die Funktion erfolgreich durchgeführt wurde, dann wird die Uhrzeit wiedergegeben an dem es funzte...

 

Und um nochmal kurz das frisch erlangte Wissen abzugleichen, dann ist die Funktion GlobalVariableSet() in etwa das Gleiche wie die Funktion OrderSend() oder OrderModify().

Die Daten in den Klammern werden weitergegeben und verarbeitet. In unserem Fall also gespeichert :door:

 

Danke Dir dann für die Hilfe und wenn ich noch Fragen haben sollte, dann meld ich mich im Forum.

 

lg und schönes WE

NC

 

@Rumpel

Passt schon... :door:

Geschrieben

Mich hat die Erläuterung im MT4 ein wenig verunsichert.

Dort steht "datetime GlobalVariableSet(string name,double value)".

Habe jetzt aber auch geschnallt, warum dort DateTime steht.

Wenn die Funktion erfolgreich durchgeführt wurde, dann wird die Uhrzeit wiedergegeben an dem es funzte...

 

Und um nochmal kurz das frisch erlangte Wissen abzugleichen, dann ist die Funktion GlobalVariableSet() in etwa das Gleiche wie die Funktion OrderSend() oder OrderModify().

Die Daten in den Klammern werden weitergegeben und verarbeitet. In unserem Fall also gespeichert :door:

 

zu oben: Genau so ist es.

 

zu unten: :-) Das einzige, was diese Funktionen "gleich" haben ist, daß sie Funktionen sind. Aber ich versteh schon was du meinst: GlobalVariableSet() "tut" eine Variable schreiben

und: OrderSend() "tut" eine Order an den Broker senden :nictation:

Geschrieben
  • Autor

Jetzt habe ich vielleicht nochmal eine kleinere Frage zu dem Thema.

 

Wenn ich eine "bool"-Funktion ausführen lasse, dann gibt die am Ende "true" oder "false" wieder.

Kann ich da jetzt innerhalb dieser "bool"-Funktion eine weitere Funktion ausführen lassen?

Das die "bool"-Funktion nicht nur einen der zwei Werte zurück gibt, sondern auch während der Ausführung eine TerminalVariable setzt, um diese dann später auslesen zu lassen.

Oder sollte ich dafür eine "void"-Funktion nehmen um die Variable zu setzen?

 

Als kleines Bsp. meines Vorhabens:

bool Entry_Long()
  {
   //Bezug Wert
   double Var_1 = WertVar_1;
   double Var_2 = WertVar_2;
//----------
   //Berechnung
   if(Var_1>Var_2)GlobalVariableSet("Var_2",Var_2);
   if(Var_1>Var_2)
//----------
   //Ausführung
   return(true);else return(false);
  }

...oder würde diese Art der Ausführung fehlschlagen?

 

lg NC

Geschrieben

Kann ich da jetzt innerhalb dieser "bool"-Funktion eine weitere Funktion ausführen lassen?

Das die "bool"-Funktion nicht nur einen der zwei Werte zurück gibt, sondern auch während der Ausführung eine TerminalVariable setzt, um diese dann später auslesen zu lassen.

Oder sollte ich dafür eine "void"-Funktion nehmen um die Variable zu setzen?

 

Nein, da brauchst du keine zusätzliche void Funktion. Kannst innerhalb deiner bool-Funktion globale Variablen verändern wie du willst.

 

Gegenfrage:

Hast du da ein so kompliziertes System, daß du globale client terminal Variablen brauchst?

Normalerweise brauchst du die nur, wenn du verschiedene EAs synchronisieren willst.

Geschrieben
  • Autor

Ahhh, dann danke ich Dir mal. Werde es dann wahrscheinlich auch so machen :nictation:

 

Naja, schwierig nicht wirklich.

Sind einfach Einstiegsregeln und auch sonst nichts Großes.

Aber das "Low" einer ValueWhenKerze soll auf unbestimmte Zeit(jedoch nicht länger als 2Tage)gespeichert werden.

Wenn ein Indi eine bestimmte Position hat, dann soll aus diesem Bar der Low genommen werden. Wenn dann bspw. ein Bar unter dem Low schließt, dann soll die Position geschlossen werden. Wenn aber der Indikator erneut die besagte Position einnimmt, dann soll die Grenze(Low) verändert werden. Jetzt fällt mir aber spontan keine andere Möglichkeit ein. Vielleicht habe ich auch nicht richtig nachgedacht, da ich das mit den Variablen eh mal probieren wollte.

 

Oder würde Dir spontan etwas einfallen?

 

lg NC

Geschrieben
  • Autor

Jetzt wollte ich mal kurz eine Funktion posten, welche nur für das prüfen, vergleichen, löschen und setzen einer GV verantwortlich ist. Diese muss dann noch passend eingefügt werden. Doch bevor ich das mache, wollte ich mal kurz "drüber schauen" lassen... :nictation:

void TermVar_long()
  {
   //Bezug Wert
   double CCI_1 = iCCI(NULL,CCI_TF,CCI_Periode,CCI_Preis,CCI_Shift);
   double CCI_2 = iCCI(NULL,CCI_TF,CCI_Periode,CCI_Preis,CCI_Shift+1);
//----------
   //Berechnung
   if(CCI_2>Schnittpunkt_Long)
   if(CCI_1<Schnittpunkt_Long)
     {
      if(GlobalVariableCheck("long")==false)
        {
         GlobalVariableSet("long",iLow(NULL,CCI_TF,CCI_Shift));
        }
      if(GlobalVariableCheck("long")==true)
        {
         double var_long = GlobalVariableGet("long");
         if(var_long == iLow(NULL,CCI_TF,CCI_Shift))return;
         if(var_long != iLow(NULL,CCI_TF,CCI_Shift))
           {
            GlobalVariableDel("long");
            GlobalVariableSet("long",iLow(NULL,CCI_TF,CCI_Shift));
           }
        }
     }
//----------
   //Ausführung
   return;
  }

 

lg NC

Geschrieben

Servus Nico,

funtionieren sollte es schon, aber ... :nictation:

Du solltest vielleicht ein paar kleine Optimierungen einbauen :door:

 

Folgender Code macht das gleiche, wie deiner ... :door:

 

void TermVar_long()
  {
   //Bezug Wert
   double CCI_1 = iCCI(NULL,CCI_TF,CCI_Periode,CCI_Preis,CCI_Shift);
   double CCI_2 = iCCI(NULL,CCI_TF,CCI_Periode,CCI_Preis,CCI_Shift+1);
//----------
   //Berechnung
   if(CCI_2>Schnittpunkt_Long && CCI_1<Schnittpunkt_Long)
    		GlobalVariableSet("long",iLow(NULL,CCI_TF,CCI_Shift)); 
//----------
   //Ausführung
   return;
  }

... nur etwas schneller.

 

Zudem wird bei dir der Teil nach der Abfrage

if(GlobalVariableCheck("long")==true)

immer aufgerufen, da du "long" ja vorher schon setzt. Wenn so, dann mit "else" anstelle mit "if(...)"

und wenn du deiner Globalen Variablen einen neuen Wert zuweisen willst, dann mußt du sie nicht vorher löschen.

 

Ach ja, und GlobalVariableSet() funktioniert auch, wenn die Variable vorher noch nicht existiert, du mußt also nicht vorher darauf prüfen.

Geschrieben
  • Autor

Du solltest vielleicht ein paar kleine Optimierungen einbauen :guitar:

Natürlich...freue mich über jede Art von Feedback die mich weiterbringt. :nictation:

Zudem wird bei dir der Teil nach der Abfrage

if(GlobalVariableCheck("long")==true)

immer aufgerufen, da du "long" ja vorher schon setzt. Wenn so, dann mit "else" anstelle mit "if(...)"

Eigentlich wollte ich es mit If-else machen, aber zwecks Lesbarkeit habe ich es dann doch so gemacht.

Macht eine veränderte Schreibweise die Prozesse länger und den EA langsamer?

und wenn du deiner Globalen Variablen einen neuen Wert zuweisen willst, dann mußt du sie nicht vorher löschen.

Also kann ich die bestehende Variable einfach überschreiben ohne sie löschen zu müssen?

Dat is ja gaieeel...

Hatte da etwas Angst, dass mir das System eine "long" und eine "long"1 reinknallt :door:

Ach ja, und GlobalVariableSet() funktioniert auch, wenn die Variable vorher noch nicht existiert, du mußt also nicht vorher darauf prüfen.

ok...dann weiß ich jetzt sehr viel mehr.

 

Danke!

Ab jetzt werde ich mit hoher wahrscheinlichkeit sehr viel öfter damit arbeiten. Das macht nämlich das Speichern oder extrahieren von Daten eines bestimmten Zeitraumes viel viel leichter :door:

 

lg und N8

NC

Geschrieben

Eigentlich wollte ich es mit If-else machen, aber zwecks Lesbarkeit habe ich es dann doch so gemacht.

Macht eine veränderte Schreibweise die Prozesse länger und den EA langsamer?

Es war ein bischen anders gemeint.

Du frägst ab, ob "long" nicht existiert und wenn nicht, dann erzeugst du die Variable.

In der nächsten Anweisung frägst du dann ab, ob sie existiert. An dieser Stelle existiert sie aber auf alle Fälle, da du sie ja eine Zeile darüber erzeugt hast.

D.h. diese If-Abfrage liefert immer true zurück, was dann ja reichlich überflüssig ist.

 

Gruss,

Wogo

Geschrieben
  • Autor

Jetzt weiß ich worauf Du hinaus wolltest...

Habe mir das Alles nochmal durch den Kopf gehen lassen und habe "einstimmig" beschlossen, dass vieles davon unnütz war :birdie:

 

lg NC

  • 1 Monat später...
Geschrieben
  • Autor

Wenn ich beim Laden eines EAs betimmte TermVar setzen möchte, dann sollte es doch eigentlich genügen, wenn ich das Ganze in der Init() verpacke...oder?

(falls jetzt Fragen zu meiner Frage auftauchen sollten:Ich arbeite das erste mal mit Init() :keyboard: )

//============================================================================
void init()
  {
   GlobalVariableSet("THL",0);
   GlobalVariableSet("Kurs_Long",0);
   GlobalVariableSet("TRL",0);
   
   return;
  }
//============================================================================
void deinit()
  {
   GlobalVariableDel("THL");
   GlobalVariableDel("Kurs_Long");
   GlobalVariableDel("TRL");
   
   return;
  }
//============================================================================

Müssen die beiden Funktionen dann nochmal separat bei Start() aufgerufen werden oder werden die beiden Funktionen explizit aufgerufen.

 

lg NC

Geschrieben

Wenn ich beim Laden eines EAs betimmte TermVar setzen möchte, dann sollte es doch eigentlich genügen, wenn ich das Ganze in der Init() verpacke...oder?

Ja, Init() wird ja beim Initialisieren, also wenn du den EA in den Chart ziehst, aufgerufen.

Deine Globalen Variablen werden dann erzeugt und innerhalb von Start() kannst du dann darauf zugreifen.

Du mußt eine Globale Variable aber nicht initialisieren.

Beim Befehl GlobalVariableSet() wird die GV erzeugt und gesetzt. Sollte sie bereits vorhanden sein, dann wird sie nur gesetzt, d.h. es reicht, wenn du sie innerhalb von Start, wenn du das erste mal darauf schreibst, erzeugst.

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.