siscop Posted May 13, 2012 Report Posted May 13, 2012 Hoffe dass mir hier jemand zu meinem Problem helfen kann. Hab leider die Erfahrung gemacht dass im MC Forum da kaum einer zum Codingfragen antwortet.Folgendes Problem:Ich habe einen Indikator der mir den ATR(20) berechnet und diese dann in Prozent der Größe der letzten 200 Tage hin vom ATR(20) vergleicht.Code Indi:inputs: Glaettung(20), Dauer(200); Plot1(_fVolaP(Glaettung,Dauer));Code Funktioninputs: Glaettung(NumericSimple), Dauer(NumericSimple); variables: VolaGlaettung(0), VHigh(0), VLow(0), count(0), Zwischen(0), Ergebnis(0); VolaGlaettung=AvgTrueRange(Glaettung); VHigh=VolaGlaettung; VLow=VolaGlaettung; for count=0 to Dauer-1 begin if VHigh<VolaGlaettung[count] then VHigh=VolaGlaettung[count]; if VLow>VolaGlaettung[count] then VLow=VolaGlaettung[count]; end; if VHigh<>VLow then Ergebnis=((VolaGlaettung-VLow)/(VHigh-VLow)*100); if VHigh=VLow then Ergebnis=0; _fVolaP=Ergebnis; Eigentlich ziemlich primitiv ABER obwohl ich die gleichen Parameter einsetze ATR(20) auf der Länge von 200 ergeben sich unterschiedliche Ergebnisse wenn ich den S&P500 auf 300 oder 600 bars back nutze.Indi oben bezieht sich auf Chart oben mit 300 bars back und Indi unten auf den Chart unten mit 600 bars back. Beide Indis haben die gleichen Parameter als Input.WARUM nur? Ich hätte jetzt erwartet dass der Indi gleich aussieht. Ich habe dieses Problem jetzt schon seit einiger Zeit und komme einfach nicht auf die Lösung.Wäre wirklich nett wenn mir jemand dabei helfen könnte. Es ist bestimmt nur eine Kleinigkeit.
WOGO Posted May 13, 2012 Report Posted May 13, 2012 Ich hab zwar schon länger nicht mehr PL programmiert, aber ich würd mal sagen dir fehlt die Bedingung für den Start der Berechnung, also ab welchem Bar.Ich meine, du berechnest den ATR für jeden Bar im Chart. Auch für den ersten und von da an ein ATR(200) über nicht vorhandene Bars.. Edit: mein natürlich nich ATR(200) sondern ATR(20) aber 200 Bars rückwärts...
siscop Posted May 13, 2012 Author Report Posted May 13, 2012 On 5/13/2012 at 5:38 PM, WOGO said: aber ich würd mal sagen dir fehlt die Bedingung für den Start der Berechnung,Start der Berechnung? Das gebe ich doch bei keinem Indi an. 300 Bars zurück sollte bei einem Indi mit der Länge von 200+20 ausreichen damit er die gleichen Ergebnisse ab Bar 220 angibt.Hast du einen Beispiel für das was du meinst?
WOGO Posted May 13, 2012 Report Posted May 13, 2012 On 5/13/2012 at 5:55 PM, siscop said: Hast du einen Beispiel für das was du meinst?z.B. sowas bei einem auf MA-basierenden Indikator mit extPeriode als MA Periodendauerif currentbar>extPeriod then begin LRMA=wgf_LRMAColor(extPeriod, extPrice,extTrendDiff,Trend,farbe); Plot1(LRMA,"LRMA"); SetPlotColor( 1, farbe ); end;
swz168 Posted May 13, 2012 Report Posted May 13, 2012 Ich denke, das Problem können wir im BereichVolaGlaettung[count]eingrenzen. Für die untere Chart liefert der lauter Nullen am Ende am des Charts. for count=0 to Dauer-1 begin print(Currentbar, " ", VolaGlaettung[count]); end; Füge das mal nach deiner For Schleife ein und schaue Dir nur mal die untere Chart an und deaktivere den oberen Indi.
systemtrader Posted May 13, 2012 Report Posted May 13, 2012 (edited) Du Berechnest deinen Indikator Selber ich habe auch immer solche Probleme gehabt die waren bei mir damit erledigt das ich wie WOGO Richtig sagt das der Startpunkt fehlt!!!! Ich frage immer ab ob die mindeste menge an Kerzen zu Berechnung zu Verfügung stehen erst dann geht es in die berechnungs schleife. z.b If Barcount >= x Kerzen Then Berechne IndikatorEnd if Edit: Sehe gerade die Richtige Lösung war schon da aber egal doppelt hält besser :-) Edited May 13, 2012 by systemtrader
swz168 Posted May 13, 2012 Report Posted May 13, 2012 Siscop, Problem Startpunkt lösen können? Wenn nicht arbeite mal mit Arrays.
systemtrader Posted May 13, 2012 Report Posted May 13, 2012 (edited) On 5/13/2012 at 6:42 PM, swz168 said: Siscop, Problem Startpunkt lösen können? Wenn nicht arbeite mal mit Arrays. Arrays sind eigentlich nicht nötig nehme notfalls eine Zähler Variable ich kenne den korrekten befehlt unter MC nicht. vars:anzbars(0) If Close <> Close[1] Then anzbars = anzbars + 1 End If If anzbars >= x Then Berechne Indikator ab hier !!!! End if Edited May 13, 2012 by systemtrader
siscop Posted May 13, 2012 Author Report Posted May 13, 2012 Ich habe den Startpunkt wie von euch geschrieben nach Currentbar oder Barnumber angegeben if currentbar>(Dauer+Glaettung) then VolaGlaettung=AvgTrueRange(Glaettung); VHigh=VolaGlaettung; VLow=VolaGlaettung; if currentbar>(Dauer+Glaettung) then begin for count=0 to Dauer-1 begin if VHigh<VolaGlaettung[count] then VHigh=VolaGlaettung[count]; if VLow>VolaGlaettung[count] then VLow=VolaGlaettung[count]; //print(Currentbar, " ", VolaGlaettung[count]); end; end; if VHigh<>VLow then Ergebnis=((VolaGlaettung-VLow)/(VHigh-VLow)*100); if VHigh=VLow then Ergebnis=0; _fVolaP=Ergebnis; Hat leider nicht geholfen.Hab dann die currentbar modifikation rückgängig gemacht und es mit MaxBarsBack versucht.Den automatischen MaxBarsBack auf manuell gesetzt und den Wert auf 230 gesetzt (230>200+20).Hat leider auch nicht geholfen.
systemtrader Posted May 13, 2012 Report Posted May 13, 2012 Wenn ich das Richtig sehe berechnet der untere Indikator ab bar Null das zieht denn Indikator auf gierigere Werte da immer mit 0 Gerechnet wird ( 14,79 ) Der obere sieht doch ganz ok aus.
siscop Posted May 13, 2012 Author Report Posted May 13, 2012 Für mich war der untere Indikator der "bessere" Wert da der ATR(20) Wert runter gegangen ist und ich die seine weite im Vergleich zum höchsten und niedrigsten Wert der letzten 200 ATR(20) vergleiche und somit sehe dass der untere passen würde.Wie auch immer sollten beide Indis den gleichen Wert anzeigen und nicht unterschiedliche.Bin immer noch am verzweifeln.
swz168 Posted May 13, 2012 Report Posted May 13, 2012 Wie oben erwähnt hängt das Problem mit VolaGlaettung[count] zusammen. Lösung: Funktion VolGlaettungInput: Glaettung (NumericSimple); VolaGlaettung=AvgTrueRange(Glaettung); inputs: Glaettung(NumericSimple), Dauer(NumericSimple); variables: VHigh(0), VLow(0), count(0), Zwischen(0), Ergebnis(0); VHigh=VolaGlaettung(Glaettung); VLow=VolaGlaettung(Glaettung); for count=0 to Dauer-1 begin if VHigh<VolaGlaettung[count](Glaettung) then VHigh=VolaGlaettung[count](Glaettung); if VLow>VolaGlaettung[count](Glaettung) then VLow=VolaGlaettung[count](Glaettung); end; if VHigh<>VLow then Ergebnis=((VolaGlaettung((Glaettung))-VLow)/(VHigh-VLow)*100); if VHigh=VLow then Ergebnis=0; _fVolaP=Ergebnis; inputs: Glaettung(20), Dauer(200); Plot1(_fVolaP(Glaettung,Dauer)); Damit stimmen dann alle Indiwerte überein: 4
siscop Posted May 14, 2012 Author Report Posted May 14, 2012 @swz168Bohhh DICKES DANKE...Es funktioniert. Du weißt echt nicht wie lange ich an diesem Problem gehangen habe.Hast du zufällig eine Erklärung warum man den Indikator direkt eingeben muss statt es in einer Variable zwischen zu speichern? Nun habe ich eine Vermutung aber wissen tue ich es nicht...Kann es sein dass bei einer zwischengespeicherten Variable nur die angezeigten Werte eines Indikator angezeigt wird und die innerhalb der MaxBarsBack berechneten nicht angezeigten Werte gar nicht erst berücksichtigt werden und deswegen man die doppelte Menge an History braucht an Bars? Oder liege ich bei meiner Vermutung falsch?Ich würde es gerne verstehen um zukünftig diesen Fehler zu vermeiden. Man hat ja nicht immer das doppelte an History im Chart.
siscop Posted May 14, 2012 Author Report Posted May 14, 2012 Also um so mehr ich drüber nachdenke desto unverständlicher wird mir die SacheWarum ist VolaGlaettung=AvgTrueRange(Glaettung); ... VHigh<VolaGlaettung[count]; nicht gleich... VHigh<AvgTrueRange[count](Glaettung); Es ist erst gleich wenn viel viel mehr History vorhanden ist. Bei Len=200 sind erst alle Ergebnisse ab Barnumber > 600 gleich.
swz168 Posted May 14, 2012 Report Posted May 14, 2012 Leider kann ich es mir dieses Verhalten auch nicht erklären. Da ich historische Werte von Variablen immer über Funktionen realisiert habe, habe ich es auch mal so mit Deinem Indi Verfahren. Könnte es sich nicht um einen Bug handeln?
siscop Posted May 15, 2012 Author Report Posted May 15, 2012 Nur mal zur Information dass es anscheinend ein feature und kein BUG ist.Hab im MC Forum die gleiche Frage gestellt. Henry erklärte das Verhalten zusammenfassend so dass Variablen die Werte übernehmen und berechnen die NACH MaxBarsBack angezeigt werden -> heißt also dass man MaxBarsBack+Dauer an History braucht. Also min. das Zweifache von der längsten Länge (2x MaxBarsBack).Um eine Anzeige im Chart zu verhindern startet man die Anzeige erst wenn die geforderten Bars zur Berechnung vorhanden ist.Das wäre sein erstes Codebeispiel. Sein zweites Codebeispiel geht in Richtung von swz168 jedoch optimiert er die Anzahl der Aufrufe der Funktion. Dabei braucht man nur die einfache Länge an History (1x MaxBarsBack). Quote Code:VolaGlaettung=AvgTrueRange(Glaettung); VHigh<VolaGlaettung[count]; In this code you are referring to the historical values of VolaGlaettung[count] variable in a cycle.This history starts at the first bar of the calculation. Historical values will be zero until CurrentBar becomes >Count (i.e. Dauer-1). That means the indicator will stabilize from the chart bar ~ ( MaxBarsBack+Dauer). Code:VHigh<AvgTrueRange[count](Glaettung); AvgTrueRange[count](Glaettung) function is calculated in a cycle. The calculation is possible only when MaxBarsBack = Dauer. The indicator will stabilize from the chart bar = MaxBarsBack. For earlier stabilization you pay with excess function calls. There are multiple possibilities to improve the code: 1) AvgTrueRange is called once, postponed indicator stabilization (from MaxBarsBack+Dauer), incorrect plot values are not shown.Indicator code: Code:if currentbar > Dauer then plot1(_fVolaP(Glaettung,Dauer)); Function code remains the same as in the first post: Code:inputs: Glaettung(NumericSimple), Dauer(NumericSimple); variables: VolaGlaettung(0), VHigh(0), VLow(0), count(0), Zwischen(0), Ergebnis(0); VolaGlaettung=AvgTrueRange(Glaettung); VHigh=VolaGlaettung; VLow=VolaGlaettung; for count=0 to Dauer-1 begin if VHigh<VolaGlaettung[count] then VHigh=VolaGlaettung[count]; if VLow>VolaGlaettung[count] then VLow=VolaGlaettung[count]; end; if VHigh<>VLow then Ergebnis=((VolaGlaettung-VLow)/(VHigh-VLow)*100); if VHigh=VLow then Ergebnis=0; _fVolaP=Ergebnis; 2) AvgTrueRange is called twice (compared to six calls suggested by swz168). The indicator will stabilize from the chart bar = MaxBarsBack, all plot values are plotted.Indicator code remains the same as in the first post: Code:inputs: Glaettung(20), Dauer(200); Plot1(_fVolaP(Glaettung,Dauer)); _fVolaP function is modified according to the suggested method (cutting excess AvgTrueRange calls): Code:inputs: Glaettung(NumericSimple), Dauer(NumericSimple); variables: VolaGlaettung(0), VHigh(0), VLow(0), count(0), Zwischen(0), Ergebnis(0); VolaGlaettung=AvgTrueRange(Glaettung); VHigh=VolaGlaettung; VLow=VolaGlaettung; for count=0 to Dauer-1 begin //VALUE2 = AvgTrueRange(Glaettung)[count]; VALUE2 = VolaGlaettung[count]; if VHigh<VALUE2 then VHigh=VALUE2; if VLow>VALUE2 then VLow=VALUE2; end; if VHigh<>VLow then Ergebnis=((VolaGlaettung-VLow)/(VHigh-VLow)*100); if VHigh=VLow then Ergebnis=0; _fVolaP=Ergebnis; 3
Recommended Posts
Please sign in to comment
You will be able to leave a comment after signing in
Sign In Now