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.

EA Buffers schreiben im EA? - zwischenspeichern von Variablenwerten im EA

Geschrieben

Nun nochmal ein paar speziellere Fragen:

 

- Kann ich innerhalb eines EA's einen Buffer schreiben so wie in einem Indicator - ich habe das versucht aber der Buffer wird nicht angezeigt - d.h. muss ich zwangsweise über einen custom-indicator gehen?

 

- ich habe gerade in einem anderen Thread gelernt wie man einen EA zwischen zwei Ticks laufen lässt. Allerdings die klassische Methode ist ja, dass der EA pro Tick jeweils NEU aufgerufen wird d.h. auch alle Variablen-Werte pro Aufruf neu initialisiert werden.

 

Wie macht ihr das wenn ihr Werte die der EA einen Tick vorher berechnet hat beim neuen Aufruf verarbeiten wollt. Sprich wie speichert man Variablenwerte dauerhaft zwischen zwei EA-Aufrufen ab? Die normalen Arrays und Variablen werden ja bei jedem neuen "Aufruf" des EAs neu initialisiert.

 

Eine Möglichkeit wäre ein Textfile auf die Platte zu schreiben und wieder einzulesen -> nicht sehr elegant, bzw. Timingkritisch (wenn Festplatte im Sleepmodus etc.) :ph34r:

Andere Möglichkeit wäre den Wert vom EA aus in einen Buffer zu schreiben -> habe ich allerdings nicht geschafft :full:

Sonst noch Möglichkeiten???

 

danke euch

 

wingman

Featured Replies

Geschrieben
- Kann ich innerhalb eines EA's einen Buffer schreiben so wie in einem Indicator - ich habe das versucht aber der Buffer wird nicht angezeigt - d.h. muss ich zwangsweise über einen custom-indicator gehen?

 

Willst du nur ein Array, das für jeden Bar einen Wert speichert, oder diese Werte auch im Chart anzeigen?

Wenn du vom EA aus Linien in den Chart malen willst wirds umständlich und ist auch von der Idee her nicht so gedacht. Einzige was mir da einfällt wären viele Objekte einfügen die dir eben die Linie nachmalt.

 

Wie macht ihr das wenn ihr Werte die der EA einen Tick vorher berechnet hat beim neuen Aufruf verarbeiten wollt.

Variante 1: Variable im EA global verwenden. Also die Variable nicht innerhalb einer Funktion definieren sondern außerhalb. Diese Variable gibt es dann im gesamten EA (also kann jede Funktion darauf zugreifen und ändern) und ist damit auch zwischen verschiedenen Aufrufen von start() vorhanden.

 

Bsp:

 

int globales_int_=0;

void myFunction()
{
 globales_int_ = globales_int_ + 1;
}

int start()
{
 myFunction();
 Print(globales_int_);
}

Wenn du das so kompilierst und testest, bekommst eine Liste von aufsteigenden Zahlen ausgegeben (1,2,3,4,...) und zwar genau bei jedem Tick eine neue Zahl. Sprich der Wert der Variable globales_int_ bleibt zwischen den Ticks erhalten.

 

Variante 2: static

Eine statische Variable ist eine Variable innerhalb einer Funktion, deren Wert aber zwischen den Aufrufen der Funktion erhalten bleibt.

Bsp:

int start()
{
 static int statisches_int=0;
 statisches_int= statisches_int +1
 Print(statisches_int);
}

void myFunction()
{
 statisches_int = statisches_int + 1; //führt zu Compiler-Error
}

Nur die start() Funktion betrachtend macht dieses Bsp genau das gleiche wie das obige, die Funktion myFunction() würde aber einen "'statisches_int' - variable not defined" Error beim compilieren erzeugen, da die Variable nur innerhalb von start() existiert.

 

Das Ganze geht natürlich mit allen Datentypen (inkl. Arrays). Wenn man eine Variable nur innerhalb einer Funktion braucht, ist es natürlich "schöner" sie als static innerhalb der Funktion zu machen als brutal eine globale Variable zu nehmen.

 

Noch eine Warnung: Der Wert von globalen (und ich glaube auch statischen) Variablen überlebt in MT auch das PArameterwechseln. Der EA wird zwar neu initialisiert, aber die Werte der globalen Variablen sind danach immer noch die gleichen wie vor dem Parameterwechsel... das kann zu langen Fehlersuchen führen ;)

 

Noch ein Hinweis: die hier beschriebenen "globalen Variablen" sind was anderes wie die GlobalVariables in MT.

GlobalVariables sind Variablen die EA übergreifenden Funktionieren, das tun die hier beschriebenen nit.

 

HTH

Geschrieben
Noch eine Warnung: Der Wert von globalen (und ich glaube auch statischen) Variablen überlebt in MT auch das PArameterwechseln. Der EA wird zwar neu initialisiert, aber die Werte der globalen Variablen sind danach immer noch die gleichen wie vor dem Parameterwechsel... das kann zu langen Fehlersuchen führen ;)

 

Noch ein Hinweis: die hier beschriebenen "globalen Variablen" sind was anderes wie die GlobalVariables in MT.

GlobalVariables sind Variablen die EA übergreifenden Funktionieren, das tun die hier beschriebenen nit.

 

HTH

bei TF wechsel bzw. parameter manuell ändern wird die ini neu geladen und mt4 verliert die parameterwerte. auch bei variablen die ausserhalb von funktionen deffiniert wurden.

da man aber die errechneten parameter bei komplexen systemen behalten möchte gibt es da 2 varianten:

 

1. errechneten parameter in eine datei auslagern und in der ini funktion wieder einlesen

2. globalen variablen deffinieren (spezielle mt4 variante) und die bei der ini wieder einlesen.

 

Mythos hat schon recht dass die static und die variabeln die ausserhalb der start() funktion deffiniert wurden zwar gespeichert werden und die bei einem tickupdate nicht verloren gehen aber beim TF wechsel bzw beim neu ein spielen (durch manuellen parametereingabe) wird die ini neu geladen und das führt zur löschung aller in MT4 gespeicherten variabeln.

z.B. Ticket: wenn du die Ticketnr deiner offenen posi in der variabel "ticket" gespeichert hast und in einer offenen posi manuell die parameter änderst verliert dein EA die gespeicherten werte für "ticket". dies kannst du aber umgehen indem du bei jedem tick deine parameter bezüglich offener trades mit deinem daten abgleichst.

//Brokersync
  int cnt=0;
  long= false;
  short= false;	  
  for (cnt = 0; cnt < OrdersTotal(); cnt++) 
  {
  OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
  if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderCloseTime()==0) 
  {
	 ticket = OrderTicket();
	 if (OrderType() == OP_BUY) 
	 {
		long=true;
	 }
	 if (OrderType() == OP_SELL) 
	 {
		short=true;
	 }
  }
  }

Dies ist jetzt ein Beispiel wenn dein EA nur EINE Posi eingehen darf. Wenn er jedoch mehrere Posis eingehen darf dann musst du die tickets als array realisieren.

Geschrieben
bei TF wechsel bzw. parameter manuell ändern wird die ini neu geladen und mt4 verliert die parameterwerte. auch bei variablen die ausserhalb von funktionen deffiniert wurden.

 

Veto! Gerade getestet:

 

eGlobVarTest.mq4

 

auf beliebigen Chart ziehen. Bei jedem Tick wird die Variable inkrementiert. sowohl nach einem Parameterwechsel, als auch einem TF Wechsel bleibt der Wert erhalten und zählt weiter rauf.

Sogar ein Symbolwechsel lässt die Werte unbeeindruckt. lediglich neu kompilieren, bzw. EA vom Chart löschen und neu raufziehen, sorgt für das "Vergessen" der WErte.

 

Nur weil init() aufgerufen wird, heißt das nicht das die globalen Variablen neu initialisiert werden. Das müsste man händisch machen.

Geschrieben

hey Mythos,

nice one :ph34r: ich habe meine nicht externen globalen variabeln stets im ini bereich initialisiert.

wenn man sich wirklich auf dieses "feature" verlassen kann so ergeben sich ja gleich neue möglichkeiten.

danke dir für die info :full:

Geschrieben
sich wirklich auf dieses "feature" verlassen kann

 

Bin mir nicht sicher ob das nicht eigentlich ein Bug ist oder wirklich von den Entwicklern gewünschtes Verhalten. Also darauf verlassen das es nicht irgendwann anders is (nach Update oder so), würd ich mich nicht ;)

Geschrieben

Für funktions-lokale statische Variable ist es in der Doku explizit angegeben:

Static variables are initialized only once before calling of the "init()" function.
Es entspricht damit dem Verhalten in C, wo bereits der Compiler die Werte einsetzt und den fertigen statischen Datenblock ohne Änderung in der Programm-Initialisierung läßt.

 

Das Initialisieren der (hoffentlich nicht allzu vielen) globalen Variablen in init() kann trotzdem als guter Stil gelten gelassen werden.

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.