ich habe ein Problem mit der Umsetzung der External Trigger Funktion. Die Ein- und Ausstiegswerte werden separat in einem Indikator berechnet. Dessen Werte werden am Ende einer Periode für die nächste Periode berechnet (Einstellung: CalculateAtEveryTick(false)). Die Datei für den External Trigger wird in einem Stopp erzeugt der sich jede Periode neu berechnet (ohne CalculateAtEveryTick(false)). Bis zum Einstieg in eine Position läuft alles perfekt. Im Moment des Ein- und Ausstieg berechnet er aber den Indikator neu obwohl es immer noch die selbe Periode ist und auch die Abfrage MarketPosition() gibt nur für den Tick des Einstieg 1 oder -1 zurück und gibt im nächsten Tick 0 zurück obwohl die Position noch offen ist. Selbes passiert mit dem Stopp der auch Werte vom Indikator bezieht. In dem Moment wo er eigentlich ausgelöst werden sollte berechnet er sich neu und kann dadurch z.B. in einer Long Position sogar nochmal sinken.
Hier mein Code:
Express Stop Indikator_Dax
Vars
Series Platz, Long (KaufsignaleExpress.Long), Short (KaufsignaleExpress.Short), Zeitzaehlerserie (KaufsignaleExpress.Zeitzaehlerserie), KursrichtungEins(KaufsignaleExpress.KursrichtungEins);
numeric wurde_schon_eingestiegen, Wendeblock;
Calculation
if IsFirstBar() then
begin
wurde_schon_eingestiegen = 5;
Wendeblock = 5;
Platz = 1;
end
else
begin
if Platz[0] = Platz[1] then //Berechnung soll nur einmal pro Periode ausgeführt werden und dafür soll nach der Berechnung Platz[0] <> Platz[1] sein
begin
if (Zeitzaehlerserie = 1) then
begin
wurde_schon_eingestiegen = 5;
end
if Platz[1] = 2 then
begin
Platz = 1;
end
else
begin
Platz = Platz + 1;
end
end
end
////////////////////////////////////////////////////////////////////////////
if (KursrichtungEins[1] <> KursrichtungEins[2]) and (wurde_schon_eingestiegen = 5) then
Wendeblock = 5;
else
if wurde_schon_eingestiegen = 1 then
Wendeblock = -1;
else
if wurde_schon_eingestiegen = -1 then
Wendeblock = 1;
///////////////////////////////////////////////////////////////////////////////
if ((Long <> 0) and (Wendeblock <> -1) and (MarketPosition() = 0) and (wurde_schon_eingestiegen = 5) and (h >= Long)) Then
CreateFile("C:\Users\XXXXXX\Documents\WHS FutureStation Nano\External Trigger\nano.txt","long DAX");
if ((IsIntradayEntry()) and (MarketPosition() = 1)) Then
wurde_schon_eingestiegen = 1;
if ((Short <> 0) and (Wendeblock <> 1) and (MarketPosition() = 0) and (wurde_schon_eingestiegen = 5) and (l <= Short)) Then
CreateFile("C:\Users\XXXXXX\Documents\WHS FutureStation Nano\External Trigger\nano.txt","short DAX");
if ((IsIntradayEntry()) and (MarketPosition() = -1)) Then
wurde_schon_eingestiegen = -1;
Mein Hauptproblem liegt ja nicht in der External Trigger Funktion, sondern im Express Code. Im Grunde möchte ich verhindern, dass er nach dem Einsteig weiter neu berechnet. Quasi soll er nach dem Einstieg (bis zum Ende der Periode) CalculateAtEveryTick() auf "false" setzen. Ist soetwas möglich?
Ebenfalls habe ich das Problem das er mir MarketPosition() nur bis zum Ende der Periode korrekt anzeigt und dann wieder auf 0 springt obwohl die Position noch im Markt ist. Wenn CalculateAtEveryTick(false) nicht im Code steht wird MarketPosition() sogar nur für die Länge eines Tick korrekt angezeigt. Ich vermute hier einen Fehler in der Software.
Mir geht es die letzten Tage auch so, dass MarketPosition() manchmal kurz nach Tradeeröffnung 0 anzeigt (über Showtip in einem Stop-Indikator), obwohl der Trade geöffnet ist (im Livehandel mit Echtgeld!). Nach mehreren Sekunden stabilisiert sich MarketPosition() und bleibt konsequent bei 0 (ich nutze keine External Trigger). Einmal geschah das, als der Kurs bei einer Longposition kurz unter den Einstiegskurs fiel (bei den anderen Malen habe ich nicht darauf geachtet). Ich tippe auch auf einen Bug
da es ja doch ein sehr spezielles Problem ist, haben wir mit den Programmierern von Fipertec gesprochen:
Bei der Programmierung in Express ist zu beachten, dass das Skript regelmässig auf den geladenen Bars neu ausgeführt wird. Die Berechnung aller Werte erfolgt dabei pro einzelner Bar beginnend bei der ältesten bis zur aktuellsten Bar. Aus diesem Grund gibt die Funktion MarketPosition() - je nachdem für welche Bar sie berechnet wird - unterschiedliche Werte aus. Wer mit dem aktuellen Wert von MarketPosition() arbeiten möchte, muss sicherstellen, dass dieser unter Verwendung von IsFinalBar() abgefragt wird. Wenn ein Stop nicht bei jedem eingehenden Tick neu berechnet werden soll, ist darauf zu achten, dass nirgendwo im Skript die Funktion SetIntraPeriodUpdate() aufgerufen wird.
In der Platform habe ich Skripte mit folgendem Inhalt gefunden:
...
Calculation
if IsFirstBar() then
begin
CalculateAtEveryTick(false);
SetYScaleFormat(GetPriceFormat());
end
...
Kann ich das so interpretieren, dass nur für den ältesten Bar die EoP-Berechnung erfolgen soll?
durch CalculateAtEveryTick(false) wird das Express-Skript nicht bei jedem neuen Tick, sondern nur zum Ende einer Periode ausgeführt. Dies sollte bei allen aufwendigeren und rechenintensiven Skripten benutzt werden.
meine Frage ging auf die Verbindung von CalculateAtEveryTick(false) mit if IsFirstBar() hinaus, mit der ich nichts anfangen kann.
Oder anders gefragt : was ist dazu der Unterschied, wenn CalculateAtEveryTick(false) ohne die Bedingung if IsFirstBar() ausgeführt wird?