Jump to content
Tom Next - Daytrading Community

currentbar und MaxBarsBack


WOGO

Recommended Posts

Langsam bin ich ein bischen genervt von MC.

Ich hab eine grundsätzliche Frage, die mir ziemlich einfach erscheint, die aber scheinbar keiner im MC Forum beantworten kann. :vangry:

Trau mir fast wetten, dass ich hier bei uns innerhalb kürzester Zeit das erklärt bekomme, worum es mir geht...

 

Also, zu meinem Problem. Die Erklärung in der EL-Dokumentation zu currentbar und MaxBarsBack ist ja relativ eindeutig.

currentbar gibt mir einen Index des aktuellen Bars zurück, fängt aber erst nach MaxBarsBack zu zählen an. Wenn also MaxBarsBack auf 20 steht, dann hat der 21. Bar im Chart currentbar=1.

Jetzt will ich probehalber nichts anderes machen, als mir an jeden aktuellen Bar den Maximalkurs seit Chartbegin (also ganz links) anzeigen lassen. Das mach ich so:

variables:
HighValue(0),
cnt(0);	
Print("CB:",currentbar," MB:", MaxBarsBack);
HighValue=0;
For cnt=currentbar downto 0 
begin
if High[cnt]>HighValue then				//High on position cnt higher then previous maximum?
Begin
	HighValue=High[cnt];						//Store new Maximum
end;			
end;
Plot1(HighValue);

Das merkwürdige: Der Indikator fängt erst beim 630. Bar im Chart zum zeichnen an (ich hab 1000 Bars im Chart) und das noch merkwürdigere ist, dass die Testausgabe

Print("CB:",currentbar," MB:", MaxBarsBack);

folgenden Mist liefert:

CB:   1.00 MB:  20.00
CB:   2.00 MB:  20.00
CB:   3.00 MB:  20.00
CB:   4.00 MB:  20.00
CB:   5.00 MB:  20.00
CB:   6.00 MB:  20.00
CB:   7.00 MB:  20.00
CB:   8.00 MB:  20.00
CB:   9.00 MB:  20.00
CB:  10.00 MB:  20.00
CB:  11.00 MB:  20.00
CB:  12.00 MB:  20.00
CB:  13.00 MB:  20.00
CB:  14.00 MB:  20.00
CB:  15.00 MB:  20.00
CB:  16.00 MB:  20.00
CB:  17.00 MB:  20.00
CB:  18.00 MB:  20.00
CB:  19.00 MB:  20.00
CB:  20.00 MB:  20.00
CB:  21.00 MB:  20.00
CB:   1.00 MB:  33.00   <== Sprung!!!
CB:   2.00 MB:  33.00
CB:   3.00 MB:  33.00
CB:   4.00 MB:  33.00
CB:   5.00 MB:  33.00
CB:   6.00 MB:  33.00
CB:   7.00 MB:  33.00

MaxBarsBack macht also in regelmäßigen Abständen (das Muster kann ich nicht wirklich erkennen) einen Sprung und zu dieser Zeit startet currentbar dann wieder bei 1.

Das geht bei besagten 1000 Bars im Chart soweit:

CB: 358.00 MB: 629.00
CB: 359.00 MB: 629.00
CB: 360.00 MB: 629.00
CB: 361.00 MB: 629.00
CB: 362.00 MB: 629.00
CB: 363.00 MB: 629.00
CB: 364.00 MB: 629.00
CB: 365.00 MB: 629.00
CB: 366.00 MB: 629.00
CB: 367.00 MB: 629.00
CB: 368.00 MB: 629.00
CB: 369.00 MB: 629.00
CB: 370.00 MB: 629.00
CB: 371.00 MB: 629.00

MaxBarsBack hab ich über die Skripteigenschaften fest auf 20 gesetzt.

 

Das Problem ist doch nun wirklich nicht exotisch. Kann mir jemand erklären, wo mein Denkfehler ist, oder warum das Prinzip nicht so funktioniert, wie ich es mir vorstelle? Warum macht MaxBarsBack Sprünge? :vogel:

 

Danke!

Wogo

Link to comment
Share on other sites

Ich glaub ich komm jetzt langsam selber drauf.

MaxBarsBack macht nicht das, was ich erwarte.

Ich hätte gedacht, dass man über MaxBarsBack einfach den Balken setzt, an dem currentbar zu zählen beginnt. So wie ich das aber mittlerweile sehe begrenzt es aber auch die maximale Anzahl an Bars, die ich "zurückschauen" kann.

Wenn ich also einen Chart mit 1000 Bars habe und MaxBarsBack auf 600 setze, dann ist am 600. Bar currentbar=1. Ab da fängt dann auch erst mein Indikator zu zeichnen an.

Setze ich MaxBarsBack aber z.B. auf 200, dann ist zwar schon am 200. Bar currentbar=1, ich kann aber auch nur maximal 200 Bars zurückschauen. Wenn ich also vom 1000. Bar beginne kann mein Indikator erstmals am 800. Bar gezeichnet werden.

Hier ist aber dann noch das Problem, dass, wenn ich auf Bars vor dem 800. zugreife, MC die MaxBarsBack-Einstellung dementsprechend verändert.

 

Ich weiss nicht, warum das so ist und ob das überhaupt so gewollt ist. Ich weiss nur, dass das Mist ist! :vangry:

Link to comment
Share on other sites

Langsam bin ich ein bischen genervt von MC.

Ich hab eine grundsätzliche Frage, die mir ziemlich einfach erscheint, die aber scheinbar keiner im MC Forum beantworten kann. :vangry:

Äh, ich trau mich es fast nicht zu sagen, aber: du programmierst falsch in EasyLanguage. Du programmierst so, als hättest du den MT4 vor dir. Hast du aber nicht. Da hatte ich am Anfang auch schwer mit zu kämpfen, in Wirklichkeit denken die MT4-Kenner in EasyLanguage viel zu kompliziert.

 

Erstmal die Lösung (das bisherige High von ganz links malen):

variables:
       HighValue(0);

if High > HighValue then HighValue = High;
Plot1(HighValue); 

 

Erklärung:

Die Variablen behalten ihren Wert aus der vorausgehenden Bar. Das heißt in HighValue steckt das letzte High.

 

Zur Erklärung von Currentbar und MaxBarsBack:

Currentbar gibt die aktuelle Barnummer des Charts zurück. Das ist die Nummer, die du auch im DataWindow siehst, wenn du mit der Maus über einer Bar bist. Das heißt, Currentbar startet bei 1 und zählt bis zum Ende hoch (auch über MaxBarsBack hinaus).

 

MaxBarsBack gibt dir die Anzahl an Bars aus, die du rückwirkend referenziert hast. Das heißt, MaxBarsBack wird immer auf das Maximum der bisherigen Rükgriffe gesetzt und entspricht nicht dem Setting auf dem Chart. Gemeint ist, dass du diese Information nutzen kannst, um zu wissen, wie viele BarsBack du überhaupt brauchst.

 

Bei mir sieht das Print dann so aus:

CB:    1.00 -- MB:    1.00
CB:    2.00 -- MB:    1.00
CB:    3.00 -- MB:    1.00
CB:    4.00 -- MB:    1.00
CB:    5.00 -- MB:    1.00
CB:    6.00 -- MB:    1.00
CB:    7.00 -- MB:    1.00
...
CB: 1800.00 -- MB:    1.00
CB: 1801.00 -- MB:    1.00
CB: 1802.00 -- MB:    1.00
CB: 1803.00 -- MB:    1.00
CB: 1804.00 -- MB:    1.00
CB: 1805.00 -- MB:    1.00
CB: 1806.00 -- MB:    1.00
CB: 1807.00 -- MB:    1.00
CB: 1808.00 -- MB:    1.00

Selbst bei Bar Nummer 1808 hab ich bislang nie mehr als eine Kerze zurückgegriffen. Die Sprünge kommen bei dir dadurch, dass MC bei jedem Überschreiten von MaxBarsBack genau diesen Parameter neu initialisiert und dann bei CurrentBar wieder neu anfängt. Aber Currentbar geht dann wieder über MaxBarsBack hinaus und dann wird wieder neu initialisiert usw usf.

  • Upvote 4
Link to comment
Share on other sites

Äh, ich trau mich es fast nicht zu sagen, aber: du programmierst falsch in EasyLanguage.

Nur keine Zurückhaltung. Gib's mir ruhig dreckig! :spank: Ich will ja schliesslich was lernen.

 

Zu deiner Lösung. Ja, das versteh ich. Hätt ich vielleicht, wenn es um die Lösung des von mir beschriebenen Problems ginge, auch so gemacht. Ich kam ursprünglich von einem etwas komplexeren Code und wollte mit diesem einfachen Program eher meine Problematik mit currentbar und MaxBarsBack darstellen.

In deiner Lösung braucht man wirklich nicht weiter als einen Bar zurückschauen. Das stimmt.

 

Wie mach ich es aber, wenn ich eine Funktion codieren will, die ab einen bestimmten Bar zurück das Maximum aus den nächsten X Bars suchen soll, also sowas wie bei MT4

iHighest()?

Link to comment
Share on other sites

Wie mach ich es aber, wenn ich eine Funktion codieren will, die ab einen bestimmten Bar zurück das Maximum aus den nächsten X Bars suchen soll, also sowas wie bei MT4

iHighest()?

Das Höchste Hoch aus 20 bars mit:

Highest(High, 20)

 

Das Höchste Low aus 20 bars mit:

Highest(Low, 20)

 

Ist also noch ein bisschen flexibler.

Link to comment
Share on other sites

Das Höchste Hoch aus 20 bars mit:

Highest(High, 20)

 

Das Höchste Low aus 20 bars mit:

Highest(Low, 20)

 

Ist also noch ein bisschen flexibler.

Ja, aber das startet doch immer am aktuellen Bar und sucht dann 20 Bars zurück. Wenn ich aber z.B. gerade den Bar 100 berechne und dort das Maximum zwischen Bar 50 und Bar 60 wissen will. Wie geht das?

Link to comment
Share on other sites

Ja, aber das startet doch immer am aktuellen Bar und sucht dann 20 Bars zurück. Wenn ich aber z.B. gerade den Bar 100 berechne und dort das Maximum zwischen Bar 50 und Bar 60 wissen will. Wie geht das?

Dann machst du die Schleife, wie du sie gemacht hast. Nur halt von 50 downto 40. Ich weiß ja nicht, was du vor hast, aber lässt sich nicht schon bei Bar 50 bis 60 das Maximum speichern, auf das du dann in Bar 100 zurückgreifst?

 

Grundsätzlich ist es in MC nämlich nicht so optimal viele viele Bars zurückzugehen, daher gibt es auch die Begrenzung MaxBarsBack (die übrigens für den Indikator individuell und unabhängig vom Signal eingestellt wird). MC speichert nämlich nicht nur die Bars, sondern alle deine Variablen mit Wert ab! Du könntest also mit deiner eigens deklarierten Variable per HighValue[5] auf das bisherige Hoch von vor 5 Kerzen zurückgreifen. Durch diese Möglichkeiten wird aber viel Speicher benötigt und durch MaxBarsBack begrenzt.

  • Upvote 1
Link to comment
Share on other sites

... aber du hast recht. Ich denke zu kompliziert. :doink:

 

Ich hab mir jetzt den Indikator, bei dem ursprünglich das Problem auftrat, nochmal angeschaut und mit deiner Herangehensweise gemerkt, dass ich das "iHighest" garnicht benötige.

 

Ich muss mal davon wegkommen, alte MT4-Indikatoren 1:1 in EL portieren zu wollen. Ist aber garnicht so leicht, seine Denkweise zu ändern.

 

Danke für deine Hilfe RAiNWORM! :door:

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