Autor |
|
_ulrich
Administrator
Dabei seit: 12 2001
Herkunft: User altes Forum
Beiträge: 13
|
|
gibt es eine möglichkeit die zustände eines handelssystems im rs als filter anzeigen zu lassen? flat eine farbe, long ein farbe short eine farbe, enter market eine farbe, exit eine farbe. besondere schwierigkeiten hat mir die darstellung gemacht das das signal enter market nur einmal kommt und nicht wenn die bedinung am zweiten tag auch noch erfüllt ist weiter erscheint. vieleicht hat jemand eine idee für den el code. vielen dank im voraus.
|
|
23.02.2001, 09:10 |
|
_Uwe
Administrator
Dabei seit: 12 2001
Herkunft: User altes Forum
Beiträge: 313
|
|
Hallo, Ulrich,
die prinzipielle Lösung Deiner Aufgabe, Positionierungszustände im Radar Screen anzuzeigen, besteht darin, daß Du einen (Radar-)Indikator schreibst, der das gleiche Grundgerippe hat, wie Dein Handelssystem.
Als Änderung mußt Du die Variable der Markposition (MarketPosition) als eigen definierte Variable nachbilden und den Wert (z.B. -1 | 0 | +1 ) nach Ergbenis Deiner bisherigen Bedingungsabfragen setzen.
Beispiele:
aus den Signal-Code-Zeilen
if average(close, 5)-average(close, 35))/close >=buyprcnt then buy at market;
if average(close, 5)-average(close, 35))/close <=sellprcnt then sell at market;
if average(close, 5) cross below average(close, 35) and Marketposition>0 then EXITLONG;
if average(close, 5) cross over average(close, 35) and Marketposition<0 then EXITSHORT;
wird mit der Variablien-Definition:
vars: mp(0);
if average(close, 5)-average(close, 35))/close >=buyprcnt then mp=1;
if average(close, 5)-average(close, 35))/close <=sellprcnt then mp=-1;
if average(close, 5) cross below average(close, 35) and mp>0 then mp=0;
if average(close, 5) cross over average(close, 35) and mp<0 then mp=0;
Nun kannst Du den Wert von mp nutzen, um diesen im einfachsten Fall als plot1 anzeigen zu lassen oder eben, nach Deinen Vorstellungen, den entsprechenden RadarSrceen-Layout der Zelle zu gestallten.
Komplexer wird die Situation bei "Stop"-Aktionen und bei Management-Auswertungen auf der Grundlage von Gewinn-/Verlustbetrachtungen und reflektionen auf den Einstiegskurs/-zeitpunbkt, die im Quellcode umzusetzen sind.
Wenn detaillierte Fragen dazu sind, hängt dies vom gesamtaufbau Deines umzusetzenden Systems ab.
Gruß Uwe
|
|
23.02.2001, 10:10 |
|
_ulrich
Administrator
Dabei seit: 12 2001
Herkunft: User altes Forum
Beiträge: 13
|
|
hallo uwe, bist du uwe richtsteig? vielen dank für deine idee. leider bin ich mit dem ploten total eingegangen. kenns du dich mit den plot statements aus? auch bei 3 zu ständen. anbei soweit ich gekommen bin. bitte nicht lachen ich bin noch im lern statdium. viele grüße ulrich
Inputs: Price(close), Length1(80),Length2(1), StdDevUp(2), verkaufsignal(Red), kaufsignal(Blue), keinsignal(LightGray), notindtheMarket(Yellow), intheMarket(Green); Variables:F1(""),F2(""),mp(0);
If average(close,length2) cross over BollingerBand(Price, Length1, StdDevUp) Then mp=1; {enter the market long} If average(close,length2) cross below average(close,Length1) then mp=2; {exitlong market} if mp=1 and (average(close,length2) > average(close,Length1)) then mp=3; {in the market} if (average(close,length2) > average(close,Length1)) and mp=2 then mp=0; {not in the market}
Begin plot1=mp if plot1 = 1 then SetPlotColor(1,blue); if plot1 = 2 then setplotcolor(1,red); if plot1 = 0 then setPlotColor(1,LightGray); plot2=mp if plot2 = 3 then SetPlotColor(2,green); if plot2 = 0 then SetPlotColor(2,Yellow); End;
|
|
23.02.2001, 22:10 |
|
_Uwe
Administrator
Dabei seit: 12 2001
Herkunft: User altes Forum
Beiträge: 313
|
|
besonderen PositionStatus im Radar Screen | |
Hallo, Ulrich!
Für die erste lauffähige Darstellung, habe ich Deine Vorgaben etwas umgestrickt, wobei ich die Logik nicht überprüft habe.
Da Du zdem Variablienname vergeben hast, deren Bedeutung ich aius dem Zusammenhang nicht erkenne, habe ich zudem eine entsprechende, auf diese Darstellung bezogene Neugliederung der Inputlist und Variablenlist vorgenommen.
Im ersten Moment mag der Quellcode für die ersten Schritte in EL komplex erscheinen, ist er aber nicht, wenn man sich folgenden Ablauf vorstellt:
Beim Einlesen des ersten Bars (CurrentBar = 1), werden vier farbige Wimpel erstellt (array: CellColor[4](0), CellInfo[4]), die mit entsprechenden Infos beschriftet werden. Die Farbwahl wird nach den Inputgrößen gesetzt. Nun Steht als Wimpel 0 eine Element mit gelben Hintergrund und der Beschriftung "Neutral" zur verfügung und auch die anderen Element 1 bis 3 stehen "griffbereit" zur Verfügung. Mit der "Umklammerung"
if CurrentBat=1 then begin ... Anweisungen... end;
wird erreicht, das diese "Vorarbeit nur einmal zum Beginn des Einlesens einer jeden Datenreihe durchgeführt wird.
Das setzten von Werten, die aus der Berechnung einer Funktion ermittelt wurden, ist mehr oder weniger eine Frage des persönlichen "Geschmacks", wobei es um so ratsammer wir, so zu verfahren, je öfter die gleiche Berechnung in einem Durchkang durchgeführt werden muß (hier z.B. mit av1 und av2, die, wenn sie nicht als Variable gesetzt werden, jeweils drei- bzw. viermal neu berechnet werden müssen, je Bar!)
Die Wertezuweisung für für mp habe ich Deinen Gedanken nach unverändert übernommen. Die Logik und damit die Programmstruktur ist vermutlich noch überarbeitungswürdig.
Als "Krönung kommt nun die Plot-Anweisung, die, da wir nur noch unsere "Fähnchen" je nach Wert von mp herausholen unds setzen müssen, sich in eine Zeile schreiben läßt: plo1(Ausgabeinhalt [, "PlotName(opt.)"[, Vordergrundfarbe [, Hintergrundfarbe [, Liniendicke]]]] );
wobei der Ausgabeinhalt unsere Wimpelbeschriftung ist und die Hintergrundfarbe eben die Farbe der Fahne ist. Dazwischen muß die Vordergrundfarbe beschrieben werden, wenn man die Hintergrundfabe in dieser Anweisung manipulieren möchte, was hier mit dem Werd Default geschen ist, womit die aktuelle Grundeinstellung der Schriftfarbe der Zelle bzw. des Plots gesetzt wird.
Doch nun zum Programmcode:
inputs: Price(close), Length1(80), Length2(1), StdDevUp(2), colorExitSign(Red), colorEntrySign(Blue), colorNotInTheMarket(Yellow), colorInTheMarket(Green);
Variables: av1(0), av2(0), bb(0), mp(0); array: CellColor[4](GetBackGroundColor), CellInfo[4]("");
if Currentbar=1 then begin CellColor[0]=colorNotInTheMarket; CellInfo[0]="Neutral";
CellColor[1]=colorEntrySign; CellInfo[1]="Enter Long at Market";
CellColor[2]=colorExitSign; CellInfo[2]="Exit Long";
CellColor[3]=colorInTheMarket; CellInfo[3]="Long"; end;
av1 = average(close,length1); av2 = average(close,length2); bb = BollingerBand(Price, Length1, StdDevUp);
If av2 cross over bb then mp = 1; {enter the market long} If av2 cross below av1 then mp = 2; {exitlong market}
if (mp = 1) and (av2 > av1) then mp=3; {in the market} if (mp = 2) and (av2 > av1) then mp=0; {not in the market}
plot1(CellInfo[mp],"",Default, CellColor[mp]);
Eine weitere möglichkeit die Hintegrundfarbe eines Plots zu verändern ist die, über die Funktion: SetPlotBGColor( numPlot, hgFarbe ); zu gehen, wodurch die Plotanweisung im Programm in zwei Anweisungen zerfällt:
plot1(CellInfo[mp]); SetPlotBGColor( 1, CellColor[mp]);
Ich hoffe, daß nun der nächste Schritt getan werden kann, für den ich viel Erfolg wünsche Uwe
P.S. Bei der Erstellung des Indikators darauf achten, daß im freien Menü unter (Indicator) Properties (erreichbar auch über Datei - Properties...), der Eintrag RadarScreen auf der Registerkarte Applications markiert ist.
|
|
24.02.2001, 13:10 |
|
Jo Haas
Super Moderator
Dabei seit: 12 2001
Herkunft: Schwaigern B.-W.
Beiträge: 130
|
|
Hi Uwe
"good job" und du wirst uns noch alle zum "akkuraten Programmieren" erziehen :-)) (in Bezug auf Variable und Arrays definieren u.s.w.)
Nur einen Hinweis vermisse ich in deiner Ausführung.
Der Parameter "load additional data for accumulative calculations" sollte durch interpolieren ermittelt werden (long signale beachten). Im gegebenen Beispiel ist ein Wert von 20 OK wird jedoch StdDev z.B. auf 2.5 eingestellt, ist ein Wert von 50 additional bars notwendig.
Gruss Jo
|
|
24.02.2001, 16:10 |
|
_ulrich
Administrator
Dabei seit: 12 2001
Herkunft: User altes Forum
Beiträge: 13
|
|
|
24.02.2001, 20:10 |
|
_ulrich
Administrator
Dabei seit: 12 2001
Herkunft: User altes Forum
Beiträge: 13
|
|
|
24.02.2001, 21:10 |
|
_Uwe
Administrator
Dabei seit: 12 2001
Herkunft: User altes Forum
Beiträge: 313
|
|
Von der Idee zum Programm | |
Hallo, Ulrich!
Nun haben wir fast alle Schritte bis zu einem Programm ausgeführt und Jo wird seinen ergänzenden Hinweis für Fortgeschrittene noch zu gegebener Zeit vertiefend erläutern ;-) - wir stecken hier noch in den Anfängen, Jo -, da müssen wir doch noch ein Schritt zurückgehen und uns um die Logik kümmern.
Um eine Idee zu visualisieren, Bilde ich mir gerne die Entsprechenden Indikatoren ab, um erkennen zu können, was eigentlich gewollt ist. Mit Deiner Checkliste: "Was ist, was sollte sein", kann man natürlich genauso gut operieren.
Hier nun einmal ein DAX-Chart (vermute Du gehst mehr auf die Einzerlwerte, so daß dort die Parameter vielleicht sinnvoller sind)
Das Indikatorfenster stellt die Kurvenverläufe der Deiner verwendeten Variablien dar.
Die Mittellinie der Bollinger-Bänder, hier auch gleich Deine Variable av1 ist als blaue Linie dargestellt. Die beiden Bollingerbänder sind dazu mit einem, durch die Standardabweichung bestimmten Abstand gelegt, wovon das obere eben der Variablen bb entspricht. Die Preiskurve ist mit av2 der gewählten Länge Length2 = 1 entsprechend die Close-Kurve des betrachteten Symbols. Die farbige Darstellung der Linie, sowie die blaue und rote Punktierung im Linienverlauf, sind durch die vier Bedingungen erzwungen (diesmal mit entsprechend abgewandelter Logik).
Ein blauer Punkt wird gesetzt, wenn das obere BollingeBand durch den Wert von av2 (Preise) durchstoßen wurde. Es ist somit das EntrySignal, das die entsprechende Farbmarkierung, die für colorEntrySign gewählt wurde, erhält. Durch die Abfrage
If av2 cross over bb then mp = 1;
wird dieser Wunsch der Farbwahl dem Programm mitgeteilt.
Anschließend wurde jedoch bisher, da ja die Bedingung für mp=1 erfüllt wurde, in einer nächsten Anweisung
if (mp = 1) and (av2 > av1) then mp=3;
der Wert von mp auf 3 abgeändert, wenn erkannt wird, das der Preis (av2) ÜBER der Average-Line (mittlere blaue Line hier auch gleich Mittelline der BollingerBänder) liegt. Nun das tut er wohl immer, wenn er die um die Standardabweichung nach oben aufgeweitete Average-Line (av1) hier gleich oberes Bollinger-Band, nach oben durchstößt. Damit wird die Erkenntnis des "CROSS OVER" sofort durch die Erkenntnis av2>av1 überschrieben und wir erhalten in jedem Fall mp=3.
Daraus folgt die Programmlogik, daß ich nur dann die Abfrage av2 > av1, wenn beim Bar davor, der Kreuzungspunkt lag, also zuvor mp[Bar-davor] = 1 war und natürlich gilt: av2 > av1 immer noch gilt.
Die Indizierung der Bars dürfte soweit bekannt sein, so daß die neue Formulierung zur auswertung ob mp=3 zu setzen ist, wie folgt geschrieben weren kann:
if (mp[1] = 1) and (av2 > av1) then mp=3;
Solange nun nicht die Exitbedinkung erkannt wird, werden alle Kreuzungzpunkte mit der Bollingerline blau dargestellt, während die übrigen Werte in grün dargestellt werden, um darzustellen, daß mp=3 ist, als das Signal im Markt long ist.
Während dieser Zeit, also während mp=1 oder mp=3 (für Entry oder InTheMarket), muß geprüft werden, ob der Preis (av2) nicht die Average-Linie av1 (hier: Bollingerlinie mit Standardabweichung Null) nach unten durchstößt.
Ist dies der Fall, so ist nmp = 2 zu setzen.
If (mp[1]=1 or mp[1]=3) then if av2 cross below av1 then mp = 2;
Wieder muß man dafür Sorge tragen, daß diese Erkenntnis nicht für den Bar des Eintretens wieder durch andere, andieser Stelle ebensogültigen Bedingung überschreiben wird.
Dies wird realisiert mit der Anweisung:
if (mp[1] = 2 and mp = 2) then mp=0;
Das war s. Die bisherigen vier IF-Anweisungszeilen zur Bestimmung des Wertes von mp
If av2 cross over bb then mp = 1; {enter the market long} If av2 cross below av1 then mp = 2; {exitlong market}
if (mp = 1) and (av2 > av1) then mp=3; {in the market} if (mp = 2) and (av2 > av1) then mp=0; {not in the market}
sind zu ersetzen durch die neuen vier IF-Amweisungszeilen: If av2 cross over bb then mp = 1; {enter the market long} If (mp[1]=1 or mp[1]=3) then if av2 cross below av1 then mp = 2; {exitlong market}
if (mp[1] = 1) and (av2 > av1) then mp=3; {in the market} if (mp[1] = 2 and mp=2) then mp=0; {not in the market} Viel Erfolg beim weiteren Ausarbeiten und Erweitern Uwe
|
|
26.02.2001, 15:10 |
|
_ulrich
Administrator
Dabei seit: 12 2001
Herkunft: User altes Forum
Beiträge: 13
|
|
|
26.02.2001, 22:10 |
|
_ulrich
Administrator
Dabei seit: 12 2001
Herkunft: User altes Forum
Beiträge: 13
|
|
|
27.02.2001, 17:10 |
|
_Uwe
Administrator
Dabei seit: 12 2001
Herkunft: User altes Forum
Beiträge: 313
|
|
RE: Von der Idee zum Programm | |
Hallo, Ulrich!
Wenn ich nun erst einmal mit Hilfe zur Selbsthife versuchen darf, kann es bestimmt den notwendigen aha-Effekt geben:
Es fehlt eine Bedingung, die dann kein Kaufsignal setzt (mp=1), wenn bereits eine long-Position besteht (also mp=3 ist, oder eben mp<>3, was soviel bedeutet, wie ungleich 3).
So habe ich doch Dein Wunsch richtig verstanden, oder? (NB: wenn ich mir die Signale so ansehe, so bestehen zum Nachkaufen durchaus gute gelegen heiten, zumal diese nicht erst am Ende des Trends auftreten.)
Das Verkaufen wird dir bestimmt nur einmal angezeigt, da der entsprechende Wert nur gesetzt wird, wenn zuvor mp auf den Wert für die Longposition steht.
Gruß Uwe
|
|
27.02.2001, 18:10 |
|
_ulrich
Administrator
Dabei seit: 12 2001
Herkunft: User altes Forum
Beiträge: 13
|
|
|
27.02.2001, 18:10 |
|
_ulrich
Administrator
Dabei seit: 12 2001
Herkunft: User altes Forum
Beiträge: 13
|
|
|
04.03.2001, 12:10 |
|
|