* Metastock 7.22 EOD: Formel für Systemausstieg
Hi,
als absoluter Anfänger bin ich auf Eure Hilfe angewiesen. Ich arbeite mit Metastock 7.22 EOD.
Ich habe ein ein sogenanntes 65ma3c-Umkehrsstem gemacht, Kauf wenn die 65-Tage GDL den Preis nach oben schneidet und 3 Tage auf der gleichen Seite bleibt, und dies in 20 Märkten Futures, Währungen usw. getestet.
Die Programmierung der Enter long und Enter short denke ich habe ich hinbekommen, habe aber gerade die Formel nicht da, Close long und close short blieben leer. Könnte man auch füllen aber es greift nur ein Signal also paßt. Kommision und Stopkurse keine gefordert.
Die wichtigen Größen wie Netprofit, Payoffratio, die verschiedenen Betragsabfälle usw. habe ich in einer Tabelle zusammengetragen.
Nun würde ich gerne ein billiges Austiegssignal hinzufügen und aus Spaß einfach mal das Zahlenwerk feststellen.
Nach dem Einstiegsignal soll genau nach n=10 Tagen zum Austieg geblasen werden, ich denke zum Eröffnungskurs des folgenden 11. Tages. Ich will keine Güteklasse der Einstiegssignale feststellen, sondern nur so tun als wäre das mein System). Also Close long Ausstieg nach 10 Tagen seit Einstiegsignal. Das Gleiche gilt für Close short.
Das System ist also bei Enter long entweder 10 Tage long und dann out, oder sogar noch weniger Tage long und dann short wenn der 65-GDL den Preis nach unten durchhaut.
Ich habe keine blasse Vorstellung wie ich das programmiere. Ich habe mir zwar das Handbuch grob durchgelesen, deswegen kann ich es aber noch lange nicht anwenden.
Wer könnte mir helfen und mir den Code für den Systemtester posten ?
Mit freundlichen Grüßen
Mr_aegon
Hallo Aegon,
darf ich mal fragen, wie lange du den Markt schon intensiv beobachtest?
Damit meine ich nicht abends mal 1 bis 2 Stunden, sondern realtime über einen längeren Zeitraum.
Gruß,
Bruno Stenger
Hallo,
für ein EoD-System ist keine permanente 12 Stunden Intraday Tagesbeobachtung nötig.
Wer Intraday z.B. Futures tradet dann wahrscheinlich schon, doch auch hier bitte den übergeordneten Zeitrahmen beachten.
Viele Grüße
Roti
Hallo,
zurück zum Thema sonst sind wir wieder in einer "Sinn und Unsinn eines solchen Systems" Diskussion. Es geht ja nur um eine Programmierfrage.
Mr_Aegon, Du hast im Systemtester im Edit-Fenster für das System einen Button, der heißt "Stops...". Den drück mal und wähle das Inactivity Register aus.
Da kannst Du einstellen, nach wieviel Tagen unterhalb einer bestimmten Schwelle ausgestiegen werden soll. Also wenn innerhalb von x-Perioden der Minimum Change nicht erreicht wurde, dann greift der Stop. Nun stellst Du also den Minimum Change so hoch es geht und stellst Deine Periode auf 10. So wirst Du auf jeden Fall nach 10 Tagen rausgeworfen.
Mit den Options kannst Du dann noch einstellen, ob Du zum Open, High, Low oder Close des nächsten Bar rausgeworfen werden willst. In Deinem Fall wohl Open. Der Rest ist eh unrealistisch, höchstens noch der Close wenn man will. Stell vielleicht die Periode auf 9 und nimm dann den Closekurs, so wirst Du noch zum Close des eigentlichen 10. Tages rausgeschmissen und kannst so den Ausstieg zum Tagesende simulieren. Wenn ich nach 10 Tagen raus will, dann nehme ich keine Overnightschwankungen mehr in Kauf.
Viele Grüße
Die vorgeschlagene Lösung hat den kleinen Nachteil daß sie sich auf alle Systeme auswirkt, ich habe mich damit schon öfters selbst verwirrt.
Eine andere Möglichkeit wäre in den CLOSE LONG codetab den exit zu schreiben. Falls du das System "gemacht" hast, das im Buch von Chande breitgetreten wird, sollte das so funktionieren;
longentry:=sum(C>MOV(C,65,S),3)=3;
BARSSINCE(longentry)=10
Ich habe noch kein Buch über Handelssysteme gelesen, das mit solch einfallslosen und dürftigen Beispielsystemen arbeitet wie Chande.
Gruß Rock
Hi,
und vielen Dank für die Hilfen.
@ Termintrader
Man darf nicht. Ich verstehe diese Frage kaum. Mir wäre es lieber gewesen Du hättest einen Code reingestellt bzw. den Button/Reiter beschrieben wo wie ich diesen Zeitstop finde.
@ Gautama2
Hilft mir bestimmt in Zukunft weiter. Bin aber noch nicht zum Nachvollziehen gekommen, da ich voll an Rocks eleganter Formel hängengeblieben bin und versuche sie zu begreifen.
@ Rock
Ja das mit Chande stimmt. Doch lieber wurstle ich damit rum als dass ich passiv gar nichts tue. In dieser Form habe ich die Formeln noch nie gesehen, eben als Anfänger; Zwei = in einer Zuweisung.
Zum Beispiel die Zuweisung longentry:=sum(C>MOV(C,65,S),3)=3;
Korrigiert mich bitte wenn ich falsch liege. Die Auswertung geschieht scheinbar so. Zuerst werden 3 vergangene Kurse über der 65er gesucht, also Mov (....) soll eine 1 sein => über 3 Perioden hat man dann sum (1+1+1) dieses Ergebnis ist 3 wenn es 3 Kurse über der 65 er gibt.
Gleichzeitig ist die Forderung rechts eine 3 zu setzen d. h. es ist 3=3 gewünscht. Diese Bedingung ist dann wahr.
Bekommt nun Longentry den Wert wahr d.h eine 1 ? (das ist der Knackpunkt und nämlich nicht die 3 meiner Meinung nach).
Dann ist die Bedingung erfüllt und Enter long wird ausgelöst.
Liege ich richtig ? Dann wärs toll.
Dann close long
wie üblich longentry=...(Leider muß ich die Variable erneut angeben. MS schafft es nicht das aus Enter long zu holen)
Dann bei Barssince wird gefordert, dass longentry 10 mal wahr ist (der Clou) und fertig.
Es fehlt aber das Crossover. Das habe ich versucht mit einzubauen aber ich komme nicht auf meine alten Ergebnisse.
----------------------------------------------------------------------------
Hier ist aber nun mein Code wie ich ihn gemacht habe, ergänzt um die gute Idee mit den Barssince.
Ist so der Code in Ordung ?
Enter long:
X1:=Ref(CLOSE,-3) >Ref(Mov(CLOSE,65,SIMPLE),-3);
X2:=Ref(CLOSE,-2) >Ref(Mov(CLOSE,65,SIMPLE),-2);
X3:=Ref(CLOSE,-1) >Ref(Mov(CLOSE,65,SIMPLE),-1);
X4:=Ref(Cross(CLOSE,Mov(CLOSE,65,SIMPLE)),-4);
X1 AND x2 AND x3 AND x4
Close long:
X1:=Ref(CLOSE,-3) >Ref(Mov(CLOSE,65,SIMPLE),-3);
X2:=Ref(CLOSE,-2) >Ref(Mov(CLOSE,65,SIMPLE),-2);
X3:=Ref(CLOSE,-1) >Ref(Mov(CLOSE,65,SIMPLE),-1);
X4:=Ref(Cross(CLOSE,Mov(CLOSE,65,SIMPLE)),-4);
X1 AND x2 AND x3 AND x4;
BarsSince(x1 AND x2 AND x3 AND x4)=10
Analog vorzeichenberücksichtigt die anderen Reiter.
Mit freundlichen Grüßen
Mr_Aegon
Hallo!
Du hast recht, ich habe in meiner Formel vergessen das eigentliche crossing abzuprüfen. Das hieße dann:
{Enter Long}
longentry:=Sum(C>Mov(C,65,S),3)=3 AND Cross(Ref(C,-4),Ref(Mov(C,65,S),-4));
longentry
{Close Long}
longentry:=Sum(C>Mov(C,65,S),3)=3 AND Cross(Ref(C,-4),Ref(Mov(C,65,S),-4));
BarsSince(longentry)=10
Dann sind die Ergebnisse identisch mit deiner Formel.
Ich habe nochmal ins Buch gesehen, ich denke daß der entry einen Tag zu spät kommt, weil der Tag des crossings bei Chande schon in den 3 Tagen enthalten ist. Dann könnte man auf das crossing am drittletzten Tag abprüfen. Ist aber sowieso reine Definitionssache, das brauchst du nur wenn du seine Ergebnisse exakt nachvollziehen willst. Ich sehe auch daß er den Einstieg zum Open des 4. Tages empfiehlt, das wäre dann:
{Enter Long}
longentry:=Sum(C>Mov(C,65,S),3)=3 AND Cross(Ref(C,-3),Ref(Mov(C,65,S),-3));
longentry
{Close Long}
longentry:=Sum(C>Mov(C,65,S),3)=3 AND Cross(Ref(C,-3),Ref(Mov(C,65,S),-3));
BarsSince(longentry)=10
und in "options" den entry auf Open und delay auf 0.
bzw. in deiner Formel die Referenz auf den 4. Tag weglassen und am drittletzten Tag auf das crossing prüfen.
Wie die sum Formel funktioniert hast du genau richtig interpretiert! Sie ist praktisch weil sie 2 Dinge gleichzeitig tut. Die "3" in der Klammer bedeutet: Untersuche die 3 zurückliegenden Bars. der Ausdruck longentry ist wahr wenn die Summenformel 3 ergibt.
Zum Verständnis:
TRUE und 1 ist für MS dasselbe.
Der Ausdruck
longentry
bedeutet dasselbe wie
longentry=1
eine Kleinigkeit noch:
In deiner originalen Close Long Formel kann die Zeile
X1 AND x2 AND x3 AND x4;
entfallen, sie hat keine Funktion.
Viel Spaß!
Gruß Rock
Hi,
Habe eine „kleine 1) Dienstleistung“ , dafür aber auch eine 2) Frage
Zu 1) möchte nochmal auf meinen Systemausstieg nach n= 10 Tagen zurückkommen.
Rocks Formel (mein Dank dafür) stimmt dann mit meiner überein und bringt die gleichen Ergebnisse, wenn ich in seiner Formel 1 Tag weniger nehme.
Dann kaufe ich heute.
Enter long:
longentry:=Sum(Ref(C,-1)>Ref(Mov(C,65,S),-1),3)=3 AND Cross(Ref(C,4),Ref(Mov(C,65,S),-4));
longentry
close long:
longentry:=Sum(Ref(C,-1)>Ref(Mov(C,65,S),-1),3)=3 AND Cross(Ref(C,4),Ref(Mov(C,65,S),-4));
longentry;
BarsSince(longentry)=10
------------------------------------------------------------------------------
Ich bin der Meinung dass bei Sum(...,3) der heutige Tag mitgezählt wird.
Was ist aber wenn der heutige Tag an der Börse noch läuft ?
Wie wird sich die Summenfunktion entscheiden, wenn der Schlusskurs nicht bekannt ist.
Dieser müsste 0 oder nicht definiert sein aber es kommt mit Sicherheit nicht 1 raus
Also kommt in der Summe nicht 3 raus, wenn die Bedingung erfüllt sein soll.
Dagegen mit Sum (Ref(...,-1)... REf(...,-1),3) kommt 3 raus.
-----------------------------------------------------------------------------------------------------------------
Nochmal zum System: Dieses System hat aber eine kleine Verfälschung.
Es kam eine seltene Konstellation vor, wo das Signal griff, die Zählerei der Barsinnce-Funktion schon lief und mitten drin erneut ein Signal kam mit der Konsequenz das halt dann die Barssince mit der Zählerei von vorne anfängt. Das bedeutet es geht nicht nach 10 Tagen raus, sondern z.B. nach 19 Tagen.
Diesen Fehler wurde erkannt. Wie behebt man ihn aber ?
Ein versierter Programmierer kann das vielleicht abfangen.
Lösung würde mich interessieren. Kann und will sie selbstverständlich nicht verlangen.
2) Eigentlich würde ich gleich gerne weiter wursteln, und deshalb gleich die nächste Aufgabe machen, und auch noch gerne wissen wie man einen Vola-stop einstellen oder programmieren. Die schlechten Ergebnisse und das ohne Gebühren können nämlich nur noch besser werden.
Kann man einen Vola-Stop mit Tricksen einstellen ?
Ich habe im Stop Button nachgeschaut. Ich denke nicht.
Aber evtl. programmieren ?
Wie hieße denn die Formel für die 15 tägige Kursspanne.
Oder kennt ihr mir zu diesem System eine andere passende Vola-Stop Formel nennen?
Mit freundlichen Grüßen
Mr_Aegon
Hallo,
zur Summenformel:
Du hast recht, der aktuelle bar wird mitgezählt. Wenn z.B. intraday um 12 Uhr Daten aktualisiert worden sind, dann ist CLOSE eben der Kurs von 12 Uhr.
Ich glaube ich hatte auch schon geschrieben daß lt. dem Buch am nächsten Tag zum Open gekauft wird, damit erledigt sich das Problem von selbst. Wenn man am selben Tag zum Close kaufen will muß man wirklich bis zum Schlusskurs abwarten und dann prüfen ob sich ein Signal ergeben hat.
Zum Stop, probiere mal noch
C < Ref(LLV(L,15),-1)
d.i. das untere Ende eines 15 Tage Price channel.
Zu der Ungereimteheit mit barssince: Du hast recht! Ist eine der kleinen Gemeinheiten von Metastock. Mit Easy language (von der Konkurrenz Tradestation) könnte man einfach das Kaufdatum in einer Variablen ablegen und das Problem wäre keines.
Es gibt wohl Tricks um das Problem mit Metastock zu umgehen. Ich bin noch kein MS-Profi und durchschaue allerdings die Zusammenhänge noch nicht soweit um das hier lückenlos darzulegen.
Vielleicht kann Metatrader mal hierzu was sagen und eine Musterlösung dokumentieren!
Gruß Rock
Hallo,
hier eine mögliche Umsetzung Deines "Systems" als Expert mit Stopp:
Highlight Long
Acceleration:=0.04;
ATRVal:=Mov(ATR(1),10,E);
lma:=Mov(C,65,S);
EL:=Sum(C>lma,3)=3 AND BarsSince(Cross(C,lma))=4;
ES:=Sum(C<lma,3)=3 AND BarsSince(Cross(lma,C))=4;
I:=Cum(EL+ES>-1)=1;
TradeBars:=If(BarsSince(I+EL)<BarsSince(I+ES),BarsSince(I+EL),BarsSince(I+ES));
TrailLong:=LLV(L,15)+Acceleration*ATRVal*TradeBars;
TrailShort:=HHV(H,15)-Acceleration*ATRVal*TradeBars;
CL:=BarsSince(I+EL)=10 OR ((BarsSince(I+EL)<BarsSince(I+EL)) AND (C<TrailLong)) OR Cross(lma,C);
CS:=BarsSince(I+ES)=10 OR ((BarsSince(I+EL)>BarsSince(I+EL)) AND (C>Trailshort)) OR Cross(C,lma);
State:=If(Cum(1)=1,0,If(EL,1,If(ES,-1,If((CL AND PREV=1) OR (CS AND PREV=-1),0,PREV))));
State=1
Highlight Short
Acceleration:=0.04;
ATRVal:=Mov(ATR(1),10,E);
lma:=Mov(C,65,S);
EL:=Sum(C>lma,3)=3 AND BarsSince(Cross(C,lma))=4;
ES:=Sum(C<lma,3)=3 AND BarsSince(Cross(lma,C))=4;
I:=Cum(EL+ES>-1)=1;
TradeBars:=If(BarsSince(I+EL)<BarsSince(I+ES),BarsSince(I+EL),BarsSince(I+ES));
TrailLong:=LLV(L,15)+Acceleration*ATRVal*TradeBars;
TrailShort:=HHV(H,15)-Acceleration*ATRVal*TradeBars;
CL:=BarsSince(I+EL)=10 OR ((BarsSince(I+EL)<BarsSince(I+EL)) AND (C<TrailLong)) OR Cross(lma,C);
CS:=BarsSince(I+ES)=10 OR ((BarsSince(I+EL)>BarsSince(I+EL)) AND (C>Trailshort)) OR Cross(C,lma);
State:=If(Cum(1)=1,0,If(EL,1,If(ES,-1,If((CL AND PREV=1) OR (CS AND PREV=-1),0,PREV))));
State=-1
Symbol Enter Long
Acceleration:=0.04;
ATRVal:=Mov(ATR(1),10,E);
lma:=Mov(C,65,S);
EL:=Sum(C>lma,3)=3 AND BarsSince(Cross(C,lma))=4;
ES:=Sum(C<lma,3)=3 AND BarsSince(Cross(lma,C))=4;
I:=Cum(EL+ES>-1)=1;
TradeBars:=If(BarsSince(I+EL)<BarsSince(I+ES),BarsSince(I+EL),BarsSince(I+ES));
TrailLong:=LLV(L,15)+Acceleration*ATRVal*TradeBars;
TrailShort:=HHV(H,15)-Acceleration*ATRVal*TradeBars;
CL:=BarsSince(I+EL)=10 OR ((BarsSince(I+EL)<BarsSince(I+EL)) AND (C<TrailLong)) OR Cross(lma,C);
CS:=BarsSince(I+ES)=10 OR ((BarsSince(I+EL)>BarsSince(I+EL)) AND (C>Trailshort)) OR Cross(C,lma);
State:=If(Cum(1)=1,0,If(EL,1,If(ES,-1,If((CL AND PREV=1) OR (CS AND PREV=-1),0,PREV))));
State=1 AND Ref(State,-1)<1 {EL}
Symbol Enter Short
Acceleration:=0.04;
ATRVal:=Mov(ATR(1),10,E);
lma:=Mov(C,65,S);
EL:=Sum(C>lma,3)=3 AND BarsSince(Cross(C,lma))=4;
ES:=Sum(C<lma,3)=3 AND BarsSince(Cross(lma,C))=4;
I:=Cum(EL+ES>-1)=1;
TradeBars:=If(BarsSince(I+EL)<BarsSince(I+ES),BarsSince(I+EL),BarsSince(I+ES));
TrailLong:=LLV(L,15)+Acceleration*ATRVal*TradeBars;
TrailShort:=HHV(H,15)-Acceleration*ATRVal*TradeBars;
CL:=BarsSince(I+EL)=10 OR ((BarsSince(I+EL)<BarsSince(I+EL)) AND (C<TrailLong)) OR Cross(lma,C);
CS:=BarsSince(I+ES)=10 OR ((BarsSince(I+EL)>BarsSince(I+EL)) AND (C>Trailshort)) OR Cross(C,lma);
State:=If(Cum(1)=1,0,If(EL,1,If(ES,-1,If((CL AND PREV=1) OR (CS AND PREV=-1),0,PREV))));
State=-1 AND Ref(State,-1)>-1 {ES}
Symbol Close long
Acceleration:=0.04;
ATRVal:=Mov(ATR(1),10,E);
lma:=Mov(C,65,S);
EL:=Sum(C>lma,3)=3 AND BarsSince(Cross(C,lma))=4;
ES:=Sum(C<lma,3)=3 AND BarsSince(Cross(lma,C))=4;
I:=Cum(EL+ES>-1)=1;
TradeBars:=If(BarsSince(I+EL)<BarsSince(I+ES),BarsSince(I+EL),BarsSince(I+ES));
TrailLong:=LLV(L,15)+Acceleration*ATRVal*TradeBars;
TrailShort:=HHV(H,15)-Acceleration*ATRVal*TradeBars;
CL:=BarsSince(I+EL)=10 OR ((BarsSince(I+EL)<BarsSince(I+EL)) AND (C<TrailLong)) OR Cross(lma,C);
CS:=BarsSince(I+ES)=10 OR ((BarsSince(I+EL)>BarsSince(I+EL)) AND (C>Trailshort)) OR Cross(C,lma);
State:=If(Cum(1)=1,0,If(EL,1,If(ES,-1,If((CL AND PREV=1) OR (CS AND PREV=-1),0,PREV))));
State=0 AND Ref(State,-1)=1 {CL}
Symbol Close Short
Acceleration:=0.04;
ATRVal:=Mov(ATR(1),10,E);
lma:=Mov(C,65,S);
EL:=Sum(C>lma,3)=3 AND BarsSince(Cross(C,lma))=4;
ES:=Sum(C<lma,3)=3 AND BarsSince(Cross(lma,C))=4;
I:=Cum(EL+ES>-1)=1;
TradeBars:=If(BarsSince(I+EL)<BarsSince(I+ES),BarsSince(I+EL),BarsSince(I+ES));
TrailLong:=LLV(L,15)+Acceleration*ATRVal*TradeBars;
TrailShort:=HHV(H,15)-Acceleration*ATRVal*TradeBars;
CL:=BarsSince(I+EL)=10 OR ((BarsSince(I+EL)<BarsSince(I+EL)) AND (C<TrailLong)) OR Cross(lma,C);
CS:=BarsSince(I+ES)=10 OR ((BarsSince(I+EL)>BarsSince(I+EL)) AND (C>Trailshort)) OR Cross(C,lma);
State:=If(Cum(1)=1,0,If(EL,1,If(ES,-1,If((CL AND PREV=1) OR (CS AND PREV=-1),0,PREV))));
State=0 AND Ref(State,-1)=-1
Pardon,
beim Posten ging mir im Code das Minuszeichen verloren.
Es heißt bei Cross statt Ref(c,4) natürlich Ref (c,-4).
Danke für die Resonanz.
mfg
Mr_Aegon
Hi,
würde gerne noch ein Trailingstop von einem Forumsteilnehmer backtesten. Aber es klappt nicht "so recht".
Zunächst wurde mir der Trainlingstop mitgeteilt. Er soll im Indicator Builder eingegeben werden.
atrs:=10;
factor:=1.5;
stoplong:=If(H>Ref(H,-1),H-ATR(atrs)*factor,PREV);
stopshort:=If(LRef(Mov(C,65,S),-1),3)=3
AND Cross(Ref(C,-4),Ref(Mov(C,65,S),-4));
longentry
Close long longentry:=Sum(Ref(C,-1)>Ref(Mov(C,65,S),-1),3)=3
AND Cross(Ref(C,-4),Ref(Mov(C,65,S),-4));
longentry;
Fml("mein Atr trailing stop1");
C 1 Tag nach dem Signaltag also sofort ausgestopt wird.
Ein ausgemachter Blödsinn der unbedarften Anfängern passiert.
Beim Einstreuen eines Befehles:
xy:=If(BarsSince(longentry=1) AND CRef(Mov(C,65,S),-1),3)=3
AND Cross(Ref(C,-4),Ref(Mov(C,65,S),-4));
longentry;
Fml("mein Atr trailing stop1");
xy:=If(BarsSince(longentry=1) AND C
Hallo, Mr_Aegon
Da habe ich wohl etwas unglücklich agiert mit dem Einstellen des Stops.
Dieser Stop war eher als Beispiel für eine denkbare Stop-Logik gedacht. So wie der Indikator sich darstellt ist er ein stop-and-reverse System ähnlich dem Parabolic SAR, halt mit einer anderen Berechnungsweise.
So hat er keinen Bezug zu dem 65sma System.
Habe mich mal hingesetzt und ihn darauf hin angepasst für den Metastock Systemtester. Der code ist wahrscheinlich gut verständlich bis auf die Sache mit der Variablen "init". Sie ist aber notwendig, sonst werden falsche Ergebnisse geliefert. Die Anwendung dieser Init Variablen habe ich von den MS-cracks abgekupfert und muß sie erst selbst noch richtig durchschauen, also bitte nimm diese Programmiertechnik erstmal als gegeben hin, ohne das gehts wirklich nicht.
Der Stop ist vielleicht in seiner Grundform für ein langfristiges Trendfolgesystem zu eng, aber da kann man ja mit den Variablen spielen. Das System selber verliert natürlich permanent in Seitwärtsmärkten, aber das dürfte eigentlich klar sein.
Also erstmal zum Einzeichnen des stops den code für den Indicator Builder:
{Trailingstop ATR High für 65sm3cc System}
longentry:=Sum(Ref(C,-1)>Ref(Mov(C,65,S),-1),3)=3 AND Cross(Ref(C,-4),Ref(Mov(C,65,S),-4));
shortentry:=Sum(Ref(C,-1)Ref(H,-1),H-ATR(atrs)*factor,PREV);
stopshort:=If(L -1)=1;
stop:=If(BarsSince(longentry OR init)Ref(Mov(C,65,S),-1),3)=3 AND Cross(Ref(C,-4),Ref(Mov(C,65,S),-4));
shortentry:=Sum(Ref(C,-1)Ref(H,-1),H-ATR(atrs)*factor,PREV);
stopshort:=If(L -1)=1; {Init Variable damit der Stop das erste Signal erkennt}
stop:=If(BarsSince(longentry OR init)Ref(Mov(C,65,S),-1),3)=3 AND Cross(Ref(C,-4),Ref(Mov(C,65,S),-4));
shortentry:=Sum(Ref(C,-1)Ref(H,-1),H-ATR(atrs)*factor,PREV);
stopshort:=If(L -1)=1; {Init Variable damit der Stop das erste Signal erkennt}
stop:=If(BarsSince(longentry OR init) stop
Viel Spaß damit
Rock
Gerade sehe ich daß mir beim Kopieren der Formeln was durchgerutscht ist, also hier nochmal vollständig die Formeln für den System Tester:
{Enter Long}
longentry:=Sum(Ref(C,-1)>Ref(Mov(C,65,S),-1),3)=3 AND Cross(Ref(C,-4),Ref(Mov(C,65,S),-4));
longentry
{Close Long}
longentry:=Sum(Ref(C,-1)>Ref(Mov(C,65,S),-1),3)=3 AND Cross(Ref(C,-4),Ref(Mov(C,65,S),-4));
shortentry:=Sum(Ref(C,-1)<Ref(Mov(C,65,S),-1),3)=3 AND Cross(Ref(Mov(C,65,S),-4),Ref(C,-4));
atrs:=10;
factor:=1.5;
stoplong:=If(H>Ref(H,-1),H-ATR(atrs)*factor,PREV);
stopshort:=If(L<Ref(L,-1),L+ATR(atrs)*factor,PREV);
init:=Cum(longentry+shortentry > -1)=1; {Init Variable damit der Stop das erste Signal erkennt}
stop:=If(BarsSince(longentry OR init)<BarsSince(shortentry OR init),stoplong,stopshort);
C<stop
{Enter Short}
shortentry:=Sum(Ref(C,-1)<Ref(Mov(C,65,S),-1),3)=3 AND Cross(Ref(Mov(C,65,S),-4),Ref(C,-4));
shortentry
{Close Short}
longentry:=Sum(Ref(C,-1)>Ref(Mov(C,65,S),-1),3)=3 AND Cross(Ref(C,-4),Ref(Mov(C,65,S),-4));
shortentry:=Sum(Ref(C,-1)<Ref(Mov(C,65,S),-1),3)=3 AND Cross(Ref(Mov(C,65,S),-4),Ref(C,-4));
atrs:=10;
factor:=1.5;
stoplong:=If(H>Ref(H,-1),H-ATR(atrs)*factor,PREV);
stopshort:=If(L<Ref(L,-1),L+ATR(atrs)*factor,PREV);
init:=Cum(longentry+shortentry > -1)=1; {Init Variable damit der Stop das erste Signal erkennt}
stop:=If(BarsSince(longentry OR init)<BarsSince(shortentry OR init),stoplong,stopshort);
C > stop
@ Rock
Habe Dein Stop eingetippt und versucht einigermaßen zu verstehen. Ja es scheint so als ob die Barssincen-Zähler für Long und Short immer wieder zurückgesetzt werden und sich dann jeden Tag für die "richtige Seite" stoplong/stopshort entscheiden müssen und damit den Stopp füttern.
Du hast recht Init scheint tatsächlich wichtig zu sein um den ersten Stop zu finden. Ich habe mir das so erklärt nur bei Long: am allerersten Tag z.B. (22.4) dürfte init 1 (geht aus der Eigenheit der Init-Variable hervor) werden => longentry or init wird 1 d.h wir haben wahr.
Am Tag danach (23.4) ist aber Init 0 (geht aus der Init-Variable hervor).=> longentry or init wird 0.
Barssince zählt aber „seitdem es wahr war-Aussage“ d.h. seit es 1 war.
Und das heißt da wir eine 0 haben fängt Barssince zu zählen an und hat am 23.4 eine 1, am 24.4 (longentry or Init ist wieder 0, da Init 0 ist, und kein Long-signal vorliegt) also Barssince hat am 24.4. dann eine 2 usw. Kommt am 25.4 ein Longsignal ist die „seitdem es wahr war-Aussage“ verletzt.
Es wird das Signal ausgelöst und Barssince wieder auf 0 gesetzt, weil ja longentry or init jetzt 1 ist.
Ich kann mir nicht helfen, aber so muß es sein.
Ich werde den ATR trailing stop jetzt mal testen und auch mal mit den Variablen spielen. Man sieht Programmieren ist eine ganz andere Dimension.
Vielen Dank noch mal für Deine große Hilfe.
mfg
Mr_Aegon