Jump to content
Tom Next - Daytrading Community

Kerzenzeitpunkt ermitteln


Gunner_Duck

Recommended Posts

Hallo Zusammen,

 

ich bin mal wieder auf eure Hilfe angewiesen.

 

Also zu der Theorie:

Ich will eine eigene Rangestraterie aufbauen.

Aktuell funktioniert der Rangeaufbau mit manueller Vorgabe.

Sprich, ich gebe meine Zeitvorgaben manuell vor, in welchem Zeitraum die Range aufgebaut werden soll und ab wann ich traden will.

 

Ich möchte es folgendermaßen erweitern oder abändern.

Ich habe eine Moving Average.

Sobald eine Kerze z.b. oberhalb der Linie geschlossen wird, will ich diese Kerze als meinen Startpunkt für meinen Rangeaufbau festlegen.

 

Der Startpunkt der Range sieht aktuell so aus:

datetime RangeStartPunkt = StrToTime(TimeYear(TimeCurrent())+"."+TimeMonth(TimeCurrent())+"."+TimeDay(TimeCurrent())+" "+Range_Start_Stunde+":"+Range_Start_Minute);

Ich stelle es mir grade einfach so vor:

 

if(Linie_oben<Low[0]) TIMERHIGH = iTime(NULL,PERIOD_H1,0);
Range_Start_Stunde = TIMERHIGH

Stelle ich es mir zu einfach vor?

Könnt ihr mir bitte auf die Sprünge helfen.

 

  • Upvote 1
Link to comment
Share on other sites

naja das ist es ja. Sobald eine Kerze über/unter MA geschlossen wird, soll genau diese Kerze als mein Grenzanfang definiert werden. Den Grenzschluss will ich dann mit einem Offset auf den Grenzanfang definieren.

 

Sprich: Grenze_Start: MA<Low

Grenze_Stop: Grenze_Start + 8 Stunden + 20 Minuten

 

Ich muss hier halt zuerst den Punkt "Grenze_Start" festlegen.

Ich glaube, ich habe hiermit den Ansatz schon gefunden. Bin mir aber noch nicht sicher, ob es das gelbe vom Ei ist.

Weil durch den Index 0 im Low oder High wird der Startpunkt mit jeder Kerze die über/unter dem MA ist aktuallisiert.

 

   string TIMERHIGH, TIMERLOW;

   if(MA<Low[0]) TIMERHIGH = TimeToStr(TimeCurrent(),TIME_MINUTES);
   if(MA>High[0]) TIMERLOW = TimeToStr(TimeCurrent(),TIME_MINUTES);

 

Denke, dass ich hier aber wohl eine Schleife haben muss.

Edited by Gunner_Duck
Link to comment
Share on other sites

Nun mit 0 betrachtest Du ja immer die aktuelle und noch laufende Kerze. Da ist ja noch gar nicht klar, wie groß sie ist und ob sie den MA überhaupt nachhaltig kreuzt. Irgendwie verwirrt mich Dein Vorgehen wahrscheinlich mehr als es nötig ist. Versuche doch mal ganz deutlich nur in Worten zu beschreiben, was passieren soll. Ganz ohne Quelltext :wink:.

Link to comment
Share on other sites

bis wann die Range geht ist erstmal uninteressant.

aktuell wird die Range durch externe variablen definiert.

Ich will das so ändern, dass mir der Range-Startpunkt durch die ermittelte Kerze gestartet wird.

 

Range-Start soll den Zeitpunkt einer Kerze bekommen, die als erste über meinem MA geschlossen wird.

 

Die Frage ist hier einfach nur, wie kann ich einen Zeitpunkt einer Kerze ermitteln.

Link to comment
Share on other sites

1. Kerze suchen, die zuletzt den MA gekreuzt hat. Bspw. mit einer while-Schleife. Bedingung wäre ja, dass die Kerze X zum Zeitpunkt i über dem MA geschlossen hat und zu i+1 darunter (oder umgekehrt, je nach Richtung).

2. Zeitpunkt (und ggf. Kurse) dieser Kerze X merken.

3. Das tun, was getan werden muss, aber hier noch nicht genannt wurde wink.gif.

  • Upvote 1
Link to comment
Share on other sites

ja an eine Schleife habe ich auch schon gedacht.

Meinst du in etwa so hier:

nt a;
int AnzahlKerzen = 2;
bool Break;

while (a<AnzahlKerzen && !Break) {
  double MA_now  = iCustom(NULL,Zeiteinheit,iBaender,55,0,0.2,1,a);
  double MA_prev = iCustom(NULL,Zeiteinheit,iBaender,55,0,0.2,1,a+1);
  if((Close[0] > MA_now) && (Close[1] < MA_prev)) {
    datetime Zeitpunkt_Long = iTime(NULL,60,0);
  }        
  else  {          
    Zeitpunkt_Long = 0;
    Break=true;         
    a++;      
  }    
}    
Edited by Gunner_Duck
Link to comment
Share on other sites

Nö, eigentlich nicht, aber fast shades.gif .

Die Kerze 0 ist immer die aktuelle Kerze. Da kann sich der Close noch verändern.

Du müsstest also schauen, ob 1 über dem MA ist und 2 drunter.

 

Vor allem hat a auch keinen Anfangswert bei Dir bzw. wird nicht zurück gesetzt. Könnte Probleme geben.

Evtl. tippe ich im Laufe des Tages mal ein paar Zeilen.

 

Sicherlich sind da mehrere Lösungen möglich - jeder denkt und programmiert halt anders :wink:.

Link to comment
Share on other sites

Also ich habe den Index abgeändert, aber es scheint sich ein wurm dort eingeschlichen zu haben.

Sobald meine Bedingung erfüllt ist, friert der Tester ein. Schätze er hängt sich dann in der Schleife auf.

 

Es wäre super nett von dir, wenn du dir die Zeit dafür nehmen könntest und mir bei den Zeilen helfen könntest.

 

Aktuell sieht der Code so aus:

int a=1;
int AnzahlKerzen = 2;
bool Break;

while (a<AnzahlKerzen && !Break) {
  double MA_now  = iCustom(...,a);
  double MA_prev = iCustom(...,a+1);
  if((Close[1] > MA_now) && (Close[2] < MA_prev)) {
    datetime Zeitpunkt_Long = iTime(NULL,60,1);
  }        
  else  {          
    Zeitpunkt_Long = 0;
    Break=true;         
    a++;      
  }    
}    
Link to comment
Share on other sites

Das er sich aufhängt ist ja kein Wunder. Du nutzt ja immer Close[1] und Close [2].

Auch dort musst Du natürlich Close[a] und Close[a+1] nehmen. Beim Zeitpunkt das Gleiche.

 

Ich würde es so machen (habe es aber nicht getestet):

 

int a=1;
double MA_now  = iCustom(...,a);
double MA_prev = iCustom(...,a+1);

while (Close[a] > MA_now && Close[a+1] > MA_prev) {
    MA_now  = iCustom(...,a);
    MA_prev = iCustom(...,a+1);
    a++;
    if (a>=Bars-1) break;
}

datetime Zeitpunkt_Long = TimeHour(iTime(NULL,0,a));   

 

P.S.: wenn Du die Stunde rausfinden möchtest, solltest Du das besser mit TimeHour machen und nicht bei iTime eine 60 eintragen.

  • Upvote 1
Link to comment
Share on other sites

Die MAs müssen sogar in erster Linie in der Schleife sein. Denn nur dort wird ja letztendlich nach hinten gezählt und geguckt (also a erhöht).

Vor der Schleife sind sie nur, um den Anfangswert festzulegen und somit die Schleife erst möglich zu machen.

 

Die Idee ist folgende: schaue immer, ob zum Zeitpunkt a der Close über dem MA liegt UND der Close eine Kerze vor a auch über dem dortigen MA.

Wenn dem so ist, springe eine Kerze nach links (a++). Wenn dem nicht mehr so ist, hat er ja den Cross gefunden und sich die Stelle a gemerkt.

Von der nehmen wir dann die Stunde. Wenn er am Ende des Charts angekommen ist (Bars-1) und keinen Cross gefunden hat, dann höre auf.

 

Das double dient zur Definition des Variablentyps. Wenn Du es in der Schleife nochmal vor die MAs schreibt, wird er rum meckern, dass die Variablen schon definiert sind.

Probiere es mal aus. Man kann/muss dann noch zwischen globalen und lokalen Variablen unterscheiden, aber das führt hier zu weit.

 

Achte bitte auch noch darauf, dass Du die richtigen Charts nimmst. Wenn Du den Timeframe im MA auf bspw. 60 festgelegt hast, solltest Du mit iClose anstatt Close arbeiten.

Das Close macht nur Sinn, wenn der Timeframe im MA auf 0 eingestellt ist. Durch den gekürzten Text konnte ich das nicht sehen, was nun richtig ist. Gleiches gilt für Bars bzw. iBars.

 

P.S.: Wenn Dir ein Beiträg sehr gut gefällt, kannst Du ihn mit dem (grünen) Pfeil rechts unten bewerten wink.gif.

  • Upvote 3
Link to comment
Share on other sites

ot.gif

@conglom-o

Oller Sammler, habe Deinem Wusch schon entsprochen laugh.png

(Auch wenn ich den Beitrag nicht so gut fand, da ich immer nur Hubschrauber verstehe)

 

Na dann verstehst Du schon mehr als ich - ich wähle immer nur willkürlich Buchstaben auf meiner Tastatur aus.

Die werden dann so lange geändert bis bei der Kompilierung keine Fehlermeldung mehr kommt bye2.gif !

 

P.S.: Du bist ein Schatz crazy.gif !

  • Upvote 1
Link to comment
Share on other sites

Hallo conglom-o,

 

ich habe mir den Ablauf nochmal genauer angeschaut. Und es sieht aktuell immer so aus, dass meine Rangegröße erst nach der zweiten Kerze aufgebaut wird.

 

Auf dem Bild sieht man hoffentlich, dass die Range jetzt auf der Kerze mit dem roten Pfeil aufgebaut wird.

Es soll aber schon auf die Kerze mit dem weißen Pfeil aufgebaut werden.

 

Die Logik sieht aktuell so aus:

(iLow(NULL,0,a) > MA_now && iLow(NULL,0,a+1) > MA_prev)

Normalerweise hätte ich die Logik so hier gemacht:

(iLow(NULL,0,a) > MA_now && iLow(NULL,0,a+1) < MA_prev)

Aber so findet er den Cross komischerweise gar nicht mehr.

Hast du vielleicht eine Idee, was hier los ist.

 

Schau dir mal den Screenshot an. Ich hoffe du verstehst was ich meine.

 

P.S.: ich habe die Range jetzt extra so klein gemacht, damit man es hoffentlich besser erkennt was ich meine.

post-5230-0-56457400-1456431347_thumb.jpg

Edited by Gunner_Duck
Link to comment
Share on other sites

Also auf dem Bild erkennt man nicht wirklich was. Kannst Du das nochmal mit einem Kerzenchart und größer machen? Und auch so, dass man den GD sehen kann?

Mit iLow prüfst Du ja letztendlich, ob die gesamte Kerze drüber geblieben ist. Soll das so sein?

 

Du bastelst außerdem ja auch was ganz anderes plötzlich. In der WHILE Schleife muss die Logik so sein, wie von mir geschrieben.

Wenn Du plötzlich mit einer if-Abfrage arbeitest, muss das gesamte Konstrukt anders aufgebaut werden.

Link to comment
Share on other sites

hi,

also das mit iLow ist schon richtig so. IF-Schleife habe ich hier nicht.

 

Deine While-Schleife sieht aktuell so aus:

   int a=1;
     double MA_now   = iCustom(NULL,...,a);
     double MA_prev  = iCustom(NULL,...,a+1);
     
   while ((iLow(NULL,0,a) > MA_now && iLow(NULL,0,a+1) > MA_prev) || (iHigh(NULL,0,a) < MA_now && iLow(NULL,0,a+1) < MA_prev)) {    
     MA_now   = iCustom(NULL,...,a);
     MA_prev  = iCustom(NULL,...,a+1);
     a++;    
     if (a>=Bars-1) break;
   }

Ich habe dort einfach nur die Bedingung für Short hinzugefügt.

 

Zu dem Bild:

- Die Range wird hier gelb markiert und bildet sich aus der Kerze, die mit rotem Pfeil markiert ist.

- Der GD läuft hier unterhalb der Kerzen und ist mit der Farbe "Aqua" markiert.

- Die Range SOLL an der Kerze aufgebaut werden, die mit blauem Pfeil markiert ist.

 

Deswegen wäre ja hier eigentlich die Logik, dass Kerze_prev < MA_prev && Kerze_now > MA_now.

Aber wenn ich das so schreibe, findet er den Cross nicht.

post-5230-0-22490400-1456469269_thumb.jpg

Edited by Gunner_Duck
Link to comment
Share on other sites

hi,

also das mit iLow ist schon richtig so. IF-Schleife habe ich hier nicht.

 

Deine While-Schleife sieht aktuell so aus:

   int a=1;
     double MA_now   = iCustom(NULL,...,a);
     double MA_prev  = iCustom(NULL,...,a+1);
     
   while ((iLow(NULL,0,a) > MA_now && iLow(NULL,0,a+1) > MA_prev) || (iHigh(NULL,0,a) < MA_now && iLow(NULL,0,a+1) < MA_prev)) {    
     MA_now   = iCustom(NULL,...,a);
     MA_prev  = iCustom(NULL,...,a+1);
     a++;    
     if (a>=Bars-1) break;
   }

Ich habe dort einfach nur die Bedingung für Short hinzugefügt.

 

Zu dem Bild:

- Die Range wird hier gelb markiert und bildet sich aus der Kerze, die mit rotem Pfeil markiert ist.

- Der GD läuft hier unterhalb der Kerzen und ist mit der Farbe "Aqua" markiert.

- Die Range SOLL an der Kerze aufgebaut werden, die mit blauem Pfeil markiert ist.

 

Deswegen wäre ja hier eigentlich die Logik, dass Kerze_prev MA_now.

Aber wenn ich das so schreibe, findet er den Cross nicht.

 

Bei Deiner short Bedingung vergleichst Du aber ein High mit dem MA und dann ein Low mit dem MA - das ist bestimmt nicht so gewollt wink.gif.

Auf dem Bild ist wieder nichts zu erkennen - besser ohne die Striche im Hintergrund, nur Kerzen und der MA und dann in besserer Auflösung.

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
×
×
  • Create New...