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.

Anweisung nur 1 x pro Bar ausführen

Geschrieben

Hi @ all,

 

bin noch ganz neu hier, auch in MQL4. Deshalb suchte ich verzweifelt nach einem Fehler im Einstieg meines ersten EA. Den habe ich gefunden, habe aber noch keine Lösung dafür. Ich hoffe hier auf Hilfe.

 

Der EA läuft in M5. Eine Bars-Zählfunktion zählt aber bei jedem Tick, also ein und den selben Bar xmal. Wie bringt man eine Anweisung dazu, nur 1x pro Bar und nicht bei jedem Tick ausgeführt zu werden?

 

Clixmaster

Featured Replies

Geschrieben

Hi @ all,

 

bin noch ganz neu hier, auch in MQL4. Deshalb suchte ich verzweifelt nach einem Fehler im Einstieg meines ersten EA. Den habe ich gefunden, habe aber noch keine Lösung dafür. Ich hoffe hier auf Hilfe.

 

Der EA läuft in M5. Eine Bars-Zählfunktion zählt aber bei jedem Tick, also ein und den selben Bar xmal. Wie bringt man eine Anweisung dazu, nur 1x pro Bar und nicht bei jedem Tick ausgeführt zu werden?

 

Clixmaster

 

Ich dampfe mal einen EA auf das Wesentliche ein:

 

static int prevtime = 0;

int init()
 {
  return(0);
 }

int deinit()
 {
  return(0);
 }

int start()
 {
  
 if(Time[0] == prevtime) //aktueller Bar schon erledigt, nichts tun
      return(0);

  prevtime = Time[0];


// ----------------------------------------------------------------------------------

  hier dann das was der EA pro Bar ein Mal tun soll

// ----------------------------------------------------------------------------------


  return(0);
}

 

Lutz

Geschrieben

Erstmal willkommen bei uns.

 

Wie bringt man eine Anweisung dazu, nur 1x pro Bar und nicht bei jedem Tick ausgeführt zu werden?

 

dafür gibts mehrere Lösungen:

Variante1:

Man merkt sich wenn man den Bar schon verarbeitet hat und ignoriert ihn danach. Da jeder Bar eine eindeutige Zeit hat geht das zB darüber:

static datetime last_time= 0;
if(last_time != Time[0]) {
 //Bar noch nicht bearbeitet, hier code der nur einmal pro bar ausgeführt werden soll
 // code wird dann beim ersten Tick des Bars ausgeführt und danach nicht mehr
 last_time= Time[0];
}

wichtig ist hierbei das "static" damit die Variable last_time sich den Wert bis zum nächsten Aufruf merkt.

 

Variante2 (sieht man auch oft, deswegen tu ichs dazu, ist aber unschön und unsicher):

Unter der Annahme das jeder Tick genau +1 im Volume erzeugt:

if(Volume[0] <= 1) {
 //hier code der nur beim ersten Tick ausgeführt wird
}

Problem hierbei: wenn du aufgrund von verarbeitungsengpässen etc. den ersten tick versäumst, wird der gesamte Bar ignoriert.

 

HTH

Geschrieben

3. Variante: Nicht die Zeit des aktuellen Bars vergleichen, sondern die Anzahl der Kerzen.

 

Sinngemäß sieht es dann so aus:

int BarCount;

[...]

if (Bars != BarCount) {
// Hier steht was er dann 1x je Kerze abarbeiten soll
BarCount=Bars;
}

Das Ganze kann man dann sogar noch mit iBars() verfeinern, da man damit auch die Kerzen in einer anderen Zeitebene zählen kann. So kann man bspw. alle 60 Minuten auf ein Einstiegssignal überprüfen, aber alle 15 Minuten auf einen Ausstieg.

Geschrieben

3. Variante: Nicht die Zeit des aktuellen Bars vergleichen, sondern die Anzahl der Kerzen.

Sofern niemand auf die Idee kommt im Chart zu scrollen und Bars nachzuladen, geht das auch, stimmt.

 

Das Ganze kann man dann sogar noch mit iBars() verfeinern, da man damit auch die Kerzen in einer anderen Zeitebene zählen kann. So kann man bspw. alle 60 Minuten auf ein Einstiegssignal überprüfen, aber alle 15 Minuten auf einen Ausstieg.

Das würd ich aber wenn dann auch direkt über die Zeit machen als über den Umweg mit den Bars. Eben weil ich bei den Bars keine 100% Sicherheit habe, bei der Time schon.

if(TimeCurrent() - last_time > min_diff) {
 //do stuff
 last_time= TimeCurrent();
//alternativ um lags auszuschließen:
 last_time += min_diff;
}

(Wobei die Frage ob TimeCurrent() oder TimeLocal() dann von der konkreten Anforderung abhängt)

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.