Jump to content
Tom Next - Daytrading Community

Indikator mit unterschiedliche Ergebnisse trotz gleichen Parameter


siscop

Recommended Posts

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 Funktion

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;

 

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.

B1.png b3.png

b2.png

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.

Link to comment
Share on other sites

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...

Link to comment
Share on other sites

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?

Link to comment
Share on other sites

Hast du einen Beispiel für das was du meinst?

z.B. sowas bei einem auf MA-basierenden Indikator mit extPeriode als MA Periodendauer

if currentbar>extPeriod then begin
   LRMA=wgf_LRMAColor(extPeriod, extPrice,extTrendDiff,Trend,farbe);
   Plot1(LRMA,"LRMA");
   SetPlotColor( 1, farbe );
end;

Link to comment
Share on other sites

Ich denke, das Problem können wir im Bereich

VolaGlaettung[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.

Link to comment
Share on other sites

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 Indikator

End if

 

 

Edit: Sehe gerade die Richtige Lösung war schon da aber egal doppelt hält besser :-)

Edited by systemtrader
Link to comment
Share on other sites

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 by systemtrader
Link to comment
Share on other sites

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.

b4.png

Link to comment
Share on other sites

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.

Link to comment
Share on other sites

Wie oben erwähnt hängt das Problem mit VolaGlaettung[count] zusammen.

 

Lösung:

 

Funktion VolGlaettung

Input: 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: siscop.jpg

  • Upvote 4
Link to comment
Share on other sites

@swz168

Bohhh 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.

Link to comment
Share on other sites

Also um so mehr ich drüber nachdenke desto unverständlicher wird mir die Sache

Warum 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.

Link to comment
Share on other sites

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?
Link to comment
Share on other sites

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).

 

 

 

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;

 

  • Upvote 3
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...