MQL 4



  • MQL 4 ist schon alt. Inzwischen gibts schon lange MQL 5, von dem ich aber keine Ahnung habe. In den nächsten Jahren, vermute ich, erscheint MQL 6, bzw. der Metatrader 6. MQL 4 für den Metatrader 4 lernen lohnt sich eigentlich nicht mehr. Dazu gibts aber einige Bücher und etliche Webseiten und Videos. Einfach mal suchen.

    Wie gesagt ist MQL 4 eigentlich das Gleiche wie C++. Wie könnte man in Letzterem die oben gestellte Aufgabe lösen?



  • @EmQEl sagte in MQL 4:

    Wie gesagt ist MQL 4 eigentlich das Gleiche wie C++. Wie könnte man in Letzterem die oben gestellte Aufgabe lösen?

    Sorry, aber Programmieren für den Metatrader hat mit Vanilla C++ genau garnix zu tun.

    @EmQEl sagte in MQL 4:

    ob der RSI zuletzt über RSI_IL_2 ( obere Linie, 57.0 ) oder unter RSI_IL_1 ( untere Linie, 43.0 ) war.

    Werte Merken und vergleichen?



  • @EmQEl sagte in MQL 4:

    ob der RSI zuletzt über RSI_IL_2 ( obere Linie, 57.0 ) oder unter RSI_IL_1 ( untere Linie, 43.0 ) war.

    Werte Merken und vergleichen?

    Daran dachte ich auch schon. Aber dann müsste man Stunden lang Daten sammeln...

    Kennt sich Jemand hier aus mit Metatrader / MQL und FOREX Trading?

    Wahrscheinlich gehts nur mit mehreren (verschachtelten?) Schleifen oder ganz ohne Schleife. Ne While-Schleife kann wahrscheinlich nicht ne Bedingung prüfen und gleichzeitig Selbige bei Jedem Durchlauf verändern. So wird das wohl nix...

    https://filehorst.de/d/dfBbwxsz

    double RSI=iRSI(Symbol(),Timeframe,RSI_Period,RSI_Price,1);
    
    //-------------------------------------------------------------------------------------------------------------
    
    
    // RSI past
    
    int RSI_Past_Bar = 2;
    double RSI_Past = iRSI(Symbol(),Timeframe,RSI_Period,RSI_Price,RSI_Past_Bar);
    
    int RSI_P_under=0;
    
          while( RSI_Past < RSI ){
    
          RSI_P_under++;
        
          RSI_Past_Bar++;
    
          return(RSI_P_under);}
    


  • This post is deleted!


  • @EmQEl
    Warum solltest du stundenlang Daten sammeln wollen? Warum in die Zukunft schauen?

    Ich nutze AgenaTrader. Und dieser liefert mir Kursdaten in verschiedenen Zeiteinheiten. Für jede Zeiteinheit bekomme ich eine wählbare Menge von Kerzen. So nutze ich privat für die Bestimmung der Großwetterlage bis zu 500 Wochenkerzen eines Kurses.

    Beschreibe doch mal bitte genau was du berechnen willst. Wie berechnet man den RSI, den RSI_IL_1 und RSI_IL_2? Auch gerne mal wie man diese von Hand berechnet. (PS: Willkommen in der Informatik)

    Prüfe auch mal ob du irgentwelche Plugins (Conditions, Indikatoren) in dieser Richtung findest.

    Und lass für den Anfang die Finger von Short-Order!!! Keinen Hebel und immer einen Stop setzen!!!



  • https://filehorst.de/d/dkdGqvEG

    IL 1 / 2 werden nicht berechnet. Bekommen nur ihren Wert in den Globalen Variablen.

    https://de.wikipedia.org/wiki/Relative_Strength_Index

    *Relative Strength Index
    Zur Navigation springen
    Zur Suche springen

    Der Relative Strength Index oder Relative-Stärke-Index (kurz: RSI) ist ein oszillierender Indikator, der 1978 von Welles Wilder entwickelt wurde. Er gehört zu den am häufigsten verwendeten Indikatoren in der technischen Analyse. Technisch gehört der RSI zu den Range-Compression-Oszillatoren; er kann Werte im Bereich von 0 bis 100 Prozent annehmen.

    Der RSI ist zu unterscheiden vom RSL-Indikator, dem Indikator der Relativen Stärke nach Robert A. Levy.
    Inhaltsverzeichnis

    1 Berechnung
    2 Signal
    3 Literatur
    4 Weblinks
    

    Berechnung

    Der Indikator setzt die Auf- und Abwärtsbewegungen eines Basiswerts über die Zeit in Relation. Dazu wird ein gleitender Mittelwert der Auf- und Abwärtsbewegungen berechnet und ins Verhältnis gesetzt. Welles Wilder wählte hier 14 Tage (entsprechend α=1/14 oder N=27 in der EMA-Terminologie). Daneben sind heute auch 7, 9 oder 25 Tage üblich. Je kürzer der betrachtete Zeitraum ist, desto volatiler ist der Indikator, allerdings werden mit längeren Zeiträumen auch weniger Signale ausgelöst.

    Es wird zuerst die Summe aller positiven und negativen Kursänderungen errechnet:

    sum up ( t ) := ∑ i = 1 n max { P ( t − i + 1 ) − P ( t − i ) ; 0 } sum down ( t ) := − ∑ i = 1 n min { P ( t − i + 1 ) − P ( t − i ) ; 0 } {\displaystyle {\begin{aligned}{\text{sum}}_{\text{up}}(t)&:=\sum _{i=1}^{n}\max\{P(t-i+1)-P(t-i);0\}\\{\text{sum}}_{\text{down}}(t)&:=-\sum _{i=1}^{n}\min\{P(t-i+1)-P(t-i);0\}\end{aligned}}} {\displaystyle {\begin{aligned}{\text{sum}}_{\text{up}}(t)&:=\sum _{i=1}^{n}\max\{P(t-i+1)-P(t-i);0\}\\{\text{sum}}_{\text{down}}(t)&:=-\sum _{i=1}^{n}\min\{P(t-i+1)-P(t-i);0\}\end{aligned}}}
    

    Anschließend wird der Mittelwert der Summen genommen:

    avg up := sum up n avg down := sum down n {\displaystyle {\begin{aligned}{\text{avg}}_{\text{up}}&:={\frac {{\text{sum}}_{\text{up}}}{n}}\\{\text{avg}}_{\text{down}}&:={\frac {{\text{sum}}_{\text{down}}}{n}}\end{aligned}}} {\displaystyle {\begin{aligned}{\text{avg}}_{\text{up}}&:={\frac {{\text{sum}}_{\text{up}}}{n}}\\{\text{avg}}_{\text{down}}&:={\frac {{\text{sum}}_{\text{down}}}{n}}\end{aligned}}}
    

    Der RSI ergibt sich dann mit

    RSI := avg up avg up + avg down {\displaystyle {\text{RSI}}:={\frac {{\text{avg}}_{\text{up}}}{{\text{avg}}_{\text{up}}+{\text{avg}}_{\text{down}}}}} {\displaystyle {\text{RSI}}:={\frac {{\text{avg}}_{\text{up}}}{{\text{avg}}_{\text{up}}+{\text{avg}}_{\text{down}}}}}
    

    Alternativ zum arithmetischen Mittel kann auch exponentielle Glättung verwendet werden.
    Signal

    Aktien mit einem RSI von über 70 Prozent werden als „überkauft“ betrachtet, Werte mit einem RSI unter 30 Prozent als „überverkauft“. Manche Analysten passen diese Werte je nach Börsenumfeld an:

    in einem Bullenmarkt (Aufwärtstrend): Referenzlinie bei 40 % (überverkauft) und 80 % (überkauft)
    in einem Bärenmarkt (Abwärtstrend): Referenzlinie bei 20 % (überverkauft) und 60 % (überkauft)
    

    Allgemein wertet man das Erreichen oder Überschreiten der Schwellenwerte Richtung Mittelbereich als eines mehrerer möglicher Kauf- bzw. Verkaufssignale.*



  • @EmQEl
    Ok nachdem ich nochmal dein Eingangsposting gelesen habe, glaube ich langsam zu wissen was du möchtest.

    Du hast ja in deinen Beispielen immer wieder die iRSI Funktion benutzt. Ein Blick in die Doku der RSI Funktion liefert mir da einen Verdacht.

    RSI Doku

    Probiere doch mal bitte folgendes. Setze timeframe auf PERIOD_D1, period auf 3, applied_price auf PRICE_CLOSE und offset auf 0. Und nun schnapp dir einen Tageskurs und lass den RSI berechnen. Nun berechne diesen Wert von Hand aus den drei aktuellsten Kerzen. Sie müssten übereinstimmen.

    Und nun setze offset auf 1 und berechne wiederum den RSI. Wenn meine Vermutung stimmt, kannst du auch diesen von Hand ausrechnen, in dem du die vier aktuellsten Kerzen nimmst und die aktuellste Kerze verwirfst.

    Daher vermute ich dass du einfach über den Offset iterieren musst. Du bestimmt den RSI für Offset=0 und vergleichst den Wert mit RSI_IL_1 und RSI_IL_2. Ist die Bedingung nicht erfüllt erhöhst du Offset um 1, bestimmst den RSI neu und vergleichst wiederrum. Ist danach die Bedingung nicht erfüllt, wiederholst du das Ganze für Offset 2, 3, 4, 5, 6,...



  • Weiss gerade nicht, was mit Offset gemeint ist.

    Damit wird jedenfalls sozusagen der RSI aufgerufen, dessen Include im MQL-include Ordner ist:

    double RSI=iRSI(Symbol(),Timeframe,RSI_Period,RSI_Price,1);
    

    Wobei die 1 am Ende für die Kerze steht, auf die er berechnet werden soll. Im Grunde müsste man diese einfach nur immer wieder mit ++ erhöhen, bis man weiß, aus welcher Richtung der RSI kommt.

    RSI Indikator:
    https://filehorst.de/d/dmnEnFeH

    (MT 4) EA:
    https://filehorst.de/d/dvhdFlhc

    Erst mal die Anfangswerte deklarieren:

    int RSI_Past_Bar = 2;
    double RSI_Past = iRSI(Symbol(),Timeframe,RSI_Period,RSI_Price,RSI_Past_Bar);
    
    int RSI_P_under=0;
    int RSI_P_over=0;
    

    Dann Kerze für Kerze prüfen:

        if(RSI>RSI_IL_1&&Sto_Ma>Sto_Si ){
          
              
         while( RSI_Past < RSI ){
          
          RSI_P_under++;
              
          RSI_Past_Bar++;
          
          Print( "-RSI_Past_Bar=",RSI_Past_Bar , "-RSI_Past=",RSI_Past , "-RSI_P_under=",RSI_P_under );
              
          return(RSI_P_under);}
    
        if(RSI<RSI_IL_2&&Sto_Ma<Sto_Si ){
        
        
          while( RSI_Past > RSI ){
            
            RSI_P_over++;
            
            RSI_Past_Bar++;
            
            Print( "-RSI_Past_Bar=",RSI_Past_Bar , "-RSI_Past=",RSI_Past , "-RSI_P_over=",RSI_P_over );
            
            return(RSI_P_over);}
    

    Wenn am Ende der RSI_Past öfter über oder unter RSI Bar 1 war, soll das jeweils ne Bestätigung für Buy / Sell sein.

    Edit: Aber so wird das wahrscheinlich nix...



  • @EmQEl

    Weiss gerade nicht, was mit Offset gemeint ist.

    Sorry, ich meinte damit den shift Parameter. Schau einfach in die RSI Doku, dort siehst du den shift Parameter.

    Im Grunde müsste man diese einfach nur immer wieder mit ++ erhöhen, bis man weiß, aus welcher Richtung der RSI kommt.

    Genau das ist auch meine Vermutung. Ich würde aber wie zuvor besprochen die iRSI Funktion und deren Parameter überprüfen.



  • Oben war ich komplett auf dem Holzweg, befürchte ich...

    Es sollen allgemein in beide Richtungen Orders geöffnet werden:

    Buy (also drauf setzen, dass der Kurs nach oben geht), wenn die RSI-Kurve über IL 1 (untere Linie) ist und die Stochastic-Indikator anzeigt, dass es nach oben geht.

    if( RSI>RSI_IL_1 && Sto_Ma>Sto_Si  ){ ... Send Buy
    

    Sell (also drauf setzen, dass der Kurs nach unten geht), wenn die RSI-Kurve unter IL 2 (obere Linie) ist und der Stochastic-Indikator anzeigt, dass es nach unten geht.

    if( RSI<RSI_IL_2 && Sto_Ma<Sto_Si  ){... Send Sell
    

    Wie findet man also raus, ob die RSI-Kurve vorher bei nem Buy vorher unter IL 1 (untere Linie) und bei nem Sell vorher über IL 2 (obere Linie) war? Um Fehlsignale zu vermeiden.

    double RSI_Past = iRSI(Symbol(),Timeframe,RSI_Period,RSI_Price,RSI_Past_Bar);
    int RSI_Past_Bar = 2;
    
    

    Eigentlich kann man ja nur mit ner Schleife ein RSI-Shift (RSI_Past_Bar) nach dem anderen abfragen, indem man diesen mit ++ nach jeder Prüfung erhöht. Eigentlich einfach, aber ich hab keine Ahnung wie schreiben und formulieren usw...

    EA:
    filehorst.de/d/deBEAHBG

    RSI Oszillator:
    filehorst.de/d/dFJGgJqd


Log in to reply