Mh47 Posted June 15, 2011 Report Share Posted June 15, 2011 (edited) 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 June 15, 2011 by Mh47 Quote Link to comment Share on other sites More sharing options...
WOGO Posted June 16, 2011 Report Share Posted June 16, 2011 Hallo Mh47! Herzlich Willkommen hier im Forum.! 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 Mach einfach eine Abfrage, wenn dHigh==dLow, dann verwende den alten Wert. 1 Quote Link to comment Share on other sites More sharing options...
Bull68 Posted June 16, 2011 Report Share Posted June 16, 2011 Wenn dHigh=dLow, dann teilst du durch 0 und das mag MT garnicht Nicht nur MT 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. 1 Quote Link to comment Share on other sites More sharing options...
Mh47 Posted June 17, 2011 Author Report Share Posted June 17, 2011 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 Quote Link to comment Share on other sites More sharing options...
Bull68 Posted June 17, 2011 Report Share Posted June 17, 2011 Ü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. Quote Link to comment Share on other sites More sharing options...
Mh47 Posted June 18, 2011 Author Report Share Posted June 18, 2011 Ü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. 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 Quote Link to comment Share on other sites More sharing options...
Bull68 Posted June 19, 2011 Report Share Posted June 19, 2011 Ja haste recht MH47, stimmt schon so wie Du sagst, steht auch so in der MT4 Hilfe. 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. Quote Link to comment Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.