Donnerstag, 25. April 2024, 07:43 UTC+2

Sie sind nicht angemeldet.

  • Anmelden
  • Registrieren

Lieber Besucher, herzlich willkommen bei: INVESTOX-Forum. Falls dies Ihr erster Besuch auf dieser Seite ist, lesen Sie sich bitte die Hilfe durch. Dort wird Ihnen die Bedienung dieser Seite näher erläutert. Darüber hinaus sollten Sie sich registrieren, um alle Funktionen dieser Seite nutzen zu können. Benutzen Sie das Registrierungsformular, um sich zu registrieren oder informieren Sie sich ausführlich über den Registrierungsvorgang. Falls Sie sich bereits zu einem früheren Zeitpunkt registriert haben, können Sie sich hier anmelden.

Registrierungsdatum: 6. August 2010

Beiträge: 311

1

Mittwoch, 12. Januar 2011, 20:52

Cross-Befehl auf Tagesbasis Intraday anwenden

Hallo zusammen,

ich möchte folgende Bedingungen in einem HS umsetzen:
Für Long:
1. SMA7 kreuzt SMA26 auf Tagesbasis
2. Tageshoch des Tages vom Cross gilt als Einstiegslevel
3. SMA7 muss über SMA26 (auf Tagesbasis) bleiben
4. EnterLong (intraday, z.B. 5 min Komp.), sobald das Tageshoch des Kreuzungstages überschritten wird
Exit:
- Kurs fällt unter SMA26
- ExitLong erfolgt dann intraday

Die bisherige Umsetzung sieht so aus:

//Variablen
Global Calc GD_Fast: Komp(#GD(Close, 7, S)#,#T#);
Global Calc GD_Slow: Komp(#GD(Close, 26, S)#,#T#);
Global Calc CrossLong: Cross(GD_Fast, GD_Slow, 1) = 1;
Global Calc CrossShort: Cross(GD_Fast, GD_Slow, 1) = -1;
Global Calc BedEnterLong: ValueWhen(Komp(#High#,#T#), CrossLong, 1, V);
Global Calc BedEnterShort: ValueWhen(Komp(#Low#,#T#), CrossShort, 1, V);

//EnterLong Bedingung
Calc EnterLong:
Ref(GD_Fast, -1) > Ref(GD_Slow, -1) and
Ref(High, -1) > BedEnterLong;

//EnterShort Bedingung
Calc EnterShort:
Ref(GD_Fast, -1) < Ref(GD_Slow, -1) and
Ref(Low, -1) < BedEnterShort;

//ExitLong Bedingung
Calc ExitLong: Ref(Low, -1) < Ref(GD_Slow, -1);

//ExitShort Bedingung
Calc ExitShort: Ref(High, -1) > Ref(GD_Slow, -1);

Die gewünschten Einstiege sehen dann so aus:


Die nicht gewünschten Einstiege so:


Es soll nach dem Cross auf Tagesbasis nur ein Long- bzw. Short-Trade ausgeführt werden.

Ich tüftel nun schon eine ganze Weile an der Lösung. Deshalb bin ich Euch für konstruktive Vorschläge sehr dankbar!

Beste Grüße!
Livermore
Beste Grüße!
Livermore

Lenzelott Männlich

Experte

Registrierungsdatum: 30. Dezember 2002

Beiträge: 3 051

Wohnort: Giessen

2

Mittwoch, 12. Januar 2011, 22:01

Wenn ich nicht weiterkomme (soll vorkommen), dann lege ich mir mir alle Teile bzw Teilberechnungen in den Chart.
Meist sieht man dann schon wo das Problem liegt.

kleiner Tipp:
In Deinem Fall könnten das ein evtl. fehlendes ref(,-1) in den Komps sein
If you think it´s expensive to hire a professional, wait until you hire an amateur.

Registrierungsdatum: 6. August 2010

Beiträge: 311

3

Donnerstag, 13. Januar 2011, 22:20

Hallo Lenzelott,

danke für Deinen Tipp! Dieser ist zur Visualisierung der Signale sehr gut.

Ein fehlendes Ref(,-1) ist es nicht. Ich brauche eine Art Schleife oder Zähler, welcher bei Cross der GD´s auf "1" gesetzt wird. Sobald das Tageshoch des Cross-Tages überschritten wird, wird ein Trade ausgeführt und der Zähler zählt zurück auf "0". Somit kann ich bei erneutem Eintritt der EnterLong-Bedingungen zusätzlich abfragen, ob der Zähler auf "1" oder "0" steht und das Ausführen eines weiteren Trades verhindern.

Läßt sich das mit INV-Bordmitteln umsetzen?
Wenn ja, wie?

Besten Dank und viele Grüße!
Livermore
Beste Grüße!
Livermore

Registrierungsdatum: 6. August 2010

Beiträge: 311

4

Donnerstag, 13. Januar 2011, 22:28

Hier noch mal ein Bild:


Jeweils ein Cross Long und ein Cross Short, aber jeweils 2 bzw. 3 Trades wurden ausgeführt.
Beste Grüße!
Livermore

Bernd

Experte

Registrierungsdatum: 5. Juni 2005

Beiträge: 4 071

Wohnort: Iringsweg

5

Donnerstag, 13. Januar 2011, 23:58

Wenn nur eine bestimmte Anzahl Trades am Tag ausgeführt werden sollen (z.B. nur ein Trade) kannst Du das doch einfach in den Testbedingungen einstellen. Hilft das in Deinem Fall nicht?

Ansonsten, alter Falter ... ist das ein Fall für Schalter() {reim dich oder ich fress dich :D } :
Ich brauche eine Art Schleife oder Zähler, welcher bei Cross der GD´s auf "1" gesetzt wird. Sobald das Tageshoch des Cross-Tages überschritten wird, wird ein Trade ausgeführt und der Zähler zählt zurück auf "0".

Davon abgesehen, Du brauchst aber 100pro Ref -1 in den Komp's, wie von Lenzelott schon angemerkt. Die Basis Komprimierung scheint mir auf 15 Minuten zu sein, während Du da Tages-Perioden reinkomprimierst. Wenn Du's nicht machst, merkst Du im Backtest erstmal nix. Nur life werden Dir die Signale nur so um die Ohren fliegen.
Gruss
Bernd

Lenzelott Männlich

Experte

Registrierungsdatum: 30. Dezember 2002

Beiträge: 3 051

Wohnort: Giessen

6

Freitag, 14. Januar 2011, 00:56

Ein fehlendes Ref(,-1) ist es nicht.


Da wäre ich mir nicht so sicher an Deiner Stelle!

Wenn Du sowas im Intraday System verwendest:
Global Calc GD_Fast: Komp(#GD(Close, 7, S)#,#T#);
Global Calc GD_Slow: Komp(#GD(Close, 26, S)#,#T#);

hast Du eigentlich immer ein Zukunftsblick, da die KOMP bereits in der 1. Periode des Tages den Endwert des Tages liefert.

Ref(GD_Fast, -1) > Ref(GD_Slow, -1) and

hier versetzt Du einen Wert der in der 1. Periode des tages bereits den Tagesendwert annimmt um eine Periode nach hinten.
Das Ref(-1) kannst Du Dir zb. sparen.

Ref(High, -1) > BedEnterLong;


Und das hier kann zu den zigdusig Trades führen in Folge.
High ist den ganzen Tag größer als BedEnterLong, weil der letzte Cross zb. schon ne Woche her ist und seitdem der Markt gestiegen ist.
Dein Exit greift auch sofort (warum auch immer), deswegen sofort wieder enter.
If you think it´s expensive to hire a professional, wait until you hire an amateur.

Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von »Lenzelott« (14. Januar 2011, 21:34)


Registrierungsdatum: 6. August 2010

Beiträge: 311

7

Freitag, 14. Januar 2011, 20:22

Hallo Bernd,
Wenn nur eine bestimmte Anzahl Trades am Tag ausgeführt werden sollen (z.B. nur ein Trade) kannst Du das doch einfach in den Testbedingungen einstellen. Hilft das in Deinem Fall nicht?
Das hilft leider nicht, weil es sein kann, dass das High des Crosstages am Folgetag überschritten wird und der Kurs dann direkt durch den GD_Slow ausgestoppt wird. Am nächsten Tag hat kein Cross der GD´s stattgefunden. Aber es kann wiederrum sein, das das ursprüngliche High des Crosstages wieder überschritten wird und somit wieder ein Trade ausgeführt werden würde. Es soll aber nur ein Trade nach dem Cross ausgeführt werden.


Ansonsten, alter Falter ... ist das ein Fall für Schalter() {reim dich oder ich fress dich :D } :
Auch darüber habe ich nachgedacht. Nur wie bekomme ich die Bedingungen so definiert, dass sie die Aufgabe richtig erfüllen?

"Der Schalter-Indikator schaltet zwischen zwei Werten um, wenn die jeweilige Bedingung zutrifft."
Schalter(Startwert, 1. Bedingung, 1. Wert, 2. Bedingung, 2. Wert)

Bei 1. Bedingung könnte ich nun abfragen, ob Ref(CrossLong, -1) = 1 ist. Damit wüßte ich, ob der Cross genau in der Vorperiode stattgefunden hat. Es kann aber auch sein, dass das High des Crosstages erst am folgenden 3., 4. od. z.B. 5. Tag überschritten wird. Hilft also nicht. Oder wie denkst Du? Kann man die Bedingungen sinnvoll definieren?

Davon abgesehen, Du brauchst aber 100pro Ref -1 in den Komp's, wie von Lenzelott schon angemerkt. Die Basis Komprimierung scheint mir auf 15 Minuten zu sein, während Du da Tages-Perioden reinkomprimierst. Wenn Du's nicht machst, merkst Du im Backtest erstmal nix. Nur life werden Dir die Signale nur so um die Ohren fliegen.

Stimmt. Ich hab´s geändert.
Komp ist auf 5 min. Das ist hier aber nicht so wichtig. Könnten auch 1 min od. 15 min sein.

Besten Dank und viele Grüße!
Livermore
Beste Grüße!
Livermore

Bernd

Experte

Registrierungsdatum: 5. Juni 2005

Beiträge: 4 071

Wohnort: Iringsweg

8

Freitag, 14. Januar 2011, 20:47


Bei 1. Bedingung könnte ich nun abfragen, ob Ref(CrossLong, -1) = 1 ist. Damit wüßte ich, ob der Cross genau in der Vorperiode stattgefunden hat.

Ja nee. Du erfährst nicht, ob der Cross in der Vorperiode stattgefunden hat, sondern, ob er überhaupt stattgefunden hat. Der Witz von Schalter ist doch, dass der nach Zutreffen von Bedingung 1 in jeder weiteren Periode den Wert 1 liefert, nicht nur in der nächsten Periode. Und zwar solange, bis Bedingung 2 wahr wird. Dann liefert er in jeder weiteren Periode den Wert 2. Solange bis wieder Bedingung 1 wahr wird. usw.
Gruss
Bernd

Registrierungsdatum: 6. August 2010

Beiträge: 311

9

Freitag, 14. Januar 2011, 20:52

Hallo Lenzelott,

Ein fehlendes Ref(,-1) ist es nicht.


Da wäre ich mir nicht so sicher an Deiner Stelle!

Wenn Du sowas im Intraday System verwendest:
Global Calc GD_Fast: Komp(#GD(Close, 7, S)#,#T#);
Global Calc GD_Slow: Komp(#GD(Close, 26, S)#,#T#);

hast Du eigentlich immer ein Zukunftsblick, da die KOMP bereits in der 1. Periode des Tages den Endwert des Tages liefert.


Da hast Du Recht. Ich hab´s wie folgt geändert:
Global Calc GD_Fast: Ref(Komp(#GD(Close, 7, S)#,#T#), -1);
Global Calc GD_Slow: Ref(Komp(#GD(Close, 26, S)#,#T#), -1);
So korrekt?

Ref(GD_Fast, -1) > Ref(GD_Slow, -1) and

hier versetzt Du einen Wert der in der 1. Periode des tages bereits den tagesentwert annimmt um eine Periode nach hinten.
Das Ref(-1) kannst Du Dir zb. sparen.


Stimmt auch. Geändert in:
GD_Fast > GD_Slow

Ref(High, -1) > BedEnterLong;


Und das hier kann zu den zigdusig Trades führen in Folge.
High ist den ganzen Tag größer als BedEnterLong, weil der letzte Cross zb. schon ne Woche her ist und seitdem der Markt gestiegen ist.


Das habe ich geändert in:
Global Calc BedEnterLong: ValueWhen(Ref(Komp(#High#,#T#), -1), CrossLong, 1, V);
und bei EnterLong geändert in:
Ref(High, -1) > Ref(BedEnterLong, -1)
Wobei das Ref(,-1) bei BedEnterLong auch nicht notwendig wäre, weil der Zugriff auf die Daten der Vergangenheit schon direkt in der BedEnterLong-Def. enthalten ist. Stimmt´s?!

Das High (in der 5 min Komp) muss nicht den ganzen Tag größer sein, als BedEnterLong. Aber wenn es so ist und ich zwischendurch ausgestoppt wurde, steige ich dann direkt wieder ein, was ich aber nicht will.
Und genau für dieses Problem suche ich eine Lösung.

Dein Exit greift auch sofort (warum auch immer), deswegen sofort wieder enter.

Den Exit hatte ich so vorgesehen. Wenn der GD_Slow (auf Tagesbasis) intraday unterschritten wird, soll der Exit erfolgen.
Deshalb sollte "Calc ExitLong: Ref(Low, -1) < GD_Slow;" richtig sein.

Wie könnte ich aus Deiner Sicht das Problem des unerwünschten Wiedereinstieges vermeiden?

Herzlichen Dank und beste Grüße!
Livermore
Beste Grüße!
Livermore

Registrierungsdatum: 6. August 2010

Beiträge: 311

10

Freitag, 14. Januar 2011, 21:03

Hallo Bernd,


Bei 1. Bedingung könnte ich nun abfragen, ob Ref(CrossLong, -1) = 1 ist. Damit wüßte ich, ob der Cross genau in der Vorperiode stattgefunden hat.

Ja nee. Du erfährst nicht, ob der Cross in der Vorperiode stattgefunden hat, sondern, ob er überhaupt stattgefunden hat. Der Witz von Schalter ist doch, dass der nach Zutreffen von Bedingung 1 in jeder weiteren Periode den Wert 1 liefert, nicht nur in der nächsten Periode. Und zwar solange, bis Bedingung 2 wahr wird. Dann liefert er in jeder weiteren Periode den Wert 2. Solange bis wieder Bedingung 1 wahr wird. usw.


Das war´s!!! :baby:

DANKE BERND!!! :thumbsup:

Schönen Abend noch!
Livermore
Beste Grüße!
Livermore

Bernd

Experte

Registrierungsdatum: 5. Juni 2005

Beiträge: 4 071

Wohnort: Iringsweg

11

Freitag, 14. Januar 2011, 21:20


Global Calc GD_Fast: Ref(Komp(#GD(Close, 7, S)#,#T#), -1);
Global Calc GD_Slow: Ref(Komp(#GD(Close, 26, S)#,#T#), -1);
So korrekt?

Verkehrt. Das Ref(,-1) muss in Komp() rein, nicht aussen rum. Also:

Global Calc GD_Fast: Komp(# Ref( GD(Close, 7, S), -1)#,#T#);
Global Calc GD_Slow: Komp(# Ref( GD(Close, 26, S), -1)#,#T#);
Gruss
Bernd

Registrierungsdatum: 6. August 2010

Beiträge: 311

12

Freitag, 14. Januar 2011, 22:00


Global Calc GD_Fast: Ref(Komp(#GD(Close, 7, S)#,#T#), -1);
Global Calc GD_Slow: Ref(Komp(#GD(Close, 26, S)#,#T#), -1);
So korrekt?

Verkehrt. Das Ref(,-1) muss in Komp() rein, nicht aussen rum. Also:

Global Calc GD_Fast: Komp(# Ref( GD(Close, 7, S), -1)#,#T#);
Global Calc GD_Slow: Komp(# Ref( GD(Close, 26, S), -1)#,#T#);


Das hat zur Folge, dass der Crosstag um einen Tag nach hinten verschoben wird.

Crosstag ist dann erst der 6.2.01; Damit stimmen dann auch die EnterLong-Bedingungen nicht mehr.

Hier das Bild auf Tagesbasis ohne die Verwendung von "Komp" in den Formeln:

Der Crosstag ist hier der 5.2.01. Das High dieses Tages wird als Longtrigger verwendet und zum Open des nächsten Tages erfolgt EnterLong.

Hier das Bild, wie ich es bisher hatte:

Crosstag auch hier der 5.2.01.
Durch die Bedingung
"Global Calc BedEnterLong: ValueWhen(Ref(Komp(#High#,#T#), -1), CrossLong, 1, V);"
sollte gewährleistet sein, dass das Tageshoch des Vortages als Longtrigger gilt. Und damit sollte vermeiden werden, dass das System in die Zukunft schaut. Oder habe ich da einen Denkfehler?
Beste Grüße!
Livermore

Lenzelott Männlich

Experte

Registrierungsdatum: 30. Dezember 2002

Beiträge: 3 051

Wohnort: Giessen

13

Freitag, 14. Januar 2011, 22:33

Ich würde mal behaupten so sollte es gehen:

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
Global Calc GD_Fast: Komp(#Ref(GD(Close, 7, S),-1)#,#T#);
Global Calc GD_Slow: Komp(#Ref(GD(Close, 26, S),-1)#,#T#);

Global Calc EnterLongLevel: ValueWhen(Komp(#Ref(High,-1)#,#T#), Cross(GD_Fast, GD_Slow, 1) = 1, 1, V);
Global Calc EnterShortLevel: ValueWhen(Komp(#Ref(Low,-1)#,#T#), Cross(GD_Fast, GD_Slow, 1) = -1, 1, V);

// Für die Enterbasis in den Testbedingungen
global calc ebl:MAX(open,enterlonglevel)+#_MinPriceChange#;
global calc ebs:MIN(open,entershortlevel)-#_MinPriceChange#;

global calc enterlong:Cross(high, EnterLongLevel, 1)=1 and gd_fast>gd_slow;
global calc entershort:Cross(low, EnterShortLevel, 1)=-1 and gd_fast<gd_slow;
If you think it´s expensive to hire a professional, wait until you hire an amateur.

Registrierungsdatum: 6. August 2010

Beiträge: 311

14

Samstag, 15. Januar 2011, 22:38

Hallo Lenzelott,

besten Dank für Deine Zeit und den Code.

Ich habe in den Testbedingungen folgendes eingestellt:

Ist hier bei Enter-Basis "Delay = 1" richtig? Oder muss da eine "0" rein?

Nach einem Cross werden mehrere Trades ausgeführt:

Da muss wohl noch der Schalter rein???
Das werde ich mal probieren.

Viele Grüße und einen schönen Abend!
Livermore
Beste Grüße!
Livermore

Lenzelott Männlich

Experte

Registrierungsdatum: 30. Dezember 2002

Beiträge: 3 051

Wohnort: Giessen

15

Sonntag, 16. Januar 2011, 13:46

Delay 0

Verstehe ich Dich richtig, Du möchtest jede Signallinie nach einem Cross nur einmal handeln ?
If you think it´s expensive to hire a professional, wait until you hire an amateur.

Registrierungsdatum: 6. August 2010

Beiträge: 311

16

Sonntag, 16. Januar 2011, 20:24

Hallo Lenzelott,

ok, Delay=0. Danke!

Ja, nach jedem Cross soll nur ein Trade stattfinden.

Beste Grüße!
Livermore
Beste Grüße!
Livermore

Registrierungsdatum: 6. August 2010

Beiträge: 311

17

Sonntag, 16. Januar 2011, 21:45

Hallo Lenzelott,

ich habe mir ein paar Einstiege angesehen und verstehe die abgerechneten Kurse nicht.

Hier ein Bild:

Low Vortag: 116,65
damit EnterShortLevel: 116,65
damit EnterBasisShort: 116,64
In der Tradeabrechnung steht als Einstiegspreis aber 116,65.

Das ist bei allen Long- und Short-Einstiegen zu beobachten.
Wo könnte der Fehler liegen?

Ein anderes Phänomen habe ich hier:

Obwohl das EnterLongLevel bereits zum Tagesopen erreicht war, wurde der Trade erst später ausgeführt.

Ebenso hier:


Habe ich noch eine Einstellung übersehen?
Oder woran könnte das liegen?

Vielen Dank für Deine Hilfe!
Livermore
Beste Grüße!
Livermore

Registrierungsdatum: 6. August 2010

Beiträge: 311

18

Sonntag, 16. Januar 2011, 21:57

Hier auch Eröffnung mit upgap, aber Entry planmäßig:


Versteh ich nicht... ?(
Beste Grüße!
Livermore

Lenzelott Männlich

Experte

Registrierungsdatum: 30. Dezember 2002

Beiträge: 3 051

Wohnort: Giessen

19

Montag, 17. Januar 2011, 01:01

damit EnterBasisShort: 116,64
In der Tradeabrechnung steht als Einstiegspreis aber 116,65.

Da wirst Du wohl im Titel die minimale Preisänderung nicht eingestellt haben

Obwohl das EnterLongLevel bereits zum Tagesopen erreicht war, wurde der Trade erst später ausgeführt.

Leider ist aus Deinen Charts nicht ersichtlich, welche linie was darstellt und ich kann nur raten.
aber es wird einfach eine Bedingung nicht wahr gewesen sein, sonst wäre der Enter schon passiert.

Erneut mein Tip vom Anfang:
alle Komponenten Charten, dann kommt man schon drauf, was da anders gelaufen ist, wie man es haben wollte.
If you think it´s expensive to hire a professional, wait until you hire an amateur.

Registrierungsdatum: 6. August 2010

Beiträge: 311

20

Montag, 17. Januar 2011, 08:11

Hallo Lenzelott,

die minimale Preisänderung ist eingestellt:


Habe auch alle globalen Variablen im Chart:
Gelb=GD_Fast
Violett=GD_Slow
Hellgrün=EnterBasisLong
Dunkelgrün=EnterLongLevel

Was ich nicht verstehe und auch nicht weiß, wo ich den Fehler suchen soll, ist die Tatsache, dass die Entrys manchmal richtig sind und manchmal eben nicht.

Beste Grüße!
Livermore
Beste Grüße!
Livermore