Mon compte
Déjà membre ? S'identifier
Non inscrit ? S'inscrire
 
+ Répondre à la discussion
Affichage des résultats 1 à 3 sur 3
  1. #1
    Membre lvl 5 pingoo est sur la route de la réputation...
    Date d'inscription
    January 2009
    Messages
    13
    Pouvoir de réputation
    6

    pb mql4 pb mql4

    Salut,
    J'utilise le moving averages en indicateur et je souhaiterais indiquer dans une variable en temps réel le prix de l'indicateur..
    Voici le code :
    //+------------------------------------------------------------------+
    //| Custom Moving Average.mq4 |
    //| Copyright © 2004, MetaQuotes Software Corp. |
    //| http://www.metaquotes.net/ |
    //+------------------------------------------------------------------+
    #property copyright "Copyright © 2004, MetaQuotes Software Corp."
    #property link "http://www.metaquotes.net/"

    #property indicator_chart_window // Affiche l'indicateur sur la courbe (void)
    #property indicator_buffers 1 // Nombre de tampons (1 à 8) pour l'indicateur
    #property indicator_color1 Red // Couleur de la ligne X (où X vaut de 1 à 8)
    //---- indicator parameters
    extern int MA_Period=32; // variable externe entier
    extern int MA_Shift=0; // variable externe entier
    extern int MA_Method=0; // variable externe entier
    //---- indicator buffers
    double ExtMapBuffer[]; // réel (nombre à virgule flottante)
    //----
    int ExtCountedBars=0; // entier
    //+------------------------------------------------------------------+
    //| Custom indicator initialization function |
    //+------------------------------------------------------------------+
    int init() // action effectué à chaque chargement du script. le but est d'initialiser toute les variables...
    {
    int draw_begin; // entier
    string short_name; // chaîne de caractère
    //---- drawing settings
    SetIndexStyle(0,DRAW_LINE); // type de ligne (tire une ligne)
    SetIndexShift(0,MA_Shift); // valeur pour la ligne
    IndicatorDigits(MarketInfo(Symbol(),MODE_DIGITS)); // precise le format du chiffre
    if(MA_Period<2) MA_Period=32;
    draw_begin=MA_Period-1;
    //---- indicator short name
    switch(MA_Method)
    {
    case 1 : short_name="EMA("; draw_begin=0; break;
    case 2 : short_name="SMMA("; break;
    case 3 : short_name="LWMA("; break;
    default :
    MA_Method=0;
    short_name="SMA(";
    }
    IndicatorShortName(short_name+MA_Period+")"); //nouveau nom
    SetIndexDrawBegin(0,draw_begin); // debut du dessin de l'indicateur
    //---- indicator buffers mapping
    SetIndexBuffer(0,ExtMapBuffer); // première ligne de tampon
    //---- initialization done
    return(0);
    }
    //+------------------------------------------------------------------+
    //| |
    //+------------------------------------------------------------------+
    int start() // action effectué à chaque changement de prix (code principale)
    {

    double nb;
    if(Bars<=MA_Period) return(0); // si le NB de Bars<=Ma_period alors l'action est annulé
    ExtCountedBars=IndicatorCounted(); // La fonction est utilisée pour optimiser le calcul de la valeur de l'indice
    //---- Pour vérifier d'éventuelles erreurs
    if (ExtCountedBars<0) return(-1);
    //---- La dernière barre sera recontée
    if (ExtCountedBars>0) ExtCountedBars--;
    //----
    switch(MA_Method)
    {
    case 0 : nb = sma(); break;
    case 1 : nb = ema(); break;
    case 2 : nb = smma(); break;
    case 3 : nb = lwma();
    }
    Comment(nb);
    //---- done
    return(0);
    }

    //+------------------------------------------------------------------+
    //| Simple Moving Average |
    //+------------------------------------------------------------------+
    double sma()
    {
    double ret;
    double sum=0; // réel (nombre à virgule flottante)
    int i,pos=Bars-ExtCountedBars-1;
    //---- initial accumulation
    if(pos<MA_Period) pos=MA_Period;
    for(i=1;i<MA_Period;i++,pos--)
    sum+=Close[pos];
    //---- main calculation loop
    while(pos>=0)
    {
    sum+=Close[pos];
    ExtMapBuffer[pos]=sum/MA_Period;
    sum-=Close[pos+MA_Period-1];
    ret = sum;
    pos--;
    }
    //---- zero initial bars
    if(ExtCountedBars<1)
    for(i=1;i<MA_Period;i++) ExtMapBuffer[Bars-i]=0;

    return (ret);
    }
    //+------------------------------------------------------------------+
    //| Exponential Moving Average |
    //+------------------------------------------------------------------+
    double ema()
    {
    double ret;
    double pr=2.0/(MA_Period+1);
    int pos=Bars-2;
    if(ExtCountedBars>2) pos=Bars-ExtCountedBars-1;
    //---- main calculation loop
    while(pos>=0)
    {
    if(pos==Bars-2) ExtMapBuffer[pos+1]=Close[pos+1];
    ExtMapBuffer[pos]=Close[pos]*pr+ExtMapBuffer[pos+1]*(1-pr);
    pos--;
    }
    ret = pos;
    return (ret);
    }
    //+------------------------------------------------------------------+
    //| Smoothed Moving Average |
    //+------------------------------------------------------------------+
    double smma()
    {
    double ret;
    double sum=0;
    int i,k,pos=Bars-ExtCountedBars+1;
    //---- main calculation loop
    pos=Bars-MA_Period;
    if(pos>Bars-ExtCountedBars) pos=Bars-ExtCountedBars;
    while(pos>=0)
    {
    if(pos==Bars-MA_Period)
    {
    //---- initial accumulation
    for(i=0,k=pos;i<MA_Period;i++,k++)
    {
    sum+=Close[k];
    //---- zero initial bars
    ExtMapBuffer[k]=0;
    }
    }
    else sum=ExtMapBuffer[pos+1]*(MA_Period-1)+Close[pos];
    ExtMapBuffer[pos]=sum/MA_Period;
    pos--;
    }
    ret = sum;
    return (ret);
    }
    //+------------------------------------------------------------------+
    //| Linear Weighted Moving Average |
    //+------------------------------------------------------------------+
    double lwma()
    {
    double ret;
    double sum=0.0,lsum=0.0;
    double price;
    int i,weight=0,pos=Bars-ExtCountedBars-1;
    //---- initial accumulation
    if(pos<MA_Period) pos=MA_Period;
    for(i=1;i<=MA_Period;i++,pos--)
    {
    price=Close[pos];
    sum+=price*i;
    lsum+=price;
    weight+=i;
    }
    //---- main calculation loop
    pos++;
    i=pos+MA_Period;
    while(pos>=0)
    {
    ExtMapBuffer[pos]=sum/weight;
    if(pos==0) break;
    pos--;
    i--;
    price=Close[pos];
    sum=sum-lsum+price*MA_Period;
    lsum-=Close[i];
    lsum+=price;
    }
    //---- zero initial bars
    if(ExtCountedBars<1)
    for(i=1;i<MA_Period;i++) ExtMapBuffer[Bars-i]=0;
    ret = lsum;
    return (ret);
    }
    //+------------------------------------------------------------------+

    Pouvez vous m'aider à trouver le prix auquel ce trouve l'indicateur sachant que j'ai créé la variable nb à cette occasion ?

    Merci

  2. #2
    Membre lvl 75 trader24 est actif et passionnant
    Date d'inscription
    August 2008
    Localisation
    Sarlat
    Messages
    87
    Pouvoir de réputation
    13

    Il suffit d'ajouter à la fin de la fonction start():

    switch(MA_Method)
    {
    case 0 : nb = sma(); break;
    case 1 : nb = ema(); break;
    case 2 : nb = smma(); break;
    case 3 : nb = lwma();
    }
    //-------------------------------------
    Comment(ExtMapBuffer[0]); // C'est la dernière barre calculuée
    /--------------------------------------
    //---- done
    return(0);

    PHIL

  3. #3
    Membre lvl 5 pingoo est sur la route de la réputation...
    Date d'inscription
    January 2009
    Messages
    13
    Pouvoir de réputation
    6

    ok merci, j'ai cependant un dernier petit pb, lorsque je souhaite créer une régle basé sur ce chiffre et que je fait un backtest je n'ai aucun résultat??
    Voici l'erreur obtenu :
    2009.01.25 13:18:50 TestGenerator: unmatched data error (volume limit 597 at 2009.01.23 13:00 exceeded)

    Pouvez vous me dire ou peut être mon erreur?

Discussions similaires

  1. Demande aide MQL4 - Fonction OrderSend
    Par Leo dans le forum Systèmes de Trading Auto
    Réponses: 7
    Dernier message: 18/08/2008, 22h58

Ajouter aux Favoris | Plan du site | Archives | Forex | Contact