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

Programmation : savoir si deux courbes se croisent ?

  • bperrin

    Bonjour,

    Comment savoir si deux courbes se croisent (par exemple les courbes de deux indicateurs tels que des moyennes mobiles...).

    Exemple sur méta-trader 4 pour avoir deux moyennes mobiles simples de périodes 5 et 10 on fait :
    double MA_5 = iMA(Symbol(), 0, 5, 0, MODE_EMA, PRICE_CLOSE, 0);
    double MA_10 = iMA(Symbol(), 0, 10, 0, MODE_EMA, PRICE_CLOSE, 0);

    Mais comment savoir si elles se coupent ?


    Merci d'avance pour toutes réponses.
  • furynick

    Il te suffit de récupérer la valeur précédente :
    Code
    double MA_5_current = iMA(Symbol(), 0, 5, 0, MODE_EMA, PRICE_CLOSE, 0); double MA_10_current = iMA(Symbol(), 0, 10, 0, MODE_EMA, PRICE_CLOSE, 0); double MA_5_previous = iMA(Symbol(), 0, 5, 0, MODE_EMA, PRICE_CLOSE, 1); double MA_10_previous = iMA(Symbol(), 0, 10, 0, MODE_EMA, PRICE_CLOSE, 1); signalBUY = MA_5_previous < MA_10_previous && MA_5_current > MA_10_current; signalSELL = MA_5_previous > MA_10_previous && MA_5_current < MA_10_current;
  • serin

    Bonjour

    Quand on a un indicateur dans MetaExpert Editeur,
    celui çi est construit dans un programme complexe.

    Si on veut l'introduire dans un Expert Advisor, y a t'il une possibilité simple, comme dans
    l'exemple plus haut sur les moyennes mobiles
  • JJFlash

    Salut serin

    Il me semble que tu as deux possibilité :

    - Soit tu te tape tout le code, pour le comprend et réutiliser uniquement se que tu veux.
    - Soit tu as une solution que l'on peut considérer comme "simple", qui consiste à faire un #include de l'indicateur que tu utiliser pour ton expet. Pour cela le moyen le plus simple et rapide c'est d'allé dans le fenêtre Navigateur, puis dans le premier onglet ( là où se trouve tout tes indicateurs et EA déjà programmé ). Ensuite tu trouves l'indicateur que tu veux utilisés, puis en gardant enfoncé le clique gauche, tu fais glisser ton indicateur sur la fenêtre où se trouve l'EA que tu es en train de coder. Un #include apparaîtra et tu pourra utiliser toutes les fonctions se trouvant dans le code de ton #include.

    J'ai jamais tenté cette méthode sur Metaéditor, mais en C++ sa marche très bien ^^
  • serin

    Merci pour ta réponse JJFlash,

    Mais c'est pas tout à fait ce que je voulais dire.
    Je n'ai jamais programmé un expert advisor mais j'essaye de comprendre comment faire :

    dans l'exemple plus haut bperrin parle d'une moyenne mobile simple et il écrit :
    double MA_5 = iMA(Symbol(), 0, 5, 0, MODE_EMA, PRICE_CLOSE, 0);

    cela veut il dire que tout le code de la moyenne mobile est contenu dans cette seule ligne ?
    alors que tu m'indiques de réécrire ou recopier tout un immense code d'un indicateur ?

    je comprends bien sûr que je dois dire des bêtises, mais je ne sais pas pourquoi ...
  • JJFlash

    Je vais tenter de répondre à ta question en étant le plus claire possible ^^

    Alors quand tu écris :

    double MA_5 = iMA(Symbol(), 0, 5, 0, MODE_EMA, PRICE_CLOSE, 0);

    Sa signifie que désormais tu va pouvoir désigner ta moyenne mobile (à 5 période appliqué au prix de fermeture de la bougie actuelle) par une variable qui s'appelle MA_5.

    Par analogie quand tu écris :

    double MA_10_current = iMA(Symbol(), 0, 10, 0, MODE_EMA, PRICE_CLOSE, 0);

    Sa signifie que désormais tu va pouvoir désigner ta moyenne mobile (à 10 période appliqué au prix de fermeture de la bougie actuelle) par une variable qui s'appelle MA_10.

    Donc maintenant dans ton programme si tu veux dire, par exemple, que tu veux lancer un ordre d'achat quand la moyenne mobile à 5 période (MA_5) passe au dessus de la moyenne mobile à 10 période (MA_10) ,et bien tu vas coder ainsi :
    Code
    if ( MA_5 > MA_10 ) { "Lancer un ordre d'achat (je ne me rappelle plus de la fonction qu'il faut utiliser pour cela) " }
    En gros c'est sa qu'il faut faire ! Mais il faut également rajouter une condition sur les moyennes mobiles de la bougie précédant.
    Mais déjà dit moi si je répond mieux à ta question ^^
    Modifié le 2012-12-03 21:04:54 par Lu-K : pensez à la balise code ;)
  • serin

    Pas tout à fait

    A mon tour d'essayer de m'expliquer un peu mieux
    : avec un exemple

    je vais sur MetatraderExpertEditor et je prends le code suivant :
    Code
    DEBUT ((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((( #property link "http://www.forexfactory.com/showthread.php?t=29419" #property indicator_chart_window #property indicator_buffers 1 #property indicator_color1 Red #property indicator_width1 1 //---- input parameters extern int PERIOD =12; //---- indicator buffer double Buffer[]; //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ int init() { IndicatorShortName("DEMA("+PERIOD+")"); SetIndexBuffer(0,Buffer); SetIndexStyle(0,DRAW_LINE); } //+------------------------------------------------------------------+ int start() { int limit=Bars-1-IndicatorCounted(); //---- static double lastEMA, lastEMA_of_EMA; double weight=2.0/(1.0+PERIOD); if(IndicatorCounted()==0) { Buffer[limit] =Close[limit]; lastEMA =Close[limit]; lastEMA_of_EMA =Close[limit]; limit--; } //---- // Calculate old bars (not the latest), if necessary for(int i=limit; i > 0; i--) { lastEMA =weight*Close[i] + (1.0-weight)*lastEMA; lastEMA_of_EMA =weight*lastEMA + (1.0-weight)*lastEMA_of_EMA; Buffer[i]=2.0*lastEMA - lastEMA_of_EMA; } //---- // (Re)calculate current bar double EMA =weight*Close[0] + (1.0-weight)*lastEMA, EMA_of_EMA =weight*EMA + (1.0-weight)*lastEMA_of_EMA; Buffer[0]=2.0*EMA - EMA_of_EMA; //---- return(0); } //+------------------------------------------------------------------+ ((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((( FIN
    ce programme trace une courbe comme une moyenne mobile appelons le SERIN
    Existe t'il un moyen de résumer SERIN dans une commande simple comme avec la moyenne mobile
    que tu écris :

    soit double MA_5 ?
    ou plustôt
    iMA(Symbol(), 0, 5, 0, MODE_EMA, PRICE_CLOSE, 0 ?

    j'espère que je ne t'ennuie pas trop ...
    Modifié le 2012-12-03 21:04:40 par Lu-K : pensez à la balise code ;)
  • JJFlash

    AAAh je pense enfin voir se que tu veux ! (enfin du moins je l'espère ^^)

    En fait se que tu veux c'est carrément une fonction qui s'appellerai SERIN qui serai ta moyenne mobile à toi.
    Et faire cela c'est très simple ^^ !
    La marche suivre et la suivant :
    Tu fais un copier collé de tout se qui se trouve dans ton int strat() et tu mets tout cela dans une fonction externe que tu pourras réutiliser ainsi (exemple) :
    double MA_SERIN = SERIN( //argument dont tu as besoin //) ;

    Es ce que sa serai cela que tu souhaites pour ta moyenne mobile "personnalisé" ? Dans ce cas là je détaillerai les chose
  • serin

    Euréka , on y est , c'est bien ça.
    A partir d'un indicateur quel qu'il soit ,
    comment l'écrire le plus simplement ( si c'est possible ) dans un programme E.A..
  • JJFlash

    Ah ! on y arrive enfin alors ^^
    Alors c'est très simple. Tu vas devoir créer une fonction que tu va pouvoir utiliser dans ton expert advisor ou indicateur technique.
    Pour cela, il faut que tu te mettes en dehors des fonctions int start(), int init() et int desinit. Par exemple je pense que tu peux écrire la fonction tout a la fin de ton coder d'expert advisor ou même tout au début.
    Ensuite tu vas créer ta fonction en déclarant le type de ta fonction, c'est à dire si à la sorti de ta fonction on récupère un entier ou un réel...
    Apparemment c'est une moyenne mobile ton indicateur technique donc sa sera un type double (réel)
    Tu vas donc écrire :
    Code
    double SERIN( //argument que tu as besoin// ) { // tu fais un copier collé de tout se que tu as écrire dans le start() que tu as posté il y à deux message // // il faut que tu change ton return(0) en return( //la variable qui contient la valeur de ta moyenne mobile// ) }
    Et voilà normalement sa devait fonctionner ^^
    Modifié le 2012-12-03 21:05:15 par Lu-K : pensez à la balise code ;)
  • JJFlash

    Je te renvoie au vidéo de bperrin dans là quelle il code en live un indicateur technique (ou un expert advisor je sais plus) basé sur les point pivot il me semble ou les moyenne mobile également (je me souvient plus aussi XD)

    http://www.forexagone.com/videos/traders/bperrin/65-partie-1-programmez-votre-premier-expert-advisors-sur-mt4
    http://www.forexagone.com/videos/traders/bperrin/66-partie-2-programmez-votre-premier-expert-advisors-sur-mt4
  • serin

    Ok , merci encore , je vais aller voir tout ça
    ça va me prendre du temps , je reviens dès que je cale ...