Dienstag, 16. April 2024, 22:07 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.

Arinest

unregistriert

1

Mittwoch, 13. März 2013, 23:32

Limit wird mit zum Teil deutlicher Verspätung nachgezogen

Hallo,

beim Papertraden meiner Systeme auf 5min-Basis ist mir aufgefallen, dass zwar sehr selten aber dennoch wiederholt manche Limite nicht nachgezogen wurden und somit das vorangegangene Limit getriggert wurde. Ich habe daraufhin auf 1min-Basis umgestellt, um mir das genauer anzuschauen. Das Resultat ist, dass nicht selten, sondern eigentlich so gut wie immer die Limite viel später angepasst werden. Man sah dies scheinbar auf 5min-Basis halt nicht.

Zur Verdeutlichung ein kurzes Beipiel: Eine Systematik von mir ist: Ist ein Setup (x) erreicht, dann warte bis der Wert "orderEntry" erreicht ist (zB. y: x-5), um bei dessen Erreichen ein Limit-Buy zu "longEntry" (zB. x -10) abzusetzen. Ich konnte nun heute live mitanschaun wie das orderEntry erreicht wurde und nix geschah. Keinerlei Änderung des vorangegangenen Limits. Erst 3 Kerzen und somit 3 Minuten später kam dann diese Änderung. Interessanterweise erschien im selben Moment dann auch erst die graphische Anzeige der Limitänderung. Und dies rückwirkend! D.h. die Linie des Limits beginnt schon vor 3 min. Alles sehr rätselhaft für mich.
Ich hab natürlich auch schon in die Programmierung geschaut, kann da aber nix finden. Aber schaut selbst:

Enter Long: Ref(Setup,-1) = 1 AND Low <= orderEntry
Definitionen:
Global Calc longEntry: Ref(x,-1) - 10;
global calc orderEntry: Ref(x,-1) - 0.5* (Ref(x,-1)-longEntry);

In der Hoffnung, dass ich nicht wieder der Einzige bin, dem dies wiederfährt und dass sich das Problem schnell lösen lässt.

Gruß,
Arinest

Bernd

Experte

Registrierungsdatum: 5. Juni 2005

Beiträge: 4 070

Wohnort: Iringsweg

2

Donnerstag, 14. März 2013, 10:44

Erst 3 Kerzen und somit 3 Minuten später kam dann diese Änderung. Interessanterweise erschien im selben Moment dann auch erst die graphische Anzeige der Limitänderung. Und dies rückwirkend!

Die beschriebenen Symptome weissen üblicherweiser darauf hein, dass man einen Zukunftsblick eingebaut hat. Limit- und Stop Entries in V6 sind seitens Investox, korrekt vom Anwender codiert, jedenfalls zeitstabil.

Aus dem geposteten Coding alleine ist noch nicht zu ersehen, wo Du den Zukunftsblick verbaut hast. Am Wahrscheinlichsten ist wohl eine Kombination der Enter-Ordertyp Einstellungen in Verbindung mit der Definition unter Enter Long. low ist nicht mit Ref(,-1) abgesichert; das kann man unter gewissen Umständen codieren, aber da muss man schon genau wissen, was man tut. Falls Du "Neues Enter setzt neues Limit" verwendest, vielleicht lösen auch die neuen Kerzen kein neues Enter aus obwohl Du das erwartets, weil das low 3 Kerzen lang unter der Enter-Basis bleibt. Also mit den unvollständigen Angaben über die genauen Definitionen und Einstellungen des Handelssystems kaum zu überblicken.
Gruss
Bernd

Arinest

unregistriert

3

Donnerstag, 14. März 2013, 17:18

Vielen Dank für die Antwort. Ich schau mir alles noch mal genau an und melde mich dann.

Arinest

unregistriert

4

Donnerstag, 14. März 2013, 17:38

Hallo Bernd, ich hab grad so nachgedacht. Wenn man von einem Zukunftsblick ausgeht, müsste der dann nicht auch beim Einsatz des Systems auf 5min-Daten vorherrschen? Da lief aber (fast) alles rund.

Arinest

unregistriert

5

Freitag, 15. März 2013, 18:07

Soooo, ich hab mir mal alles genauer angeschaut.

Zuerst ein einfaches System - alles einwandfrei, mit Berührung des orderEntry-Punktes wurde sofort die Order abgesetzt. Mehrfach gesehen und für gut befunden.
OK, Stufe2, meine Papertrading-Systeme angesetzt. Erstmal 3 Stück mit 1min Daten. Super, genau das gleiche. Na gut, jetzt mal 5s bis zur Ausführung. Hmm, jetzt sind es 30s. Das ist mal schon ne Menge. Und boing, da wars auch schon über ne Minute. Es scheint m.E. wirklich nicht daran zu liegen, dass hier irgendwo ein Zukunftsblick eingebaut ist. Auch das zuerst getestete System hatte den gleichen Aufbau und lief soweit einwandfrei.

Mir ist nun folgendes aufgefallen: Die Handelssignal-Leiste läuft nicht synchron mit dem Underlying (siehe Grafik). Und genau da scheint der Hund begraben zu sein. Denn dieser Unterschied nimmt auch mal 2,3 min ein. Und dann mit einem Mal springt die Handelssignal-Leiste zurück zur Synchronität und im gleichem Moment werden die Order ausgelöst, so es denn in dieser Zeit welche gab. Warum dies bei mir so ist - keine Ahnung.



Ich brauch mal wieder eine helfende Hand.

Gruß,
Arinest

Ganesha

unregistriert

6

Freitag, 15. März 2013, 18:58

Die Ursache kann man mit einem Wort beschreiben: Zukunftsblick.

Um sagen zu können wo der Zukunftsblick ist, müsste man das HS kennen. Wenn Du posten magst, dann ...

Ansonsten die üblichen Verdächtigen:

- irgendwo ein ref(-1) vergessen
- komp ohne inneres ref(-1) benutzt

Arinest

unregistriert

7

Freitag, 15. März 2013, 19:56

Kein Problem, ist ja nur ne Testversion, um zu schauen wie die Orderausführung ist. Außerdem schaun sich dann mal Profis die Geschichte an. Los gehts:

Definitionen:
global calc ticksize:#_MinPriceChange#;

global calc hoch: ValueWhen(High,High=HHV(High,5),1,V);
global calc tief: ValueWhen(Low,Low=LLV(Low,5),1,V);

Global Calc longEntry2: Ref(hoch,-1) - 8;
global calc longEntry: INT(longEntry2/ticksize)*ticksize;
Global Calc shortEntry2: Ref(tief,-1) + 8;
global calc s2: INT(shortEntry2/ticksize)*ticksize; {shortEntry2 auf ganze Zahl}
global calc shortEntry: If(s2<shortEntry2,s2+ticksize,s2);

global calc orderEntry: Ref(hoch,-1) - 0.5* (Ref(hoch,-1)-longEntry);
global calc s_orderEntry: Ref(tief,-1) + 0.5* (shortEntry-Ref(tief,-1));

global calc Setup: Schalter( 0, High = Hoch , 1, Low <= longEntry, -1);
global calc s_Setup: Schalter( 0, Low = Tief, 1, High >= shortEntry, -1);

global Calc longStop2:longEntry - 4;
global calc longStop: INT(longStop2/ticksize)*ticksize;
global Calc shortStop2:shortEntry + 4;
global calc s3: INT(shortStop2/ticksize)*ticksize; {shortStop2 auf ganze Zahl}
global calc shortStop: If(s3<shortStop2,s3+ticksize,s3);

global calc stoppoints: longEntry - longStop;
global calc profpoints: stoppoints;
global calc s_stoppoints: shortStop - shortEntry;
global calc s_profpoints: s_stoppoints;

global calc stoppoints2: If(longEntry - longStop=0, 0.000001, longEntry - longStop);
global calc s_stoppoints2: If(shortStop - shortEntry=0, 0.000001, shortStop - shortEntry);

global calc Kontrakte2: (0.01 * 100000) / ( (stoppoints2) * #_TEST_WertProPunkt# );
global calc Kontrakte: INT(Kontrakte2);

global calc Uhrzeit: DatePart(h) * 100 + DatePart(n);
----------------------------------------------------------------------

Enter Long: Ref(Setup,-1) = 1 AND Low <= orderEntry AND Uhrzeit > 830
Exit Long: 0

Enter-Basis Long: If(Open < longEntry, Open, longEntry)
Delay: 0

Enter-Order: Limit-Order - die Basis definiert die Order
Optionen: Neues Entry/Exit setzt neues Limit
-----------------------------------------------------------------------

Sagt bitte, wenn was fehlt.

Vielen Dank und Gruß,
Arinest

Peratron

unregistriert

8

Freitag, 15. März 2013, 20:20

global calc Setup: Schalter( 0, High* = Hoch , 1, Low* <= longEntry, -1);
global calc s_Setup: Schalter( 0, Low* = Tief, 1, High* >= shortEntry, -1);


global calc Setup: Schalter( 0, High* >= Ref(Hoch, -1)** , 1, Low* <= longEntry, -1);
global calc s_Setup: Schalter( 0, Low* <= Ref(Tief, -1)**, 1, High* >= shortEntry, -1);


*Dein High bzw. Low musste entweder mit Cross oder Highest/LowestSince abfragen denn Dein High bzw. Low verändert sich ja in der aktuellen Periode noch.
** Ich würde nicht nur = sondern >= bzw. <= verwenden. Manchmal wird der Kurs übersprungen und dann?!?

Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von »Peratron« (15. März 2013, 20:40)


Arinest

unregistriert

9

Freitag, 15. März 2013, 23:15

Danke für die Antwort Peratron.

*Dein High bzw. Low musste entweder mit Cross oder Highest/LowestSince abfragen denn Dein High bzw. Low verändert sich ja in der aktuellen Periode noch.
Ich würde nicht nur = sondern >= bzw. <= verwenden. Manchmal wird der Kurs übersprungen und dann?!?

Ich versteh. Aber irgendwie auch nicht. Ob sich das High oder Low der unvollendeten Kerze ändert ist doch unerheblich. Mit High = Hoch ist bei einem neuen Hoch in der aktuellen Periode doch auch das High der aktuellen Periode verändert et vice versa. Will sagen: Sobald ein neues Hoch erreicht, muss das Hoch gleich dem High sein. Verzeih den Widerspruch, es ist mir halt nicht klar.

Sonst noch Meinungen warum die Handelssignal-Leiste asynchron zum Chart läuft?

Peratron

unregistriert

10

Samstag, 16. März 2013, 00:28

Das mit dem High bzw. Low könnte so doch passen. Nur kannst Du so keinen festen/fixen Wert abfragen und für weitere Berechnungen verwenden da sich dieser ständig mit einem neuen High bzw. Low verändert. Schreiben würde ich es aber anderst. Schau mal ob es so geht?!?

global calc hoch: ValueWhen(High, ROC(HHV(High,5), 1, $) <> 0,1,V);
global calc Setup: Schalter( 0, ROC(hoch, 1, $) <> 0, 1, Low* <= longEntry, -1);

Arinest

unregistriert

11

Montag, 18. März 2013, 16:34

Ich hab den Verdächtigen!

Hab alles weiter beobachtet und gesehen, dass bei der Programmierung wie sie oben einzusehen ist, eigentlich alles ok ist. Nun hatte ich bei dieser aus Vereinfachungs- und Privatgründen statt meinem IB-Konto nur die 100.000 zur Berechnung der Kontraktanzahl eingesetzt. Vorher stand dort:

global calc Kontrakte2: (0.001 *LastDP("NetLiquidation@IB-Kontonummer_EUR",Close)) / ( (stoppoints2) * #_TEST_WertProPunkt# );

Und dieses LastDP("NetLiquidation@IB-Kontonummer_EUR",Close), mit dem ich Bezug nehmen will auf den gestrigen Schlusskurs meines Kontostandes, scheint diese Verspätung zu bewirken. Wenn man NetLiquidation@IB-Kontonummer im Chart gesondert betrachtet, scheint dieser öfter zu hängen. Da zur Berechnung der Handelssignale der Wert aber benötigt wird, hängt auch die Handelssignal-Leiste und somit das Ganze insgesamt. Warum es diese Probleme mit NetLiquidation gibt weiss ich nicht und hoffe auf euren Rat.

Gruß,
Arinest

Lenzelott Männlich

Experte

Registrierungsdatum: 30. Dezember 2002

Beiträge: 3 050

Wohnort: Giessen

12

Montag, 18. März 2013, 19:44

LastDP("NetLiquidation@IB-Kontonummer_EUR",Close)


Laut Onlinehilfe sollte das auf keinen Fall funktionieren.

Ich verwende für solche MM Dinger ein einfaches

Quellcode

1
Open("NetLiquidation@IB-Kontonummer_EUR");
If you think it´s expensive to hire a professional, wait until you hire an amateur.

Arinest

unregistriert

13

Montag, 18. März 2013, 22:41

Hallo Lenzelott. Danke für die Hilfe.

Laut Onlinehilfe sollte das auf keinen Fall funktionieren.

Bei mir funktioniert LastDP("NetLiquidation@IB-Kontonummer_EUR",Close) genauso gut/schlecht wie das von dir angebotene Open("NetLiquidation@IB-Kontonummer_EUR").
Das Problem ist, dass der Titel NetLiquidation@IB-Kontonummer_EUR bei mir in nur sehr unregelmäßigen Abständen Daten von IB zieht/bekommt. Schaue ich mir die Daten im RTT an, so sind die Abstände mal 30s, aber in den meisten Fällen 2-3min. Ich arbeite mit einer 1min-Komprimierung. Hat der Titel nun seit sagen wir 3min keine Daten bekommen, so ist für mindestens die letzten 2 candles nichts da zum berechnen und das System hängt.

Lenzelott Männlich

Experte

Registrierungsdatum: 30. Dezember 2002

Beiträge: 3 050

Wohnort: Giessen

14

Dienstag, 19. März 2013, 01:35

Abstände mal 30s, aber in den meisten Fällen 2-3min


3 Minuten ist der normale Updateintervall von IB.
Wenn man einen Fill hat in einem trade wird davon abweichend sofort ein Update geschickt.
Das erklärt die unregelmässigen Zeitabstände zwischen den Ticks
If you think it´s expensive to hire a professional, wait until you hire an amateur.

Lenzelott Männlich

Experte

Registrierungsdatum: 30. Dezember 2002

Beiträge: 3 050

Wohnort: Giessen

15

Dienstag, 19. März 2013, 01:39

Hat der Titel nun seit sagen wir 3min keine Daten bekommen, so ist für mindestens die letzten 2 candles nichts da zum berechnen und das System hängt.


wenn´s wirklich daran liegt (was imho aber nur bei meiner Open Variante so sein dürfte), dann versuchs mal mit

Quellcode

1
verlängern

und

Quellcode

1
ersatz


oder

Quellcode

1
ersterwert


bzw einer Kombination daraus
If you think it´s expensive to hire a professional, wait until you hire an amateur.

Bernd

Experte

Registrierungsdatum: 5. Juni 2005

Beiträge: 4 070

Wohnort: Iringsweg

16

Dienstag, 19. März 2013, 12:02

Ich verwende "Ersatz( Verlängern( Kapital), 0)" seit immer ohne die von Ariniest geschilderten Probleme, wobei im Backtest Kapital als Fixwert abgefüllt wird (wie z.B. 1 Mio.), und im Lifehandel mit einer Funktion auf Open("NetLiquidationByCurrency@_BASE"); einer Funktion, weil ja im Lifehandel so wenig Kapital eingezahlt sein wird, wie möglich - siehe den aktuellen Bankraub in Zypern! Das Kapital soll gerade ausreichen, die Margin zu erbringen, während die Berechnungen auf das eigentlich wirkliche Handels-Kapital erfolgen müssen.

Dieser Weg wurde gewählt, weil die Syeteme auch funktionieren müssen, wenn die Basis-Währung nicht EUR ist (dies ist es in der Schweiz eigentlich nie...), und auch wenn die Titel Definitionen von einer Maschine auf eine andere übertragen werden müssen -> wobei sich natürlich noch die IB Kontonummer ändert.

Das funktioniert ohne die Probleme, die Arinest aufgrund der ungenügenden Programmierung beschrieben hat.

=> Hinweis: "NetLiquidationByCurrency@_BASE" - also ohne Kontobindung steht nur zur Verfügung, wenn RTT/IB geeignet parametrisiert wurde, siehe Doku

Was mich hier in diesem Thread stört, ist, was ich schon zu Eingangs angemerkt habe:
mit den unvollständigen Angaben über die genauen Definitionen und Einstellungen des Handelssystems kaum zu überblicken.

Wir tasten uns hier mit Arinest von Fehler zu Fehler, und noch immer liegen nur ein paar Definitionen offen, es fehlt der ganze Rest wie z.B.
Falls Du "Neues Enter setzt neues Limit" verwendest,

nicht die sonstigen Einstellungen. So werden doch nur Leute beschäftigt!
Gruss
Bernd

Dieser Beitrag wurde bereits 6 mal editiert, zuletzt von »Bernd« (19. März 2013, 12:49)


Arinest

unregistriert

17

Dienstag, 19. März 2013, 13:02

Vielen Dank an Lenzelott. Verlängern() hat sofort geholfen und alles funktioniert wie es sollte.

Wir tasten uns hier mit Arinest von Fehler zu Fehler, und noch immer liegen nur ein paar Definitionen offen, es fehlt der ganze Rest

Ich hatte weiter oben gebeten: Sagt bitte, wenn was fehlt.

Zum Thema "Such dir professionelle Hilfe, dann gehts auch vorwärts": Vielen Dank für den Rat. ich arbeite noch nicht so lange mit Investox (erst seit 3 Monaten richtig) und komme gut voran. Sollte ich Eure Nerven mit meinen Nachfragen zu sehr strapaziert haben, dann tut mir das leid. Ich versuche immer erst das Problem selbständig zu lösen. Gelingt mir das nicht oder denke ich, dass dies einfach zu viel Zeit in Anspruch nimmt, so habe ich eine Abkürzung genommen und bei den Profis hier nachgefragt.

Mit freundlichem Gruß,
Arinest