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

    transformation d'indicateur transformation d'indicateur

    Je me suis lancé dans la transformation d'un indicateur...le CCI que vous connaissez tous et qui se trouve dans la base des indic de MT4.

    Le CCI classique est appliqué sur les prix (le close)...mon but était de l'appliqué sur un autre indicateur. J'ai choisi comme premier test le Macd.

    Je pense que le tracé est juste mais malheureusement je ne comprend pas pourquoi la valeur ne varie pas entre une zone positive et negative comme le fait le cci classique.

    Je vous poste en fichier attaché le graphique...
    et voici le code avec les transformations que j'y ai apporté.
    ...alors si qq à une explication ...ça serai sympa

    merci d'avance

    Soutine

    ---code----


    //+------------------------------------------------------------------+
    //| CCI_Macd.mq4 |
    //| Copyright © 2004, MetaQuotes Software Corp. |
    //| MetaTrader 4, metatrader 5, TeamWox / MetaQuotes Software Corp. |
    //+------------------------------------------------------------------+
    #property copyright "Copyright © 2004, MetaQuotes Software Corp."
    #property link "http://www.metaquotes.net/"
    //----
    #property indicator_separate_window
    #property indicator_buffers 1
    #property indicator_color1 LightSeaGreen
    //---- input parameters
    extern int CCIPeriod = 10;
    //---- buffers
    double CCIBuffer[];
    double RelBuffer[];
    double DevBuffer[];
    double MovBuffer[];
    //+------------------------------------------------------------------+
    //| Custom indicator initialization function |
    //+------------------------------------------------------------------+
    int init()
    {
    string short_name;
    //---- 3 additional buffers are used for counting.
    IndicatorBuffers(4);
    SetIndexBuffer(1, RelBuffer);
    SetIndexBuffer(2, DevBuffer);
    SetIndexBuffer(3, MovBuffer);
    //---- indicator lines
    SetIndexStyle(0, DRAW_LINE);
    SetIndexBuffer(0, CCIBuffer);
    //----
    if(CCIPeriod <= 0)
    CCIPeriod = 10;
    //----
    SetIndexDrawBegin(0, CCIPeriod);

    //---- name for DataWindow and indicator subwindow label
    short_name="CCI(" + CCIPeriod + ")";
    IndicatorShortName(short_name);
    SetIndexLabel(0, short_name);
    //----
    return(0);
    }
    //+------------------------------------------------------------------+
    //| Commodity Channel Index |
    //+------------------------------------------------------------------+
    int start()
    {
    int i, k, counted_bars = IndicatorCounted();
    double price, sum, mul;
    if(CCIPeriod <= 1)
    return(0);
    if(Bars <= CCIPeriod)
    return(0);
    //---- initial zero
    if(counted_bars < 1)
    {
    for(i = 1; i <= CCIPeriod; i++)
    CCIBuffer[Bars-i] = 0.0;
    for(i = 1; i <= CCIPeriod; i++)
    DevBuffer[Bars-i] = 0.0;
    for(i = 1; i <= CCIPeriod; i++)
    MovBuffer[Bars-i] =0.0;
    }
    //---- last counted bar will be recounted
    int limit = Bars - counted_bars;
    if(counted_bars > 0)
    limit++;
    //---- moving average
    for(i = 0; i < limit; i++)
    MovBuffer[i] = iMA(NULL, 0, CCIPeriod, 0, MODE_SMA, PRICE_TYPICAL, i);
    //---- standard deviations
    i = Bars - CCIPeriod + 1;
    if(counted_bars > CCIPeriod - 1)
    i = Bars - counted_bars - 1;
    mul = 0.015 / CCIPeriod;
    while(i >= 0)
    {
    sum = 0.0;
    k = i + CCIPeriod - 1;
    while(k >= i)
    {
    price = iMA(NULL,0,4,0,MODE_EMA,PRICE_CLOSE,k)-iMA(NULL,0,20,0,MODE_EMA,PRICE_CLOSE,k);
    //avant ... price =(High[k] + Low[k] + Close[k]) / 3;
    sum += MathAbs(price - MovBuffer[i]);
    k--;
    }
    DevBuffer[i] = sum*mul;
    i--;
    }
    i = Bars - CCIPeriod + 1;
    if(counted_bars > CCIPeriod - 1)
    i = Bars - counted_bars - 1;
    while(i >= 0)
    {
    price =iMA(NULL,0,4,0,MODE_EMA,PRICE_CLOSE,i)-iMA(NULL,0,20,0,MODE_EMA,PRICE_CLOSE,i);
    // avant ;;; price = (High[i] + Low[i] + Close[i]) / 3;
    RelBuffer[i] = price - MovBuffer[i];
    i--;
    }
    //---- cci counting
    i = Bars - CCIPeriod + 1;
    if(counted_bars > CCIPeriod - 1)
    i = Bars - counted_bars - 1;
    while(i >= 0)
    {
    if(DevBuffer[i] == 0.0)
    CCIBuffer[i] = 0.0;
    else
    CCIBuffer[i] = RelBuffer[i] / DevBuffer[i];
    i--;
    }
    //----
    return(0);
    }
    //+------------------------------------------------------------------+
    Images attachées
    Dernière modification par soutine ; 21/12/2009 à 16h53.

  2. #2
    Membre lvl 5 sohocool est sur la route de la réputation... Avatar de sohocool
    Date d'inscription
    March 2009
    Messages
    23
    Pouvoir de réputation
    5

    Bonsoir Soutine,

    Tu dois ,aussi changer la moyenne du CCi.

    La,aussi tu dois changer le price_typical avec ton macd.

    Mais ,je ne crois pas ,que tu peux le faire directement.



    MovBuffer[i] = iMA(NULL, 0, CCIPeriod, 0, MODE_SMA, PRICE_TYPICAL, i);


    bonne continuation.
    Dernière modification par sohocool ; 21/12/2009 à 17h47.
    Pourquoi faire simple quand on peut faire ‘compliqué’ ?

  3. #3
    Membre lvl 50 soutine est sur la route de la réputation...
    Date d'inscription
    November 2009
    Messages
    52
    Pouvoir de réputation
    5

    Citation Envoyé par sohocool Voir le message
    Bonsoir Soutine,

    Tu dois ,aussi changer la moyenne du CCi.

    La,aussi tu dois changer le price_typical avec ton macd.

    Mais ,je ne crois pas ,que tu peux le faire directement.



    MovBuffer[i] = iMA(NULL, 0, CCIPeriod, 0, MODE_SMA, PRICE_TYPICAL, i);


    bonne continuation.
    Bonsoir Sohocool,
    Merci pour ta réponse !
    Effectivement on ne peut pas changer directement le "Typical_Price" ...et même indirectement j'ai c pas évidant.
    J'ai crée une variable ..indic1=iMA(NULL,0,4,0,MODE_EMA,PRICE_CLOSE,i)-iMA(NULL,0,20,0,MODE_EMA,PRICE_CLOSE,i);
    ... puis j'ai remplacé Typical Price par Indic1.... mais cela ne marche pas.
    ( je crains que l'ion ne puisse remplacer Typical Price uniquement par...High ,Low ..tetc
    Vois tu une autre façon de faire ?
    Merci
    Soutine

  4. #4
    Membre lvl 5 sohocool est sur la route de la réputation... Avatar de sohocool
    Date d'inscription
    March 2009
    Messages
    23
    Pouvoir de réputation
    5

    RE,

    je pense qu'il faut créer un macd buffer et utiliser la fonction IMAonArray

    (pour moyenne pour le CCi).

    a+


    for(int i=0; i<limit; i++)
    MacdBuffer[i]=iMA(NULL,0,FastEMA,0,MODE_EMA,PRICE_CLOSE,i)-iMA(NULL,0,SlowEMA,0,MODE_EMA,PRICE_CLOSE,i);
    //---- signal line counted in the 2-nd buffer
    for(i=0; i<limit; i++)
    SignalBuffer[i]=iMAOnArray(MacdBuffer,Bars,SignalSMA,0,MODE_SMA,i );
    Pourquoi faire simple quand on peut faire ‘compliqué’ ?

  5. #5
    Membre lvl 50 soutine est sur la route de la réputation...
    Date d'inscription
    November 2009
    Messages
    52
    Pouvoir de réputation
    5

    Citation Envoyé par sohocool Voir le message
    RE,

    je pense qu'il faut créer un macd buffer et utiliser la fonction IMAonArray

    (pour moyenne pour le CCi).

    a+


    for(int i=0; i<limit; i++)
    MacdBuffer[i]=iMA(NULL,0,FastEMA,0,MODE_EMA,PRICE_CLOSE,i)-iMA(NULL,0,SlowEMA,0,MODE_EMA,PRICE_CLOSE,i);
    //---- signal line counted in the 2-nd buffer
    for(i=0; i<limit; i++)
    SignalBuffer[i]=iMAOnArray(MacdBuffer,Bars,SignalSMA,0,MODE_SMA,i );
    ça marche impeccablement !
    Merci infiniment Sohocool

  6. #6
    Membre Star pipsforever is just really nice pipsforever is just really nice pipsforever is just really nice pipsforever is just really nice Avatar de pipsforever
    Date d'inscription
    November 2008
    Localisation
    Londres
    Messages
    1 340
    Pouvoir de réputation
    42

    il y avait le moyen fort simple aussi, de reprendre le code du MACD; mettre la ligne du MACD, ou l'histogramme en "DRAW_NONE", et changer le ligne de code du "Signal SMA" en = iCCIOnArray(MACD,0,CCIpériod,0);
    Chaque trade doit avoir seul et unique but ...... faire un nouveau plus haut sur votre équity!!!
    Chez moi, la prog c'est une affaire de famille!
    Même notre chien s'y met

  7. #7
    Membre lvl 50 soutine est sur la route de la réputation...
    Date d'inscription
    November 2009
    Messages
    52
    Pouvoir de réputation
    5

    Citation Envoyé par pipsforever Voir le message
    il y avait le moyen fort simple aussi, de reprendre le code du MACD; mettre la ligne du MACD, ou l'histogramme en "DRAW_NONE", et changer le ligne de code du "Signal SMA" en = iCCIOnArray(MACD,0,CCIpériod,0);
    Bonjour Pipsforever,

    Merci pour ton intervention !

    Je ne suis pas sur de bien comprendre...pourrai tu préciser un peu plus ?

    Merci d'avance
    Soutine

  8. #8
    Membre Star pipsforever is just really nice pipsforever is just really nice pipsforever is just really nice pipsforever is just really nice Avatar de pipsforever
    Date d'inscription
    November 2008
    Localisation
    Londres
    Messages
    1 340
    Pouvoir de réputation
    42

    il existe la fonction qui appelle un indicateur, comme pour les MA = IMA
    Pour que les moyennes mobiles soit calculées sur autre chose dans le code il y a la fonction = IMAonarray
    Il est possible de faire ça avec le cci = iccionarray
    les BBands, le standart deviation ect....

    Donc en reprenant le code du MACD dans MT4, il y a deux buffer, le macd et sa moyenne mobile, la "signal sma", je disais qu'en mettant le macd en "none" on le rend donc ivinvisible, puis ensuite on remplace le calcul de la signal sma, par l'appel de la foncion CCIonarray, qui seras donc calculé sur le macd

    ça donne ça :


    //+------------------------------------------------------------------+
    //| Custom MACD.mq4 |
    //| Copyright © 2004, MetaQuotes Software Corp. |
    //| MetaTrader 4, MetaTrader 5, TeamWox / MetaQuotes Software Corp. |
    //+------------------------------------------------------------------+
    #property copyright "Copyright © 2004, MetaQuotes Software Corp."
    #property link "http://www.metaquotes.net/"
    //---- indicator settings
    #property indicator_separate_window
    #property indicator_buffers 2
    #property indicator_color1 Silver
    #property indicator_color2 Red
    #property indicator_width1 2
    //---- indicator parameters
    extern int FastEMA=12;
    extern int SlowEMA=26;
    extern int CCIPeriod=9;
    //---- indicator buffers
    double MacdBuffer[];
    double CCI[];

    //+------------------------------------------------------------------+
    //| Custom indicator initialization function |
    //+------------------------------------------------------------------+
    int init()
    {
    //---- drawing settings
    SetIndexStyle(0,DRAW_NONE);
    SetIndexStyle(1,DRAW_LINE);
    SetIndexDrawBegin(1,CCI);
    IndicatorDigits(Digits+1);
    //---- indicator buffers mapping
    SetIndexBuffer(0,MacdBuffer);
    SetIndexBuffer(1,CCI);
    //---- name for DataWindow and indicator subwindow label
    IndicatorShortName("MACD CCI("+FastEMA+","+SlowEMA+","+CCIPeriod+")");
    SetIndexLabel(0,"MACD");
    SetIndexLabel(1,"CCI");
    //---- initialization done
    return(0);
    }
    //+------------------------------------------------------------------+
    //| Moving Averages Convergence/Divergence |
    //+------------------------------------------------------------------+
    int start()
    {
    int limit;
    int counted_bars=IndicatorCounted();
    //---- last counted bar will be recounted
    if(counted_bars>0) counted_bars--;
    limit=Bars-counted_bars;
    //---- macd counted in the 1-st buffer
    for(int i=0; i<limit; i++)
    MacdBuffer[i]=iMA(NULL,0,FastEMA,0,MODE_EMA,PRICE_CLOSE,i)-iMA(NULL,0,SlowEMA,0,MODE_EMA,PRICE_CLOSE,i);
    //---- signal line counted in the 2-nd buffer
    for(i=0; i<limit; i++)
    CCI[i]=iCCIOnArray(MacdBuffer,Bars,CCIPeriod,i);
    //---- done
    return(0);
    }
    //+------------------------------------------------------------------+

    donc en fait c'est le code du macd, mais changé un ptit peux pour avoir le CCI de ce dernier
    Toujours est il que ta première solution etait bonne aussi,
    Chaque trade doit avoir seul et unique but ...... faire un nouveau plus haut sur votre équity!!!
    Chez moi, la prog c'est une affaire de famille!
    Même notre chien s'y met

  9. #9
    Membre lvl 50 soutine est sur la route de la réputation...
    Date d'inscription
    November 2009
    Messages
    52
    Pouvoir de réputation
    5

    Citation Envoyé par pipsforever Voir le message
    il existe la fonction qui appelle un indicateur, comme pour les MA = IMA
    Pour que les moyennes mobiles soit calculées sur autre chose dans le code il y a la fonction = IMAonarray
    Il est possible de faire ça avec le cci = iccionarray
    les BBands, le standart deviation ect....

    Donc en reprenant le code du MACD dans MT4, il y a deux buffer, le macd et sa moyenne mobile, la "signal sma", je disais qu'en mettant le macd en "none" on le rend donc ivinvisible, puis ensuite on remplace le calcul de la signal sma, par l'appel de la foncion CCIonarray, qui seras donc calculé sur le macd

    ça donne ça :


    //+------------------------------------------------------------------+
    //| Custom MACD.mq4 |
    //| Copyright © 2004, MetaQuotes Software Corp. |
    //| MetaTrader 4, MetaTrader 5, TeamWox / MetaQuotes Software Corp. |
    //+------------------------------------------------------------------+
    #property copyright "Copyright © 2004, MetaQuotes Software Corp."
    #property link "http://www.metaquotes.net/"
    //---- indicator settings
    #property indicator_separate_window
    #property indicator_buffers 2
    #property indicator_color1 Silver
    #property indicator_color2 Red
    #property indicator_width1 2
    //---- indicator parameters
    extern int FastEMA=12;
    extern int SlowEMA=26;
    extern int CCIPeriod=9;
    //---- indicator buffers
    double MacdBuffer[];
    double CCI[];

    //+------------------------------------------------------------------+
    //| Custom indicator initialization function |
    //+------------------------------------------------------------------+
    int init()
    {
    //---- drawing settings
    SetIndexStyle(0,DRAW_NONE);
    SetIndexStyle(1,DRAW_LINE);
    SetIndexDrawBegin(1,CCI);
    IndicatorDigits(Digits+1);
    //---- indicator buffers mapping
    SetIndexBuffer(0,MacdBuffer);
    SetIndexBuffer(1,CCI);
    //---- name for DataWindow and indicator subwindow label
    IndicatorShortName("MACD CCI("+FastEMA+","+SlowEMA+","+CCIPeriod+")");
    SetIndexLabel(0,"MACD");
    SetIndexLabel(1,"CCI");
    //---- initialization done
    return(0);
    }
    //+------------------------------------------------------------------+
    //| Moving Averages Convergence/Divergence |
    //+------------------------------------------------------------------+
    int start()
    {
    int limit;
    int counted_bars=IndicatorCounted();
    //---- last counted bar will be recounted
    if(counted_bars>0) counted_bars--;
    limit=Bars-counted_bars;
    //---- macd counted in the 1-st buffer
    for(int i=0; i<limit; i++)
    MacdBuffer[i]=iMA(NULL,0,FastEMA,0,MODE_EMA,PRICE_CLOSE,i)-iMA(NULL,0,SlowEMA,0,MODE_EMA,PRICE_CLOSE,i);
    //---- signal line counted in the 2-nd buffer
    for(i=0; i<limit; i++)
    CCI[i]=iCCIOnArray(MacdBuffer,Bars,CCIPeriod,i);
    //---- done
    return(0);
    }
    //+------------------------------------------------------------------+

    donc en fait c'est le code du macd, mais changé un ptit peux pour avoir le CCI de ce dernier
    Toujours est il que ta première solution etait bonne aussi,
    Merci Beaucoup Pipsforever !
    Là c trés clair pour moi...
    car je débute dans la programmation en MQL4.
    Soutine

Discussions similaires

  1. Site d'indicateur avec Screen
    Par fungraphic dans le forum Trading Divers
    Réponses: 15
    Dernier message: 07/12/2009, 12h20
  2. Une mine d'indicateur MT4
    Par fungraphic dans le forum Trading Divers
    Réponses: 3
    Dernier message: 06/03/2008, 12h48

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