Jump to content
Tom Next - Daytrading Community

Erste Indikatorversuche/ Vergangene Bars berechnen


Mh47

Recommended Posts

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

Edited by Mh47
Link to comment
Share on other sites

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.

  • Upvote 1
Link to comment
Share on other sites

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:

  • Upvote 1
Link to comment
Share on other sites

Ü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:

 

 

Link to comment
Share on other sites

Ü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

Link to comment
Share on other sites

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.

 

 

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
×
×
  • Create New...