title: Using OpenCL in MQL5 - in a Custom Indicator code:
body: <p>I am trying to modify an indicator file using the OpenCL library.</p>
  
  <p>But I couldn't understand how I can make that possible. I tried to read and understand the Documentation but could not.  </p>
  
  <p>Here is my code:  </p>
  
  <pre><code>#include &lt;MovingAverages.mqh&gt;
  
  #property indicator_separate_window
  #property indicator_buffers 6
  #property indicator_plots   3
  #property indicator_type1   DRAW_LINE
  #property indicator_color1  Yellow//LightSeaGreen
  #property indicator_style1  STYLE_SOLID
  #property indicator_width1  1
  #property indicator_type2   DRAW_LINE
  #property indicator_color2  Lime//YellowGreen
  #property indicator_style2  STYLE_SOLID//STYLE_DOT
  #property indicator_width2  1
  #property indicator_type3   DRAW_LINE
  #property indicator_color3  Red//Wheat
  #property indicator_style3  STYLE_SOLID//STYLE_DOT
  #property indicator_width3  1
  #property indicator_label1  "ADX"
  #property indicator_label2  "+DI"
  #property indicator_label3  "-DI"
  //--- input parameters
  input int InpPeriodADX=14; // Period
  //---- buffers
  double    ExtADXBuffer[];
  double    ExtPDIBuffer[];
  double    ExtNDIBuffer[];
  double    ExtPDBuffer[];
  double    ExtNDBuffer[];
  double    ExtTmpBuffer[];
  //--- global variables
  int       ExtADXPeriod;
  
  //+------------------------------------------------------------------+
  //| Custom indicator initialization function                         |
  //+------------------------------------------------------------------+
  void OnInit()
    {
  //--- check for input parameters
     if(InpPeriodADX&gt;=100 || InpPeriodADX&lt;=0)
       {
        ExtADXPeriod=14;
        printf("Incorrect value for input variable Period_ADX=%d. Indicator will use value=%d for calculations.",InpPeriodADX,ExtADXPeriod);
       }
     else ExtADXPeriod=InpPeriodADX;
  //---- indicator buffers
     SetIndexBuffer(0,ExtADXBuffer);
     SetIndexBuffer(1,ExtPDIBuffer);
     SetIndexBuffer(2,ExtNDIBuffer);
     SetIndexBuffer(3,ExtPDBuffer,INDICATOR_CALCULATIONS);
     SetIndexBuffer(4,ExtNDBuffer,INDICATOR_CALCULATIONS);
     SetIndexBuffer(5,ExtTmpBuffer,INDICATOR_CALCULATIONS);
  //--- indicator digits
     IndicatorSetInteger(INDICATOR_DIGITS,2);
  //--- set draw begin
     PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,ExtADXPeriod&lt;&lt;1);
     PlotIndexSetInteger(1,PLOT_DRAW_BEGIN,ExtADXPeriod);
     PlotIndexSetInteger(2,PLOT_DRAW_BEGIN,ExtADXPeriod);
  //--- indicator short name
     string short_name="ADX("+string(ExtADXPeriod)+")";
     IndicatorSetString(INDICATOR_SHORTNAME,short_name);
  //--- change 1-st index label
     PlotIndexSetString(0,PLOT_LABEL,short_name);
  //---- end of initialization function
    }
  //+------------------------------------------------------------------+
  //| Custom indicator iteration function                              |
  //+------------------------------------------------------------------+
  int OnCalculate(const int rates_total,
                  const int prev_calculated,
                  const datetime &amp;time[],
                  const double &amp;open[],
                  const double &amp;high[],
                  const double &amp;low[],
                  const double &amp;close[],
                  const long &amp;tick_volume[],
                  const long &amp;volume[],
                  const int &amp;spread[])
    {
  //--- checking for bars count
     if(rates_total&lt;ExtADXPeriod)
        return(0);
  //--- detect start position
     int start;
     if(prev_calculated&gt;1) start=prev_calculated-1;
     else
       {
        start=1;
        ExtPDIBuffer[0]=0.0;
        ExtNDIBuffer[0]=0.0;
        ExtADXBuffer[0]=0.0;
       }
  //--- main cycle
     for(int i=start;i&lt;rates_total &amp;&amp; !IsStopped();i++)
       {
        //--- get some data
        double Hi    =high[i];
        double prevHi=high[i-1];
        double Lo    =low[i];
        double prevLo=low[i-1];
        double prevCl=close[i-1];
        //--- fill main positive and main negative buffers
        double dTmpP=Hi-prevHi;
        double dTmpN=prevLo-Lo;
        if(dTmpP&lt;0.0)   dTmpP=0.0;
        if(dTmpN&lt;0.0)   dTmpN=0.0;
        if(dTmpP&gt;dTmpN) dTmpN=0.0;
        else
          {
           if(dTmpP&lt;dTmpN) dTmpP=0.0;
           else
             {
              dTmpP=0.0;
              dTmpN=0.0;
             }
          }
        //--- define TR
        double tr=MathMax(MathMax(MathAbs(Hi-Lo),MathAbs(Hi-prevCl)),MathAbs(Lo-prevCl));
        //---
        if(tr!=0.0)
          {
           ExtPDBuffer[i]=100.0*dTmpP/tr;
           ExtNDBuffer[i]=100.0*dTmpN/tr;
          }
        else
          {
           ExtPDBuffer[i]=0.0;
           ExtNDBuffer[i]=0.0;
          }
        //--- fill smoothed positive and negative buffers
        ExtPDIBuffer[i]=ExponentialMA(i,ExtADXPeriod,ExtPDIBuffer[i-1],ExtPDBuffer);
        ExtNDIBuffer[i]=ExponentialMA(i,ExtADXPeriod,ExtNDIBuffer[i-1],ExtNDBuffer);
        //--- fill ADXTmp buffer
        double dTmp=ExtPDIBuffer[i]+ExtNDIBuffer[i];
        if(dTmp!=0.0)
           dTmp=100.0*MathAbs((ExtPDIBuffer[i]-ExtNDIBuffer[i])/dTmp);
        else
           dTmp=0.0;
        ExtTmpBuffer[i]=dTmp;
        //--- fill smoothed ADX buffer
        ExtADXBuffer[i]=ExponentialMA(i,ExtADXPeriod,ExtADXBuffer[i-1],ExtTmpBuffer);
  
  
  
       }
  
  //---- OnCalculate done. Return new prev_calculated.
  
     return(rates_total);
    }
  //+------------------------------------------------------------------+
  </code></pre>
  
  <p>Kindly, help me modify the above with OpenCL, so that it will help me understand what I can do with it.</p>