Rejoindre la communauté
banner_forum
Devenez membre de la plus grande
communauté francophone sur le Forex
Partagez, échangez et apprenez en gagnant des crédits sur votre compte de trading

Programmer une Alerte RSI sur MT4

  • sevenup

    bonjour,

    je souhaite avoir une alerte sur la zone de sur achat et sur vente en pouvant programmer différentes lignes de sur achat/vente. et éventuellement croisement de la ligne de 50
    alerte visuelle au minimum et sonore pourquoi pas.

    si vous auriez cela, et m''expliquer comment l'intégrer dans le MT4, merci d'avance.
  • riden

    Salut,

    Le rsi par défaut est appliqué au prix de clôture. cela veut dire que son extimité (rsi[0]) est toujours mobile et dépend de Close[0].
    pour confirmer un croisement par rapport à la ligne 50 il faut utiliser rsi[1] et rsi[2] car si on utilise rsi[0] et rsi [1] on peut voir beaucoup de faux-croisements.

    donc la condition principale est : if rsi[2]>50 && rsi[1]<50 ou if rsi[2]<50 && rsi[1]>50

    l'alerte visuelle se fait par la fonction "Alert" et l'alerte sonore se fait par la fonction "PlaySound".

    Si la condition est vérifiée, on aura une alerte et un signal sonore à chaque tick.
    Pour éviter cela:
    Code
    ....... int rep_t = 2*TimeCurrent(); double rsi1, rsi2; ............ void OnTick() { .......... rsi1 = iRSI(Symbol(),Period(),14,PRICE_CLOSE,1); rsi2 = iRSI(Symbol(),Period(),14,PRICE_CLOSE,2); if (rsi1>50 && rsi2<50){ if(rep_t > Time[0]+Period()*60){ Alert(Symbol()+"_"+Period()+" / Croisement à la hausse"); PlaySound("n_importe_quel_son.wav"); rep_t = TimeCurrent();}} ......

    Comme ça on aura une fréquence d'un signal par bougie.
    Je n'ai pas fais attention à la syntaxe mais le plus important c'est que l'idée soit claire.
    Modifié le 2019-11-06 21:54:54 par riden
  • sevenup — en réponse à riden dans son message #116927

    bonsoir riden,
    je te remercie du travail, mais je ne suis pas programmeur, ni codeur…
    comment mettre ça sur ma plate forme? possible d'avoir un fichier MQ.4 ou la marche à suivre dans l'éditeur pour fabriquer un fichier MQ.4

    est ce les alertes se feront au contact de la ligne de 70 et aussi celle de 30 en les traversant ,bougie close.

    merci d'avance

    cordialement
  • riden — en réponse à sevenup dans son message #116928

    Salut,
    je vais coder ce petit EA pour toi. Avant de commencer, tout ce que tu veux c'est une alerte et un signal sonore lors du croisement du RSI14 au niveau des ligne 30,50 et 70 sur le TF du graph. ?

    je me suis aperçu que j'ai fait une petite erreur sur le code précédent.

    Code
    ..... int rep_t = 0; ....... if (rsi1>50 && rsi2<50){ if(TimeCurrent() > rep_t){ ......... rep_t = Time[0]+Period()*60;}}
  • sevenup

    bonjour riden,

    oui quand la ligne croise ou la ligne RSI14.. 70/50/30 bougie close il me faut une alerte visuel sur le graphique , option alerte sonore en plus.

    c'est tout ….merci d'avance

    cdt
  • riden

    Salut,

    Depuis MT4 tu ouvres mql4 (touche F4 du clavier) puis tu vas dans "Fichier-->Nouveau--->Expert Consultant----->suivant, suivant..Terminer (tu lui donnes le nom que tu veux)...
    Après dans Metaeditor tu colles le code ci-dessous puis tu compiles soit en cliquant sur "Compiler" en haut soit en tapant sur la touche F7.
    Une fois compilé, tu fermes MetaEditor puis dans MT4 tu affiches le navigateur (Ctrl+N). Tu trouveras le EA dans le navigateur sous "Expert Consultant".

    Code
    //+------------------------------------------------------------------+ //| alert_crois_rsi.mq4 | //| riden | //| riden | //+------------------------------------------------------------------+ #property copyright "riden" #property link "riden" #property version "1.00" #property strict datetime rep_30 = 0; datetime rep_50 = 0; datetime rep_70 = 0; double rsi1, rsi2; //+------------------------------------------------------------------+ //| Expert initialization function | //+------------------------------------------------------------------+ int OnInit() { //--- //--- return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ //| Expert deinitialization function | //+------------------------------------------------------------------+ void OnDeinit(const int reason) { //--- } //+------------------------------------------------------------------+ //| Expert tick function | //+------------------------------------------------------------------+ void OnTick() { //--- rsi1 = iRSI(Symbol(),Period(),14,PRICE_CLOSE,1); rsi2 = iRSI(Symbol(),Period(),14,PRICE_CLOSE,2); //--------------------------------------50--------------------------------- if (rsi1>50 && rsi2<50){ if(TimeCurrent() > rep_50){ Alert(Symbol()+"_"+DoubleToString(Period(),0)+" / Croisement à la hausse de la ligne 50"); PlaySound("news.wav"); rep_50 = Time[0]+Period()*60;}} if (rsi1<50 && rsi2>50){ if(TimeCurrent() > rep_50){ Alert(Symbol()+"_"+DoubleToString(Period(),0)+" / Croisement à la baisse de la ligne 50"); PlaySound("news.wav"); rep_50 = Time[0]+Period()*60;}} //--------------------------------------30--------------------------------- if (rsi1>30 && rsi2<30){ if(TimeCurrent() > rep_30){ Alert(Symbol()+"_"+DoubleToString(Period(),0)+" / Croisement à la hausse de la ligne 30"); PlaySound("news.wav"); rep_30 = Time[0]+Period()*60;}} if (rsi1<30 && rsi2>30){ if(TimeCurrent() > rep_30){ Alert(Symbol()+"_"+DoubleToString(Period(),0)+" / Croisement à la baisse de la ligne 30"); PlaySound("news.wav"); rep_30 = Time[0]+Period()*60;}} //--------------------------------------70--------------------------------- if (rsi1>70 && rsi2<70){ if(TimeCurrent() > rep_70){ Alert(Symbol()+"_"+DoubleToString(Period(),0)+" / Croisement à la hausse de la ligne 70"); PlaySound("news.wav"); rep_70 = Time[0]+Period()*60;}} if (rsi1<70 && rsi2>70){ if(TimeCurrent() > rep_70){ Alert(Symbol()+"_"+DoubleToString(Period(),0)+" / Croisement à la baisse de la ligne 70"); PlaySound("news.wav"); rep_70 = Time[0]+Period()*60;}} } //+------------------------------------------------------------------+
    Modifié le 2019-11-07 12:13:38 par riden
  • sevenup

    bonjour riden,

    j'ai tout suivi mais quand je compile le code MQ.4 il m'ouvre une fenetre pour me dire qu'il y a deux erreurs sur deux lignes (104/54) et ça me dit ça:
    unexpected end the programm
    unbalanced parenthèses

    que dois je faire car du coup quand je ferme,il n'y a rien dans expert consultant...
  • sevenup

    j'ai pu corrigé en essayant de comprendre ton code...il manquait un } en ligne 105 et là après compil , il n'y a plus d'erreur.

    d'après ma lecture cartésienne, j'ai vu qu'il y avait un { et que cette parenthése semblait pas être fermé.

    en tout cas merci beaucoup pour ce code qui est pour moi un monde obscur… à la différence du trading.

    si je peux te rendre un serviceà ce sujet….contacte moi en MP.

    cordialement franck
  • riden — en réponse à sevenup dans son message #116998

    Je viens de compiler et il n'y a aucune erreur.
    assures toi de tout supprimer (Ctrl+A puis Suppr) avant de coller le code et compiler.
  • riden — en réponse à sevenup dans son message #116999

    Salut,
    je n'ai pas vu ton dernier message j'étais en train de re-compiler pour répondre à l'autre message.
    N'hésites pas à me demander si tu as une proposition d'amélioration ou une idée que tu souhaites traduire en EA. (Tant qu'il ne s'agit pas d'un grand EA (faute de temps))
  • sevenup

    merci riden,
    le programme fonctionne parfaitement bien et l'alerte est nickel….fenêtre d'info et sonore. ça m'aide bien dans mon suivi de trading.
    pour apporter une amélioration, est ce qu'il serait possible de mettre un mini triangle vert dessus la bougie vers le haut ( signal croisement haussier rsi 70) et un triangle rouge sous la bougie vers le bas( croisement baissier rsi 30) qui apparaitrait quand le signal sonne et qui se mettrait sur le graphique lui même. donc en bougie close.

    si ça peut aider d'autre personne, ça serait parfait…

    un grand merci à toi pour ton excellent travail. ( je suis jaloux d'être incapable de faire cela, mais on ne peut pas être bon en tout!!lol)

    cordialement franck
  • riden

    Salut,
    Si j'ai bien compris, lorsque rsi2>30 et rsi1<30 (passage du rsi sous la ligne 30) alors sur la bougie actuelle on dessine le triangle ou la flèche pour indiquer un signal de vente ? (et vice-versa pour la ligne 70)

    Si c'est le cas, et que les flèches seront dessinées sur l'historique (bougies précédentes), alors il s'agit d'un indicateur et non plus d'un EA. Tu vas dans metaeditor-->fichier--->nouveau---->indicateur personnalisé-->etc.. puis tu colles ce morceau de code (n'oublis pas de compiler) qui va tourner en même temps que le EA précédent.

    Code
    //+------------------------------------------------------------------+ //| RSI_croisement.mq4 | //| riden | //| riden | //+------------------------------------------------------------------+ #property copyright "riden" #property link "riden" #property indicator_chart_window #property indicator_buffers 2 #property indicator_color1 Lime #property indicator_width1 4 #property indicator_color2 Salmon #property indicator_width2 4 //--- input parameters //bool FILTER_BOL=true; //datetime set_tm_tmg = 0; string nom_txt; string temp_name; //--- buffers double rsi_bas[]; double rsi_haut[]; //---------------------------------------------------------------------------------------------------- int rsiX(int t, int shift){ double rsi1,rsi2; rsi1 = iRSI(Symbol(),t,14,PRICE_CLOSE,shift); rsi2 = iRSI(Symbol(),t,14,PRICE_CLOSE,shift+1); if( rsi1<30 && rsi2>30 ) return(0); if( rsi1>70 && rsi2<70 ) return(1); return(3);} //---------------------------------------------Diff en pips entre deux niveau de prix-----------------------------// double diff_pips(string paire, double p1, double p2){ double res; res=NormalizeDouble(MathAbs(p1-p2)/(MarketInfo(paire,MODE_POINT)*10*dig(paire)),1); return(res);} //-----------------------------------------compatibité 2 & 4 digits--------------------------------------- double dig(string paire){ if( (MarketInfo(paire,MODE_DIGITS)==4) || (MarketInfo(paire,MODE_DIGITS)==2) ) return(0.1); if( (MarketInfo(paire,MODE_DIGITS)==3) || (MarketInfo(paire,MODE_DIGITS)==5) ) return(1.0);return(1.0);} //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ int init() { //---- indicators SetIndexStyle(0,DRAW_ARROW); SetIndexArrow(0,225); SetIndexBuffer(0,rsi_bas); SetIndexEmptyValue(0,0.0); SetIndexStyle(1,DRAW_ARROW); SetIndexArrow(1,226); SetIndexBuffer(1,rsi_haut); SetIndexEmptyValue(1,0.0); //---- return(0); } //+------------------------------------------------------------------+ //| Custom indicator deinitialization function | //+------------------------------------------------------------------+ int deinit() { //---- //---- return(0); } //+------------------------------------------------------------------+ //| Custom indicator iteration function | //+------------------------------------------------------------------+ int start() { int counted_bars=IndicatorCounted(); //---- //---- check for possible errors if (counted_bars<0) return(-1); //---- last counted bar will be recounted if (counted_bars>0) counted_bars--; int pos=Bars-counted_bars; //Comment("Hi! I m here on the main chart windows!"); //---- main calculation loop while(pos>=0) { if( rsiX(Period(), pos+1)==1 ){ rsi_bas[pos] = iLow(Symbol(),Period(),pos)-100*Point*dig(Symbol()); } if( rsiX(Period(), pos+1)==0 ){ rsi_haut[pos]= iHigh(Symbol(),Period(),pos)+100*Point*dig(Symbol()); } pos--; } Sleep(1000); return(0); } //+------------------------------------------------------------------+
  • sevenup

    bonjour riden,

    j'ai bien fait tout comme indiqué, metaéditor, nouveau ,indicateur perso et j'ai collé tout le code ci dessus..; j'ai compilé et j'ai fermé meta éditor…. mais je ne retrouve pas cette indicateur dans ma liste disponible sur MT4...

    j'ai raté quoi?
  • sevenup

    ok , j'ai trouvé mon erreur, il fallait juste fermer ma plateofrme et la rouvrir pour que l'indicateur s'installe…

    sinon , est il possible d'avoir un point rouge ou mini triangle (baisse) et point vert( hausse) comme dans l'indicateur SAR car les fléches sont trop grosses et ça cache les bougies.

    merci d'avance….

    question subsidiaire, pourrait on faire un robot de trading avec cette indicateur ou le EA rsi 30/70?

    toi qui connait bien MT4, je n' arrive pas à trouver comment backtester un robot sur un graphique du passé… genre, je voudrais tester si je trade avec les croisements du rsi 30 à la hausse en call et les croisements du rsi à la baisse 70 entestant tous les ut, si c'est gagnant sur 5 ans,10 ans,20 ans….par exemple.

    si tu as des réponses, merci bcp du temps pris et de ton aide.

    cordialement franck
  • riden

    Dans la partie
    Code
    .... //---- indicators SetIndexStyle(0,DRAW_ARROW); SetIndexArrow(0,225); SetIndexBuffer(0,rsi_bas); SetIndexEmptyValue(0,0.0); SetIndexStyle(1,DRAW_ARROW); SetIndexArrow(1,226); SetIndexBuffer(1,rsi_haut); SetIndexEmptyValue(1,0.0); //---- ....

    225 signifie flèche haut et 226 flèche bas.
    depuis ce lien (https://docs.mql4.com/constants/objectconstants/wingdings) tu peux choisir n'importe quel objet (fleche/ triangle / etc...)

    puis dans la partie:
    Code
    #property indicator_chart_window #property indicator_buffers 2 #property indicator_color1 Lime #property indicator_width1 4 #property indicator_color2 Salmon #property indicator_width2 4
    tu peux modifier la taille et la couleur de l'objet (width pour la taille)
    Les flèches sont de taille 4 si tu mets 1 tu auras des toutes petites flèches.


    Dans la partie
    Code
    rsi_bas[pos] = iLow(Symbol(),Period(),pos)-100*Point*dig(Symbol());
    100 signifie que la flèche est dessinée 10 pips au-dessous du plus bas de la bougie

    Comme ça tu peux tout modifier
  • sevenup — en réponse à riden dans son message #117217

    ok , je crois avoir tout piger, je vais tenter de modifier l'indicateur.

    et pour les autres questions, robot trading avec l'EA et indicateur?

    je te tiens au courant.
  • sevenup — en réponse à riden dans son message #117217

    bon riden, j'ai bien compris ta leçon.
    j'ai changé le modèle de flèche, le sens de la fléche, je l'ai mis dessus quand ça indique short et dessous pour indiquer call, j'ai changé la couleur et la taille...et la distance par rapport à la bougie.

    merci je vais me coucher moins bète!
    Modifié le 2019-11-19 15:33:09 par sevenup
  • riden

    Il est simple de backtester un EA (Ctrl+R pour ouvrir le testeur puis choisir le EA et la paire de devise, intervalle de dates etc..) mais il faut trouver une source fiable pour télécharger l'historique.. Tickstory est bien réputé mais il est devenu payant (c'est gratuit pour le téléchargement de l'historique d'un an seulement). Je n'ai pas fait des recherches sur ce sujet depuis longtemps, essayes tu trouveras peut-être des data gratuits sur internet. sinon tu peux télécharger les data depuis mt4 (c'est mieux que rien).
  • sevenup

    riden:" Si j'ai bien compris, lorsque rsi2>30 et rsi1<30 (passage du rsi sous la ligne 30) alors sur la bougie actuelle on dessine le triangle ou la flèche pour indiquer un signal de vente ? (et vice-versa pour la ligne 70)""

    en regardant de prés le résultat sur les graphiques, je crois que j'ai mal expliqué.

    quand le rsi est sous la ligne de 30 et qu'il recoupe le rsi30 en montant( au dessus) il faut la flèche montante sous la bougie pour indiquer qu'il faut caller
    quand le rsi est dessus la ligne de 70 et qu'il recoupe le rsi70 en descendant ( au dessous) il faut la flèche vers le bas dessus la bougie pour indiquer qu'il faut shorter.

    qu'est ce qu'il faut modifier comme paramètres dans l'indicateurs?

    merci et désolé pour ma première explication.
  • riden

    Il n'y a pas de souci tu remplace la fonction rsiX par:


    Code
    //---------------------------------------------------------------------------------------------------- int rsiX(int t, int shift){ double rsi1,rsi2; rsi1 = iRSI(Symbol(),t,14,PRICE_CLOSE,shift); rsi2 = iRSI(Symbol(),t,14,PRICE_CLOSE,shift+1); if( rsi1>30 && rsi2<30 ) return(1); if( rsi1<70 && rsi2>70 ) return(0); return(3);}