Indicador correlación medias móviles de MetaTrader pasar a PRT.

Viewing 3 posts - 1 through 3 (of 3 total)
  • Author
    Posts
  • #263082 quote
    Trader18
    Participant
    Senior

    Hola, el indicador de correlación de medias móviles a ver si se puede convertir a ProRealCode.

    https://www.x-trader.net/correlaciones-entre-medias-moviles/

    Dirección de X-trader donde se explica el indicador.

    Saludos.

    //+——————————————————————+

    //|                             Mix.mq4 |

    //|                          karceWZROKIEM |

    //|                      http://www.kampno.pl/ |

    //+——————————————————————+

    #property copyright “karceWZROKIEM”

    #property link   “http://www.kampno.pl/”


    #property indicator_separate_window


    #property indicator_buffers 5

    #property indicator_color1 Black

    #property indicator_color2 Red

    #property indicator_color3 Silver

    #property indicator_color4 Blue

    #property indicator_style4 STYLE_DASH

    #property indicator_color5 Blue


    #property indicator_maximum 125

    #property indicator_minimum -125


    //—- input parameters

    extern string ________________01=”List of MAs, eg form fiobo: 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597″;

    extern string listMA=”1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233″;

    extern string ________________02=”MA to check SORT DEGREE”;

    extern int MAcheck=8;


    extern string ________________10=”MA sort type”;

    extern int MAmethod = 1;        // iMA moving average method:

                        //     0 Simple moving average,

                        //     1 Exponential moving average,

                        //     2 Smoothed moving average,

                        //     3 Linear weighted moving average.


    //—- buffers

    double openOrder[];

    double closeOrder[];

    double Trend[];

    double MAsortRel[];

    double sortRel[];



    int MAs[];

    int cntMAs;

    double maVal[];


    //+——————————————————————+

    //| Custom indicator initialization function             |

    //+——————————————————————+

    int init()

     {

      string short_name;

    //—- indicator line

      SetIndexStyle(0,DRAW_ARROW);

      SetIndexArrow(0,159);

      SetIndexBuffer(0,openOrder);

      SetIndexStyle(1,DRAW_ARROW);

      SetIndexArrow(1,159);

      SetIndexBuffer(1,closeOrder);

      SetIndexStyle(2,DRAW_LINE);

      SetIndexBuffer(2,Trend);

      SetIndexStyle(3,DRAW_LINE);

      SetIndexBuffer(3,MAsortRel);

      SetIndexStyle(4,DRAW_LINE);

      SetIndexBuffer(4,sortRel);

    //—- name for DataWindow and indicator subwindow label

      short_name=”madnessMA(“+MAcheck+” -> “+listMA+”)”;

      IndicatorShortName(short_name);

      SetIndexLabel(0,”Open”);

      SetIndexLabel(1,”Close”);

      SetIndexLabel(2,”TrendDegree”);

      SetIndexLabel(3,”MASortDegree”);

      SetIndexLabel(4,”SortDegree”);

    //—-

      SetLevelValue(0,80);

      SetLevelValue(1,-80);

      SetLevelStyle(STYLE_SOLID,1,Silver);

    //—-

      cntMAs = splitINT(MAs, listMA, “,”);

      ArrayResize(maVal, cntMAs+1);

      

      return(0);

     }

    //+——————————————————————+

    double Trend(int MA, int i)

    {  

      //return (Close[i] – iMA(NULL,0,MA,0,MAmethod,PRICE_OPEN,i));

      return (Close[i] – maVal[MA]);

    }

    double sortRel(int MA1, int MA2, int i)

    {  

      //return (iMA(NULL,0,MA2,0,MAmethod,PRICE_OPEN,i) – iMA(NULL,0,MA1,0,MAmethod,PRICE_OPEN,i));

      return (maVal[MA2] – maVal[MA1]);

    }

    ////////////////////////////////////////////////////////////////////

    int start()

    {

      int  counted_bars,i,j,k;

      double tmp;

      double TrendSUM = 0, TrendBUFF = 0;

      double sortRelSUM = 0, sortRelBUFF = 0;

      double MAsortRelSUM = 0, MAsortRelBUFF = 0;


      //if(Bars<=MA) return(0);

      

      counted_bars=IndicatorCounted();     // Number of counted bars

      i=Bars-counted_bars-1;          // Index of the first uncounted

      

      while(i>=0)

      {  

       setMAs(i);

       TrendSUM = 0; TrendBUFF = 0;

       MAsortRelSUM = 0; MAsortRelBUFF = 0;


       for(int ii=0; ii<cntMAs; ii++)

       {

         //tmp = sortRel(MAs[ii], MAcheck, i);

         tmp = sortRel(ii, cntMAs, i);

         if(MAs[ii] > MAcheck) tmp = 1*tmp; else tmp = -1*tmp;

         MAsortRelBUFF += tmp;

         MAsortRelSUM += MathAbs(tmp);


         //tmp = Trend(MAs[ii], i);

         tmp = Trend(ii, i);

         TrendBUFF += tmp;

         TrendSUM += MathAbs(tmp);

         if(ii-1<cntMAs)

         {

          sortRelSUM = 0; sortRelBUFF = 0;

           

          for(int iii=0; iii<cntMAs; iii++)

          if(ii!=iii)

          {

            //tmp = sortRel(MAs[ii], MAs[iii], i);

            tmp = sortRel(ii, iii, i);

            sortRelBUFF += tmp;

            sortRelSUM += MathAbs(tmp);

          }

         }

       }

         //Print(“Trend: B “+TrendBUFF+” S “+TrendSUM);

         //  Print(“sortRel: B “+sortRelBUFF+” S “+sortRelSUM);

       if(TrendSUM>0)Trend[i] = 100 * TrendBUFF / TrendSUM;

       if(sortRelSUM>0)sortRel[i] = 100 * sortRelBUFF/sortRelSUM;

       if(MAsortRelSUM>0)MAsortRel[i] = 100 * MAsortRelBUFF/MAsortRelSUM;

        

       if( sortRel[i] < Trend[i] && sortRel[i] <= MAsortRel[i] && sortRel[i] < 0)

         openOrder[i] = 110;

       else if( sortRel[i] > Trend[i] && sortRel[i] >= MAsortRel[i] && sortRel[i] > 0)

         openOrder[i] = -110;

       else openOrder[i] = EMPTY_VALUE;

        

       if( (Trend[i] < Trend[i+1] && sortRel[i] < Trend[i] ) || openOrder[i] == -110 )

         closeOrder[i] = 110;

       else if( (Trend[i] > Trend[i+1] && sortRel[i] > Trend[i] ) || openOrder[i] == 110 )

         closeOrder[i] = -110;

       else closeOrder[i] = EMPTY_VALUE;

        

       i–;

      }

      return(0);

    }

    //+——————————————————————+


    int splitINT(int& arr[], string str, string sym) 

    {

     ArrayResize(arr, 0);

     string item;

     int pos, size;

      

     int len = StringLen(str);

     for (int i=0; i < len;) {

      pos = StringFind(str, sym, i);

      if (pos == -1) pos = len;

       

      item = StringSubstr(str, i, pos-i);

      item = StringTrimLeft(item);

      item = StringTrimRight(item);

       

      size = ArraySize(arr);

      ArrayResize(arr, size+1);

      arr[size] = StrToInteger(item);

       

      i = pos+1;

     }

     return (ArraySize(arr));

    }


    void setMAs(int i)

    {

      for(int index=0; index<cntMAs; index++)

      maVal[index] = iMA(NULL,0,MAs[index],0,MAmethod,PRICE_CLOSE,i);

      maVal[cntMAs] = iMA(NULL,0,MAcheck,0,MAmethod,PRICE_CLOSE,i);

    }

    #263112 quote
    Iván González
    Moderator
    Legend

    Aquí tienes.

    //--------------------------------------------
    // PRC_madnessMA (by karceWZROKIEM)
    // version = 0
    // 03.08.2026
    // Ivan Gonzalez @ www.prorealcode.com
    // Sharing ProRealTime knowledge
    //--------------------------------------------
    // Conversion del indicador "Mix.mq4" (madnessMA) de MetaTrader 4.
    // Mide el grado de ordenacion de un abanico de medias moviles y lo
    // normaliza en tres lecturas acotadas entre -100 y +100:
    //   TrendDegree   : posicion del precio respecto a TODAS las medias
    //   MASortDegree  : orden del abanico respecto a la media de referencia
    //   SortDegree    : dispersion del abanico respecto a la media mas lenta
    // Los puntos Open/Close replican los buffers de flechas del original.
    //--------------------------------------------
    
    //=== LISTA DE MEDIAS (0 = posicion desactivada) ===
    // Equivale al input "listMA" del original. El orden importa:
    // la ULTIMA posicion activa es la que ancla el calculo de SortDegree.
    per01 = 1
    per02 = 2
    per03 = 3
    per04 = 5
    per05 = 8
    per06 = 13
    per07 = 21
    per08 = 34
    per09 = 55
    per10 = 89
    per11 = 144
    per12 = 233
    
    //=== PARAMETROS ===
    maCheck = 8  // media de referencia para MASortDegree (input MAcheck)
    maMethod = 1 // 0=SMA  1=EMA  2=Smoothed(Wilder)  3=Linear Weighted
    
    //--------------------------------------------
    //=== MAPEO DEL METODO MT4 AL TIPO DE average[] DE PROBUILDER ===
    // MT4: 0 SMA / 1 EMA / 2 SMMA / 3 LWMA
    // PRT: 0 SMA / 1 EMA / 2 WMA  / 3 Wilder
    IF maMethod = 0 THEN
       mType = 0
    ELSIF maMethod = 2 THEN
       mType = 3
    ELSIF maMethod = 3 THEN
       mType = 2
    ELSE
       mType = 1
    ENDIF
    
    //--------------------------------------------
    //=== CARGA DEL ABANICO (compacta solo las posiciones activas) ===
    nMA = 0
    
    IF per01 > 0 THEN
       $maPer[nMA] = per01
       $maVal[nMA] = average[per01, mType](close)
       nMA = nMA + 1
    ENDIF
    IF per02 > 0 THEN
       $maPer[nMA] = per02
       $maVal[nMA] = average[per02, mType](close)
       nMA = nMA + 1
    ENDIF
    IF per03 > 0 THEN
       $maPer[nMA] = per03
       $maVal[nMA] = average[per03, mType](close)
       nMA = nMA + 1
    ENDIF
    IF per04 > 0 THEN
       $maPer[nMA] = per04
       $maVal[nMA] = average[per04, mType](close)
       nMA = nMA + 1
    ENDIF
    IF per05 > 0 THEN
       $maPer[nMA] = per05
       $maVal[nMA] = average[per05, mType](close)
       nMA = nMA + 1
    ENDIF
    IF per06 > 0 THEN
       $maPer[nMA] = per06
       $maVal[nMA] = average[per06, mType](close)
       nMA = nMA + 1
    ENDIF
    IF per07 > 0 THEN
       $maPer[nMA] = per07
       $maVal[nMA] = average[per07, mType](close)
       nMA = nMA + 1
    ENDIF
    IF per08 > 0 THEN
       $maPer[nMA] = per08
       $maVal[nMA] = average[per08, mType](close)
       nMA = nMA + 1
    ENDIF
    IF per09 > 0 THEN
       $maPer[nMA] = per09
       $maVal[nMA] = average[per09, mType](close)
       nMA = nMA + 1
    ENDIF
    IF per10 > 0 THEN
       $maPer[nMA] = per10
       $maVal[nMA] = average[per10, mType](close)
       nMA = nMA + 1
    ENDIF
    IF per11 > 0 THEN
       $maPer[nMA] = per11
       $maVal[nMA] = average[per11, mType](close)
       nMA = nMA + 1
    ENDIF
    IF per12 > 0 THEN
       $maPer[nMA] = per12
       $maVal[nMA] = average[per12, mType](close)
       nMA = nMA + 1
    ENDIF
    
    maCheckVal = average[maCheck, mType](close)
    
    //=== Periodo maximo -> barras de calentamiento ===
    maxPer = maCheck
    FOR kMx = 0 TO nMA - 1 DO
       IF $maPer[kMx] > maxPer THEN
          maxPer = $maPer[kMx]
       ENDIF
    NEXT
    
    //--------------------------------------------
    //=== CALCULO ===
    ONCE trendDeg = undefined
    ONCE maSortDeg = undefined
    ONCE sortDeg = undefined
    
    IF nMA > 1 THEN
       IF barindex > maxPer THEN
          
          trendBuff = 0
          trendSum = 0
          srtBuff = 0
          srtSum = 0
          
          // --- Recorrido del abanico: TrendDegree y MASortDegree ---
          FOR kMa = 0 TO nMA - 1 DO
             
             // Distancia de la media de referencia a cada media del abanico.
             // Signo invertido para las medias mas rapidas o iguales que maCheck,
             // de forma que un abanico bien ordenado suma siempre en el mismo sentido.
             dRef = maCheckVal - $maVal[kMa]
             IF $maPer[kMa] <= maCheck THEN
                dRef = 0 - dRef
             ENDIF
             srtBuff = srtBuff + dRef
             srtSum = srtSum + abs(dRef)
             
             // Distancia del precio a cada media del abanico
             dPrc = close - $maVal[kMa]
             trendBuff = trendBuff + dPrc
             trendSum = trendSum + abs(dPrc)
             
          NEXT
          
          // --- SortDegree: abanico frente a la ULTIMA media de la lista ---
          kLast = nMA - 1
          maLast = $maVal[kLast]
          relBuff = 0
          relSum = 0
          
          FOR jMa = 0 TO nMA - 1 DO
             IF jMa <> kLast THEN
                dRel = $maVal[jMa] - maLast
                relBuff = relBuff + dRel
                relSum = relSum + abs(dRel)
             ENDIF
          NEXT
          
          // --- Normalizacion a -100..+100 ---
          IF trendSum > 0 THEN
             trendDeg = 100 * trendBuff / trendSum
          ENDIF
          IF srtSum > 0 THEN
             maSortDeg = 100 * srtBuff / srtSum
          ENDIF
          IF relSum > 0 THEN
             sortDeg = 100 * relBuff / relSum
          ENDIF
          
       ENDIF
    ENDIF
    
    //--------------------------------------------
    //=== SENALES (buffers openOrder / closeOrder del original) ===
    sigDir = 0
    dotOpen = undefined
    dotClose = undefined
    aOpen = 0
    aClose = 0
    
    IF barindex > maxPer THEN
       
       IF sortDeg < trendDeg AND sortDeg <= maSortDeg AND sortDeg < 0 THEN
          sigDir = 1
       ELSIF sortDeg > trendDeg AND sortDeg >= maSortDeg AND sortDeg > 0 THEN
          sigDir = 0 - 1
       ENDIF
       
       IF sigDir > 0 THEN
          dotOpen = 110
          aOpen = 255
       ELSIF sigDir < 0 THEN
          dotOpen = 0 - 110
          aOpen = 255
       ENDIF
       
       IF (trendDeg < trendDeg[1] AND sortDeg < trendDeg) OR sigDir < 0 THEN
          dotClose = 110
          aClose = 255
       ELSIF (trendDeg > trendDeg[1] AND sortDeg > trendDeg) OR sigDir > 0 THEN
          dotClose = 0 - 110
          aClose = 255
       ENDIF
       
    ENDIF
    
    //--------------------------------------------
    //=== NIVELES DE REFERENCIA (SetLevelValue +-80 del original) ===
    lvlUp = 80
    lvlDn = 0 - 80
    
    //--------------------------------------------
    RETURN trendDeg   AS "TrendDegree"  COLOURED(160, 160, 160)STYLE(line, 2),maSortDeg AS "MASortDegree" COLOURED(0, 0, 255)STYLE(dottedLine2, 1), sortDeg AS "SortDegree" COLOURED(0, 0, 255) STYLE(line, 2),dotOpen AS "Open" COLOURED(0, 0, 0, aOpen) STYLE(point, 4), dotClose   AS "Close" COLOURED(255, 0, 0, aClose) STYLE(point, 3),lvlUp AS "+80" COLOURED(160, 160, 160) STYLE(dottedLine, 1), lvlDn AS "-80" COLOURED(160, 160, 160)STYLE(dottedLine, 1)
    
    
    EURUSDXXXX-1-hora-1.png EURUSDXXXX-1-hora-1.png
    #263121 quote
    Trader18
    Participant
    Senior

    Vaya rapidez. Gracias nuevamente por tu labor.

Viewing 3 posts - 1 through 3 (of 3 total)
  • You must be logged in to reply to this topic.

Indicador correlación medias móviles de MetaTrader pasar a PRT.


ProBuilder: Indicadores y Herramientas

New Reply
Author
author-avatar
Trader18 @trader18 Participant
Summary

This topic contains 2 replies,
has 2 voices, and was last updated by Trader18
5 days, 15 hours ago.

Topic Details
Forum: ProBuilder: Indicadores y Herramientas
Language: Spanish
Started: 08/01/2026
Status: Active
Attachments: 1 files
Logo Logo
Loading...