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.

Erste Indikatorversuche/ Vergangene Bars berechnen

Geschrieben

Hallo liebe Forengemeinde,

 

ich begebe mich gerade mithilfe des Tutorials von Codersguru an das Lernen von MQL4.

Zur Zeit versuche ich meinen eigenen Indikator zu entwerfen indem ich mich grob an die Vorlage des von Codersguru angeführten Beispielindikator halte.

( Codergurus Tutorial // Lesson 12)

Der Indikator funktioniert soweit auch wie gewünscht bis auf das er beim Aufruf die Vergangenheit / die vergangenen Bars nicht berechnet.

Damit dies nicht passiert waren eigentlich folgende Zeilen vorgesehen ( nach dem Beispiel von Codersguru)

 

 

int start()
 {
  int    counted_bars=IndicatorCounted(); // counted_bars enthält nun eine Zahl der bereits gezählten Bars

// last counted bar will be recounted
  if (counted_bars>0) counted_bars--;
  
  int pos=Bars-counted_bars ; // Bars ist die Anzahl aller Bars , pos die Anzahl der noch nicht gezählten Bars, also beim ersten Aufruf alle
  
  double dHigh , dLow , dOpen , dClose ,dResultA;

     // Calculation loop
      while (pos>=0) // gibt die Anzahl der Durchläufe an
      {
      dHigh = High[pos];
      dLow = Low[pos];
      dOpen = Open[pos];
      dClose = Close[pos];
      dResultA =(dClose-dOpen)/(dHigh-dLow);
      Datenbank[pos] = dResultA ;
      pos-- ; // Anzahl der kommenden Durchläufe wird um 1 verringert
      }

 

Eigentlich müsste somit doch immer beim ersten Start die komplette Vergangenheit des Charts berechnet werden und dann bei erneuten Aufruf des int start { } der letzte Bar erneut. Anscheinend wird aber immer nur der letzte Bar berechnet. Wo liegt mein Fehler?

 

Vielen Dank im Vorraus

Bearbeitet von Mh47

Featured Replies

Geschrieben

Hallo Mh47!

Herzlich Willkommen hier im Forum.! :door:

 

Man sieht bei deinem Code zwar nicht, ob du die Indikator-Buffer richtig initialisierst, ich denke aber es liegt eher an dieser Zeile:

dResultA =(dClose-dOpen)/(dHigh-dLow);

Wenn dHigh=dLow, dann teilst du durch 0 und das mag MT garnicht :tongue:

 

Mach einfach eine Abfrage, wenn dHigh==dLow, dann verwende den alten Wert.

Geschrieben

Wenn dHigh=dLow, dann teilst du durch 0 und das mag MT garnicht :tongue:

 

Nicht nur MT :wink:

 

dHigh = High[pos];

dLow = Low[pos];

dOpen = Open[pos];

dClose = Close[pos];

dResultA =(dClose-dOpen)/(dHigh-dLow);

Also wenn in einem Code mit mehreren 1000 Zeilen noch durchsteigen willst, dann sollte man sowas vermeiden.

So zb. gefällt das dem Bull schon besser (inklusive Wogo Gimick):

if (High[pos] != Low[pos])

Datenbank[pos] = (Close[pos] - Open[pos]) / (High[pos] - Low[pos])

 

Ich gehe mal davon aus, dass "Datenbank" Dein Mapbuffer ist und der sollte vernünftig initialisiert sein, sonst landen die Bits im Nirvana, aber nicht auf dem Bildschirm. Am besten erstmal irgendwas reinschreiben um zu sehen, ob im Indifenster überhaupt was erscheint:

 

Datenbank[pos] = Close[pos]

 

Herzlich Willkommen WH47 im besten Trading Forum. :Connie_entrance:

Geschrieben
  • Autor

Ah super Danke :)

nachdem ich die Bedingung

 

if (dHigh != dLow)

 

eingefügt habe funktionierts :)

Und auch vielen Dank für die Tipps um die Übersicht zu behalten, sowas ist immer hilfreich :P

Geschrieben

Übrigens: diese While Schleife in der Start ist kompletter Schwachsinn. Auch ich hatte deshalb schon sehr merkwürdige Ergebnisse deshalb (halt von Beispielen übernommen). Ist aber auch klar: wenn bei jedem Tick die komplette Historie (können im 5min Millionen Bars sein) berechnet wird, dann kann das nix Gutes werden. Kommen dann noch verschachtelte Schleifen hinzu, dann wirds noch gruseliger. Entweder man packt die Schleife in die Init oder ruft sie in der Start einmal beim TF Wechsel auf. Beim Tick wird nur noch die aktuelle Bar berechnet. Belibt nur zu hoffen, dass komerzielle EAs sauberer programmiert sind. :twiddle:

 

 

Geschrieben
  • Autor

Übrigens: diese While Schleife in der Start ist kompletter Schwachsinn. Auch ich hatte deshalb schon sehr merkwürdige Ergebnisse deshalb (halt von Beispielen übernommen). Ist aber auch klar: wenn bei jedem Tick die komplette Historie (können im 5min Millionen Bars sein) berechnet wird, dann kann das nix Gutes werden. Kommen dann noch verschachtelte Schleifen hinzu, dann wirds noch gruseliger. Entweder man packt die Schleife in die Init oder ruft sie in der Start einmal beim TF Wechsel auf. Beim Tick wird nur noch die aktuelle Bar berechnet. Belibt nur zu hoffen, dass komerzielle EAs sauberer programmiert sind. :twiddle:

 

Naja so wie ich das verstanden hab wird bei jedem Tick nur die letzte Bar neu berechnet, alle anderen nur beim 1. Aufruf des Programms

 

 int    counted_bars=IndicatorCounted();

 

Die IndicatorCounted Funktion hält ja die Anzahl der bereits gezählten Bars, also beim ersten Durchlauf 0, später allerdings alle -1 ; bzw. alle wenn sich nur ein Tickwert verändert

 

if (counted_bars>0) counted_bars--;

 

Hierdurch wird die Zahl der bereits berechneten Bars um 1 verringert, was beim ändern eines Tickwertes zur Folge hat das die letzte Bar nochmal neu berechnet wird (s.unten)

 

 int pos=Bars-counted_bars

 

Bars hält die Zahl aller Bars und pos gibt nun die Anzahl der Durchläufe der while Schleife an. Beim ersten Mal sind die bereits berechneten Bars gleich 0, somit läuft die while Schleife so häufig wie Bars auf dem Chart da sind. Verändert sich nun nur ein Tickwert so beträgt pos 1, da counted_bars gleich Bars ist, man counted_Bars aber bevor man die Differenz bildet noch um 1 reduziert.

Somit berechnet der Indikator bei jedem Tick den Bar [1] und den aktuellen Bar [0]. Warum man den Bar [1] nochmal neu berechnet ist mir nicht ersichtlich, aber da Codersguru es so in seinem Tutorial gemacht hat habe ich es mal so übernommen.

Berichtigt mich wenn ich falsch liege :P

Geschrieben

Ja haste recht MH47, stimmt schon so wie Du sagst, steht auch so in der MT4 Hilfe. :rolleyes:

 

Bei der vorletzten Bar kann es schonmal zu Problemchen kommen:

Note: The latest bar is not considered to be calculated and, in the most cases, it is necessary to recalculate only this bar. However, there occur some boundary cases where custom indicator is called from the expert at the first tick of the new bar. It is possible that the last tick of the previous bar had not been processed (because the last-but-one tick was being processed when this last tick came), the custom indicator was not called and it was not calculated because of this. To avoid indicator calculation errors in such situations, the IndicatorCounted() function returns the count of bars minus one.

 

Werde mir nächste Woche die Werte mal anzeigen lassen, geht nur im Moment nicht, weil ist Weekend -> kein Tick.

 

 

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.