MA_Color_Mtf

Author: Copyright 2019, MetaQuotes Software Corp.
Price Data Components
1 Views
0 Downloads
0 Favorites
MA_Color_Mtf
ÿþ//+------------------------------------------------------------------+

//|                                                  IndMaMtf_v1.mq5 |

//|                        Copyright 2019, MetaQuotes Software Corp. |

//|                                             https://www.mql5.com |

//+------------------------------------------------------------------+

#property copyright "Copyright 2019, MetaQuotes Software Corp."

#property link      "https://www.mql5.com"

#property version   "1.00"

#property indicator_chart_window

#property indicator_buffers 2

#property indicator_plots 1

#property indicator_type1 DRAW_COLOR_LINE

#property indicator_color1 clrRed,clrGreen

#property indicator_width1 2

//----

enum ENUM_STYLE {line,arrow};

//----

input int               PeriodMa =10;

input ENUM_MA_METHOD    MethodMa =MODE_EMA;

input ENUM_APPLIED_PRICE PriceMa =PRICE_CLOSE;

input int                  Shift =0;

input ENUM_STYLE         StyleMa =line;

input int              PriceSize =0;

input ENUM_TIMEFRAMES TimeFrames =PERIOD_H1;

input color              ColorUp =clrGreen;

input color              ColorDn =clrRed;

input int              LineWidht =2;

input int              ArrowCode =159;

//----

datetime buff_time[];

//----

datetime prev_time;

//----

double ExtMaBuffer[];

double ExtColorBuffer[];

//----

int digits;

int price_size;

int h_ma;

//----

bool is_open_bar;

bool trigger;

bool one_time;

bool is_testing;

bool one_tick;

//----

ENUM_TIMEFRAMES time_frames;

//----

MqlRates rates[];

//----

struct data_struct

  {

   datetime          time;

   double            price;

   double            ma;

  };

data_struct data[];

//+------------------------------------------------------------------+

//| Custom indicator initialization function                         |

//+------------------------------------------------------------------+

int OnInit()

  {

   IndicatorSetString(INDICATOR_SHORTNAME,"MaMtf "+(string)PeriodMa);

   double point=SymbolInfoDouble(_Symbol,SYMBOL_POINT);

   digits=(int)SymbolInfoInteger(_Symbol,SYMBOL_DIGITS);

   price_size=digits;

//----

   if(PriceSize>0)

     {

      if(digits>0)

        {

         IndicatorSetInteger(INDICATOR_DIGITS,_Digits);

         string bid_str=(string)SymbolInfoDouble(_Symbol,SYMBOL_BID);

         int len=StringLen(bid_str);

         int pos=StringFind(bid_str,".",0);

         //----

         if(PriceSize<pos)

           {

            price_size=PriceSize-pos;

            IndicatorSetInteger(INDICATOR_DIGITS,0);

           }

         //----

         if(PriceSize>=pos)

           {

            price_size=PriceSize-pos;

            IndicatorSetInteger(INDICATOR_DIGITS,PriceSize-pos);

           }

        }

      else

        {

         IndicatorSetInteger(INDICATOR_DIGITS,_Digits);

         string bid_str=(string)SymbolInfoDouble(_Symbol,SYMBOL_BID);

         int len=StringLen(bid_str);

         //----

         if(StringFind(bid_str,".",0)>0)

            len-=2;

         //----

         if(PriceSize<len)

            price_size=PriceSize-len;

         //----

         if(PriceSize>len)

           {

            price_size=PriceSize-len;

            IndicatorSetInteger(INDICATOR_DIGITS,price_size);

           }

        }

     }

   else

      IndicatorSetInteger(INDICATOR_DIGITS,_Digits);

//----

   SetIndexBuffer(0,ExtMaBuffer,INDICATOR_DATA);

   PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,0.0);

   PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,PeriodMa);

   PlotIndexSetInteger(0,PLOT_COLOR_INDEXES,2);

   PlotIndexSetInteger(0,PLOT_LINE_COLOR,0,ColorDn);

   PlotIndexSetInteger(0,PLOT_LINE_COLOR,1,ColorUp);

   PlotIndexSetInteger(0,PLOT_LINE_WIDTH,LineWidht);

   PlotIndexSetString(0,PLOT_LABEL,"MaMtf");

   SetIndexBuffer(1,ExtColorBuffer,INDICATOR_COLOR_INDEX);

//----

   if(StyleMa==line)

      PlotIndexSetInteger(0,PLOT_DRAW_TYPE,DRAW_COLOR_LINE);

//----

   if(StyleMa==arrow)

     {

      PlotIndexSetInteger(0,PLOT_DRAW_TYPE,DRAW_COLOR_ARROW);

      PlotIndexSetInteger(0,PLOT_ARROW,ArrowCode);

     }

//----

   ArraySetAsSeries(ExtMaBuffer,true);

   ArraySetAsSeries(ExtColorBuffer,true);

   ArraySetAsSeries(data,true);

   ArraySetAsSeries(rates,true);

   ArrayInitialize(ExtMaBuffer,0.0);

   ArrayInitialize(ExtColorBuffer,0.0);

//----

   time_frames=TimeFrames;

//----

   if(TimeFrames==PERIOD_CURRENT)

      time_frames=_Period;

//----

   point=SymbolInfoDouble(_Symbol,SYMBOL_POINT);

   digits=(int)SymbolInfoInteger(_Symbol,SYMBOL_DIGITS);

   prev_time=0;

   is_open_bar=false;

   trigger=false;

   one_time=true;

   one_tick=true;

   is_testing=false;

//----

   if(MQLInfoInteger(MQL_DEBUG)

      || MQLInfoInteger(MQL_TESTER)

      || MQLInfoInteger(MQL_VISUAL_MODE)

      || MQLInfoInteger(MQL_OPTIMIZATION))

      is_testing=true;

//----

   return(INIT_SUCCEEDED);

  }

//+------------------------------------------------------------------+

//| Custom indicator iteration function                              |

//+------------------------------------------------------------------+

int OnCalculate(const int rates_total,

                const int prev_calculated,

                const datetime &time[],

                const double &open[],

                const double &high[],

                const double &low[],

                const double &close[],

                const long &tick_volume[],

                const long &volume[],

                const int &spread[])

  {

   if(PeriodSeconds()>PeriodSeconds(time_frames))

     {

      int limit=rates_total-prev_calculated;

      //----

      if(prev_calculated==0)

         limit=rates_total-1;

      //----

      for(int i=limit; i>=0; i--)

        {

         ExtMaBuffer[i]=0.0;

         ExtColorBuffer[i]=0.0;

        }

      //----

      return(rates_total);

     }

//----

   ArraySetAsSeries(time,true);

//----

   if(one_tick

      && is_testing)

     {

      one_tick=false;

      return(0);

     }

//----

//----8A?>;=5=85 ?@8 D>@<8@>20=88 =>2>3> 10@0

   while(true)

     {

      ResetLastError();

      //----

      if(CopyTime(_Symbol,time_frames,0,1,buff_time)!=1)

         break;

      //----

      if(_LastError!=0

         && _LastError!=4000)

         break;

      //----

      if(prev_time==buff_time[0])

         break;

      //----

      prev_time=buff_time[0];

      is_open_bar=true;

      break;

     }

//----

   while(is_open_bar)

     {

      bool error=false;

      //----

      switch(MethodMa)

        {

         case MODE_SMA:

           {

            switch(PriceMa)

              {

               case PRICE_CLOSE:

                 {

                  if(one_time)

                    {

                     int bars=Bars(_Symbol,time_frames);

                     //----

                     if(CopyRates(_Symbol,time_frames,0,bars,rates)!=bars)

                       {

                        error=true;

                        break;

                       }

                     //----

                     if(ArrayResize(data,bars)==-1)

                       {

                        error=true;

                        break;

                       }

                     //----

                     for(int i=0; i<bars; i++)

                       {

                        data[i].time=rates[i].time;

                        data[i].price=rates[i].close;

                       }

                     //----

                     for(int i=bars-PeriodMa-1; i>=0; i--)

                       {

                        double sum=0.0;

                        //----

                        for(int j=PeriodMa-1; j>=0; j--)

                           sum+=data[i+j].price;

                        //----

                        data[i].ma=sum/PeriodMa;

                       }

                     //----

                     one_time=false;

                    }

                  else

                    {

                     int bars=Bars(_Symbol,time_frames);

                     //----

                     if(bars>ArraySize(data))

                       {

                        int deff=bars-ArraySize(data);

                        //----

                        if(CopyRates(_Symbol,time_frames,0,deff+1,rates)!=deff+1)

                          {

                           error=true;

                           break;

                          }

                        //----

                        if(ArrayResize(data,bars)==-1)

                          {

                           error=true;

                           break;

                          }

                        //----

                        for(int i=bars-2; i>=0; i--)

                          {

                           data[i+1].time=data[i].time;

                           data[i+1].price=data[i].price;

                           data[i+1].ma=data[i].ma;

                          }

                        //----

                        for(int i=0; i<deff; i++)

                          {

                           data[i].time=rates[i].time;

                           data[i].price=rates[i].close;

                          }

                        //----

                        for(int i=deff; i>=0; i--)

                          {

                           double sum=0.0;

                           //----

                           for(int j=PeriodMa-1; j>=0; j--)

                              sum+=data[i+j].price;

                           //----

                           data[i].ma=sum/PeriodMa;

                          }

                       }

                     else

                       {

                        for(int i=bars-2; i>=0; i--)

                          {

                           data[i+1].time=data[i].time;

                           data[i+1].price=data[i].price;

                           data[i+1].ma=data[i].ma;

                          }

                        //----

                        if(CopyRates(_Symbol,time_frames,0,1,rates)!=1)

                          {

                           error=true;

                           break;

                          }

                        //----

                        data[0].time=rates[0].time;

                        data[0].price=rates[0].close;

                        //----

                        for(int i=1; i>=0; i--)

                          {

                           double sum=0.0;

                           //----

                           for(int j=PeriodMa-1; j>=0; j--)

                              sum+=data[i+j].price;

                           //----

                           data[i].ma=sum/PeriodMa;

                          }

                       }

                    }

                  //----

                  break;

                 } //case PRICE_CLOSE:

               //----

               case PRICE_OPEN:

                 {

                  if(one_time)

                    {

                     int bars=Bars(_Symbol,time_frames);

                     //----

                     if(CopyRates(_Symbol,time_frames,0,bars,rates)!=bars)

                       {

                        error=true;

                        break;

                       }

                     //----

                     if(ArrayResize(data,bars)==-1)

                       {

                        error=true;

                        break;

                       }

                     //----

                     for(int i=0; i<bars; i++)

                       {

                        data[i].time=rates[i].time;

                        data[i].price=rates[i].open;

                       }

                     //----

                     for(int i=bars-PeriodMa-1; i>=0; i--)

                       {

                        double sum=0.0;

                        //----

                        for(int j=PeriodMa-1; j>=0; j--)

                           sum+=data[i+j].price;

                        //----

                        data[i].ma=sum/PeriodMa;

                       }

                     //----

                     one_time=false;

                    }

                  else

                    {

                     int bars=Bars(_Symbol,time_frames);

                     //----

                     if(bars>ArraySize(data))

                       {

                        int deff=bars-ArraySize(data);

                        //----

                        if(CopyRates(_Symbol,time_frames,0,deff+1,rates)!=deff+1)

                          {

                           error=true;

                           break;

                          }

                        //----

                        if(ArrayResize(data,bars)==-1)

                          {

                           error=true;

                           break;

                          }

                        //----

                        for(int i=bars-2; i>=0; i--)

                          {

                           data[i+1].time=data[i].time;

                           data[i+1].price=data[i].price;

                          }

                        //----

                        for(int i=0; i<deff; i++)

                          {

                           data[i].time=rates[i].time;

                           data[i].price=rates[i].open;

                          }

                        //----

                        for(int i=deff; i>=0; i--)

                          {

                           double sum=0.0;

                           //----

                           for(int j=PeriodMa-1; j>=0; j--)

                              sum+=data[i+j].price;

                           //----

                           data[i].ma=sum/PeriodMa;

                          }

                       }

                     else

                       {

                        for(int i=bars-2; i>=0; i--)

                          {

                           data[i+1].time=data[i].time;

                           data[i+1].price=data[i].price;

                          }

                        //----

                        if(CopyRates(_Symbol,time_frames,0,1,rates)!=1)

                          {

                           error=true;

                           break;

                          }

                        //----

                        data[0].time=rates[0].time;

                        data[0].price=rates[0].open;

                        //----

                        for(int i=1; i>=0; i--)

                          {

                           double sum=0.0;

                           //----

                           for(int j=PeriodMa-1; j>=0; j--)

                              sum+=data[i+j].price;

                           //----

                           data[i].ma=sum/PeriodMa;

                          }

                       }

                    }

                  //----

                  break;

                 } //case PRICE_OPEN:

               //----

               case PRICE_HIGH:

                 {

                  if(one_time)

                    {

                     int bars=Bars(_Symbol,time_frames);

                     //----

                     if(CopyRates(_Symbol,time_frames,0,bars,rates)!=bars)

                       {

                        error=true;

                        break;

                       }

                     //----

                     if(ArrayResize(data,bars)==-1)

                       {

                        error=true;

                        break;

                       }

                     //----

                     for(int i=0; i<bars; i++)

                       {

                        data[i].time=rates[i].time;

                        data[i].price=rates[i].high;

                       }

                     //----

                     for(int i=bars-PeriodMa-1; i>=0; i--)

                       {

                        double sum=0.0;

                        //----

                        for(int j=PeriodMa-1; j>=0; j--)

                           sum+=data[i+j].price;

                        //----

                        data[i].ma=sum/PeriodMa;

                       }

                     //----

                     one_time=false;

                    }

                  else

                    {

                     int bars=Bars(_Symbol,time_frames);

                     //----

                     if(bars>ArraySize(data))

                       {

                        int deff=bars-ArraySize(data);

                        //----

                        if(CopyRates(_Symbol,time_frames,0,deff+1,rates)!=deff+1)

                          {

                           error=true;

                           break;

                          }

                        //----

                        if(ArrayResize(data,bars)==-1)

                          {

                           error=true;

                           break;

                          }

                        //----

                        for(int i=bars-2; i>=0; i--)

                          {

                           data[i+1].time=data[i].time;

                           data[i+1].price=data[i].price;

                          }

                        //----

                        for(int i=0; i<deff; i++)

                          {

                           data[i].time=rates[i].time;

                           data[i].price=rates[i].high;

                          }

                        //----

                        for(int i=deff; i>=0; i--)

                          {

                           double sum=0.0;

                           //----

                           for(int j=PeriodMa-1; j>=0; j--)

                              sum+=data[i+j].price;

                           //----

                           data[i].ma=sum/PeriodMa;

                          }

                       }

                     else

                       {

                        for(int i=bars-2; i>=0; i--)

                          {

                           data[i+1].time=data[i].time;

                           data[i+1].price=data[i].price;

                          }

                        //----

                        if(CopyRates(_Symbol,time_frames,0,1,rates)!=1)

                          {

                           error=true;

                           break;

                          }

                        //----

                        data[0].time=rates[0].time;

                        data[0].price=rates[0].high;

                        //----

                        for(int i=1; i>=0; i--)

                          {

                           double sum=0.0;

                           //----

                           for(int j=PeriodMa-1; j>=0; j--)

                              sum+=data[i+j].price;

                           //----

                           data[i].ma=sum/PeriodMa;

                          }

                       }

                    }

                  //----

                  break;

                 } //case PRICE_HIGH:

               //----

               case PRICE_LOW:

                 {

                  if(one_time)

                    {

                     int bars=Bars(_Symbol,time_frames);

                     //----

                     if(CopyRates(_Symbol,time_frames,0,bars,rates)!=bars)

                       {

                        error=true;

                        break;

                       }

                     //----

                     if(ArrayResize(data,bars)==-1)

                       {

                        error=true;

                        break;

                       }

                     //----

                     for(int i=0; i<bars; i++)

                       {

                        data[i].time=rates[i].time;

                        data[i].price=rates[i].low;

                       }

                     //----

                     for(int i=bars-PeriodMa-1; i>=0; i--)

                       {

                        double sum=0.0;

                        //----

                        for(int j=PeriodMa-1; j>=0; j--)

                           sum+=data[i+j].price;

                        //----

                        data[i].ma=sum/PeriodMa;

                       }

                     //----

                     one_time=false;

                    }

                  else

                    {

                     int bars=Bars(_Symbol,time_frames);

                     //----

                     if(bars>ArraySize(data))

                       {

                        int deff=bars-ArraySize(data);

                        //----

                        if(CopyRates(_Symbol,time_frames,0,deff+1,rates)!=deff+1)

                          {

                           error=true;

                           break;

                          }

                        //----

                        if(ArrayResize(data,bars)==-1)

                          {

                           error=true;

                           break;

                          }

                        //----

                        for(int i=bars-2; i>=0; i--)

                          {

                           data[i+1].time=data[i].time;

                           data[i+1].price=data[i].price;

                          }

                        //----

                        for(int i=0; i<deff; i++)

                          {

                           data[i].time=rates[i].time;

                           data[i].price=rates[i].low;

                          }

                        //----

                        for(int i=deff; i>=0; i--)

                          {

                           double sum=0.0;

                           //----

                           for(int j=PeriodMa-1; j>=0; j--)

                              sum+=data[i+j].price;

                           //----

                           data[i].ma=sum/PeriodMa;

                          }

                       }

                     else

                       {

                        for(int i=bars-2; i>=0; i--)

                          {

                           data[i+1].time=data[i].time;

                           data[i+1].price=data[i].price;

                          }

                        //----

                        if(CopyRates(_Symbol,time_frames,0,1,rates)!=1)

                          {

                           error=true;

                           break;

                          }

                        //----

                        data[0].time=rates[0].time;

                        data[0].price=rates[0].low;

                        //----

                        for(int i=1; i>=0; i--)

                          {

                           double sum=0.0;

                           //----

                           for(int j=PeriodMa-1; j>=0; j--)

                              sum+=data[i+j].price;

                           //----

                           data[i].ma=sum/PeriodMa;

                          }

                       }

                    }

                  //----

                  break;

                 } //case PRICE_LOW:

               //----

               case PRICE_MEDIAN:

                 {

                  if(one_time)

                    {

                     int bars=Bars(_Symbol,time_frames);

                     //----

                     if(CopyRates(_Symbol,time_frames,0,bars,rates)!=bars)

                       {

                        error=true;

                        break;

                       }

                     //----

                     if(ArrayResize(data,bars)==-1)

                       {

                        error=true;

                        break;

                       }

                     //----

                     for(int i=0; i<bars; i++)

                       {

                        data[i].time=rates[i].time;

                        data[i].price=(rates[i].high+rates[i].low)/2.0;

                       }

                     //----

                     for(int i=bars-PeriodMa-1; i>=0; i--)

                       {

                        double sum=0.0;

                        //----

                        for(int j=PeriodMa-1; j>=0; j--)

                           sum+=data[i+j].price;

                        //----

                        data[i].ma=sum/PeriodMa;

                       }

                     //----

                     one_time=false;

                    }

                  else

                    {

                     int bars=Bars(_Symbol,time_frames);

                     //----

                     if(bars>ArraySize(data))

                       {

                        int deff=bars-ArraySize(data);

                        //----

                        if(CopyRates(_Symbol,time_frames,0,deff+1,rates)!=deff+1)

                          {

                           error=true;

                           break;

                          }

                        //----

                        if(ArrayResize(data,bars)==-1)

                          {

                           error=true;

                           break;

                          }

                        //----

                        for(int i=bars-2; i>=0; i--)

                          {

                           data[i+1].time=data[i].time;

                           data[i+1].price=data[i].price;

                          }

                        //----

                        for(int i=0; i<deff; i++)

                          {

                           data[i].time=rates[i].time;

                           data[i].price=(rates[i].high+rates[i].low)/2.0;

                          }

                        //----

                        for(int i=deff; i>=0; i--)

                          {

                           double sum=0.0;

                           //----

                           for(int j=PeriodMa-1; j>=0; j--)

                              sum+=data[i+j].price;

                           //----

                           data[i].ma=sum/PeriodMa;

                          }

                       }

                     else

                       {

                        for(int i=bars-2; i>=0; i--)

                          {

                           data[i+1].time=data[i].time;

                           data[i+1].price=data[i].price;

                          }

                        //----

                        if(CopyRates(_Symbol,time_frames,0,1,rates)!=1)

                          {

                           error=true;

                           break;

                          }

                        //----

                        data[0].time=rates[0].time;

                        data[0].price=(rates[0].high+rates[0].low)/2.0;

                        //----

                        for(int i=1; i>=0; i--)

                          {

                           double sum=0.0;

                           //----

                           for(int j=PeriodMa-1; j>=0; j--)

                              sum+=data[i+j].price;

                           //----

                           data[i].ma=sum/PeriodMa;

                          }

                       }

                    }

                  //----

                  break;

                 } //case PRICE_MEDIAN:

               //----

               case PRICE_TYPICAL:

                 {

                  if(one_time)

                    {

                     int bars=Bars(_Symbol,time_frames);

                     //----

                     if(CopyRates(_Symbol,time_frames,0,bars,rates)!=bars)

                       {

                        error=true;

                        break;

                       }

                     //----

                     if(ArrayResize(data,bars)==-1)

                       {

                        error=true;

                        break;

                       }

                     //----

                     for(int i=0; i<bars; i++)

                       {

                        data[i].time=rates[i].time;

                        data[i].price=(rates[i].high+rates[i].low+rates[i].close)/3.0;

                       }

                     //----

                     for(int i=bars-PeriodMa-1; i>=0; i--)

                       {

                        double sum=0.0;

                        //----

                        for(int j=PeriodMa-1; j>=0; j--)

                           sum+=data[i+j].price;

                        //----

                        data[i].ma=sum/PeriodMa;

                       }

                     //----

                     one_time=false;

                    }

                  else

                    {

                     int bars=Bars(_Symbol,time_frames);

                     //----

                     if(bars>ArraySize(data))

                       {

                        int deff=bars-ArraySize(data);

                        //----

                        if(CopyRates(_Symbol,time_frames,0,deff+1,rates)!=deff+1)

                          {

                           error=true;

                           break;

                          }

                        //----

                        if(ArrayResize(data,bars)==-1)

                          {

                           error=true;

                           break;

                          }

                        //----

                        for(int i=bars-2; i>=0; i--)

                          {

                           data[i+1].time=data[i].time;

                           data[i+1].price=data[i].price;

                          }

                        //----

                        for(int i=0; i<deff; i++)

                          {

                           data[i].time=rates[i].time;

                           data[i].price=(rates[i].high+rates[i].low+rates[i].close)/3.0;

                          }

                        //----

                        for(int i=deff; i>=0; i--)

                          {

                           double sum=0.0;

                           //----

                           for(int j=PeriodMa-1; j>=0; j--)

                              sum+=data[i+j].price;

                           //----

                           data[i].ma=sum/PeriodMa;

                          }

                       }

                     else

                       {

                        for(int i=bars-2; i>=0; i--)

                          {

                           data[i+1].time=data[i].time;

                           data[i+1].price=data[i].price;

                          }

                        //----

                        if(CopyRates(_Symbol,time_frames,0,1,rates)!=1)

                          {

                           error=true;

                           break;

                          }

                        //----

                        data[0].time=rates[0].time;

                        data[0].price=(rates[0].high+rates[0].low+rates[0].close)/3.0;

                        //----

                        for(int i=1; i>=0; i--)

                          {

                           double sum=0.0;

                           //----

                           for(int j=PeriodMa-1; j>=0; j--)

                              sum+=data[i+j].price;

                           //----

                           data[i].ma=sum/PeriodMa;

                          }

                       }

                    }

                  //----

                  break;

                 } //case PRICE_TYPICAL:

               //----

               case PRICE_WEIGHTED:

                 {

                  if(one_time)

                    {

                     int bars=Bars(_Symbol,time_frames);

                     //----

                     if(CopyRates(_Symbol,time_frames,0,bars,rates)!=bars)

                       {

                        error=true;

                        break;

                       }

                     //----

                     if(ArrayResize(data,bars)==-1)

                       {

                        error=true;

                        break;

                       }

                     //----

                     for(int i=0; i<bars; i++)

                       {

                        data[i].time=rates[i].time;

                        data[i].price=(rates[i].high+rates[i].low+rates[i].close+rates[i].close)/4.0;

                       }

                     //----

                     for(int i=bars-PeriodMa-1; i>=0; i--)

                       {

                        double sum=0.0;

                        //----

                        for(int j=PeriodMa-1; j>=0; j--)

                           sum+=data[i+j].price;

                        //----

                        data[i].ma=sum/PeriodMa;

                       }

                     //----

                     one_time=false;

                    }

                  else

                    {

                     int bars=Bars(_Symbol,time_frames);

                     //----

                     if(bars>ArraySize(data))

                       {

                        int deff=bars-ArraySize(data);

                        //----

                        if(CopyRates(_Symbol,time_frames,0,deff+1,rates)!=deff+1)

                          {

                           error=true;

                           break;

                          }

                        //----

                        if(ArrayResize(data,bars)==-1)

                          {

                           error=true;

                           break;

                          }

                        //----

                        for(int i=bars-2; i>=0; i--)

                          {

                           data[i+1].time=data[i].time;

                           data[i+1].price=data[i].price;

                          }

                        //----

                        for(int i=0; i<deff; i++)

                          {

                           data[i].time=rates[i].time;

                           data[i].price=(rates[i].high+rates[i].low+rates[i].close+rates[i].close)/4.0;

                          }

                        //----

                        for(int i=deff; i>=0; i--)

                          {

                           double sum=0.0;

                           //----

                           for(int j=PeriodMa-1; j>=0; j--)

                              sum+=data[i+j].price;

                           //----

                           data[i].ma=sum/PeriodMa;

                          }

                       }

                     else

                       {

                        for(int i=bars-2; i>=0; i--)

                          {

                           data[i+1].time=data[i].time;

                           data[i+1].price=data[i].price;

                          }

                        //----

                        if(CopyRates(_Symbol,time_frames,0,1,rates)!=1)

                          {

                           error=true;

                           break;

                          }

                        //----

                        data[0].time=rates[0].time;

                        data[0].price=(rates[0].high+rates[0].low+rates[0].close+rates[0].close)/4.0;

                        //----

                        for(int i=1; i>=0; i--)

                          {

                           double sum=0.0;

                           //----

                           for(int j=PeriodMa-1; j>=0; j--)

                              sum+=data[i+j].price;

                           //----

                           data[i].ma=sum/PeriodMa;

                          }

                       }

                    }

                 } //case PRICE_WEIGHTED:

              } //switch(PriceMa)

            //----

            break;

           } //case MODE_SMA:

         //----

         case MODE_EMA:

           {

            switch(PriceMa)

              {

               case PRICE_CLOSE:

                 {

                  if(one_time)

                    {

                     int bars=Bars(_Symbol,time_frames);

                     //----

                     if(CopyRates(_Symbol,time_frames,0,bars,rates)!=bars)

                       {

                        error=true;

                        break;

                       }

                     //----

                     if(ArrayResize(data,bars)==-1)

                       {

                        error=true;

                        break;

                       }

                     //----

                     for(int i=0; i<bars; i++)

                       {

                        data[i].time=rates[i].time;

                        data[i].price=rates[i].close;

                       }

                     //----

                     data[bars-PeriodMa].ma=data[bars-PeriodMa].price;

                     double pr=2.0/(PeriodMa+1.0);

                     //----

                     for(int i=bars-PeriodMa-1; i>=0; i--)

                        data[i].ma=data[i].price*pr+data[i+1].ma*(1-pr);

                     //----

                     one_time=false;

                    }

                  else

                    {

                     int bars=Bars(_Symbol,time_frames);

                     //----

                     if(bars>ArraySize(data))

                       {

                        int deff=bars-ArraySize(data);

                        //----

                        if(CopyRates(_Symbol,time_frames,0,deff+1,rates)!=deff+1)

                          {

                           error=true;

                           break;

                          }

                        //----

                        if(ArrayResize(data,bars)==-1)

                          {

                           error=true;

                           break;

                          }

                        //----

                        for(int i=bars-2; i>=0; i--)

                          {

                           data[i+1].time=data[i].time;

                           data[i+1].price=data[i].price;

                           data[i+1].ma=data[i].ma;

                          }

                        //----

                        for(int i=0; i<deff; i++)

                          {

                           data[i].time=rates[i].time;

                           data[i].price=rates[i].close;

                          }

                        //----

                        double pr=2.0/(PeriodMa+1.0);

                        //----

                        for(int i=deff; i>=0; i--)

                           data[i].ma=data[i].price*pr+data[i+1].ma*(1-pr);

                       }

                     else

                       {

                        for(int i=bars-2; i>=0; i--)

                          {

                           data[i+1].time=data[i].time;

                           data[i+1].price=data[i].price;

                           data[i+1].ma=data[i].ma;

                          }

                        //----

                        if(CopyRates(_Symbol,time_frames,0,1,rates)!=1)

                          {

                           error=true;

                           break;

                          }

                        //----

                        data[0].time=rates[0].time;

                        data[0].price=rates[0].close;

                        double pr=2.0/(PeriodMa+1.0);

                        //----

                        for(int i=1; i>=0; i--)

                           data[i].ma=data[i].price*pr+data[i+1].ma*(1-pr);

                       }

                    }

                  //----

                  break;

                 }

               //----

               case PRICE_HIGH:

                 {

                  if(one_time)

                    {

                     int bars=Bars(_Symbol,time_frames);

                     //----

                     if(CopyRates(_Symbol,time_frames,0,bars,rates)!=bars)

                       {

                        error=true;

                        break;

                       }

                     //----

                     if(ArrayResize(data,bars)==-1)

                       {

                        error=true;

                        break;

                       }

                     //----

                     for(int i=0; i<bars; i++)

                       {

                        data[i].time=rates[i].time;

                        data[i].price=rates[i].high;

                       }

                     //----

                     data[bars-PeriodMa].ma=data[bars-PeriodMa].price;

                     double pr=2.0/(PeriodMa+1.0);

                     //----

                     for(int i=bars-PeriodMa-1; i>=0; i--)

                        data[i].ma=data[i].price*pr+data[i+1].ma*(1-pr);

                     //----

                     one_time=false;

                    }

                  else

                    {

                     int bars=Bars(_Symbol,time_frames);

                     //----

                     if(bars>ArraySize(data))

                       {

                        int deff=bars-ArraySize(data);

                        //----

                        if(CopyRates(_Symbol,time_frames,0,deff+1,rates)!=deff+1)

                          {

                           error=true;

                           break;

                          }

                        //----

                        if(ArrayResize(data,bars)==-1)

                          {

                           error=true;

                           break;

                          }

                        //----

                        for(int i=bars-2; i>=0; i--)

                          {

                           data[i+1].time=data[i].time;

                           data[i+1].price=data[i].price;

                           data[i+1].ma=data[i].ma;

                          }

                        //----

                        for(int i=0; i<deff; i++)

                          {

                           data[i].time=rates[i].time;

                           data[i].price=rates[i].high;

                          }

                        //----

                        double pr=2.0/(PeriodMa+1.0);

                        //----

                        for(int i=deff; i>=0; i--)

                           data[i].ma=data[i].price*pr+data[i+1].ma*(1-pr);

                       }

                     else

                       {

                        for(int i=bars-2; i>=0; i--)

                          {

                           data[i+1].time=data[i].time;

                           data[i+1].price=data[i].price;

                           data[i+1].ma=data[i].ma;

                          }

                        //----

                        if(CopyRates(_Symbol,time_frames,0,1,rates)!=1)

                          {

                           error=true;

                           break;

                          }

                        //----

                        data[0].time=rates[0].time;

                        data[0].price=rates[0].high;

                        double pr=2.0/(PeriodMa+1.0);

                        //----

                        for(int i=1; i>=0; i--)

                           data[i].ma=data[i].price*pr+data[i+1].ma*(1-pr);

                       }

                    }

                  //----

                  break;

                 }

               //----

               case PRICE_LOW:

                 {

                  if(one_time)

                    {

                     int bars=Bars(_Symbol,time_frames);

                     //----

                     if(CopyRates(_Symbol,time_frames,0,bars,rates)!=bars)

                       {

                        error=true;

                        break;

                       }

                     //----

                     if(ArrayResize(data,bars)==-1)

                       {

                        error=true;

                        break;

                       }

                     //----

                     for(int i=0; i<bars; i++)

                       {

                        data[i].time=rates[i].time;

                        data[i].price=rates[i].low;

                       }

                     //----

                     data[bars-PeriodMa].ma=data[bars-PeriodMa].price;

                     double pr=2.0/(PeriodMa+1.0);

                     //----

                     for(int i=bars-PeriodMa-1; i>=0; i--)

                        data[i].ma=data[i].price*pr+data[i+1].ma*(1-pr);

                     //----

                     one_time=false;

                    }

                  else

                    {

                     int bars=Bars(_Symbol,time_frames);

                     //----

                     if(bars>ArraySize(data))

                       {

                        int deff=bars-ArraySize(data);

                        //----

                        if(CopyRates(_Symbol,time_frames,0,deff+1,rates)!=deff+1)

                          {

                           error=true;

                           break;

                          }

                        //----

                        if(ArrayResize(data,bars)==-1)

                          {

                           error=true;

                           break;

                          }

                        //----

                        for(int i=bars-2; i>=0; i--)

                          {

                           data[i+1].time=data[i].time;

                           data[i+1].price=data[i].price;

                           data[i+1].ma=data[i].ma;

                          }

                        //----

                        for(int i=0; i<deff; i++)

                          {

                           data[i].time=rates[i].time;

                           data[i].price=rates[i].low;

                          }

                        //----

                        double pr=2.0/(PeriodMa+1.0);

                        //----

                        for(int i=deff; i>=0; i--)

                           data[i].ma=data[i].price*pr+data[i+1].ma*(1-pr);

                       }

                     else

                       {

                        for(int i=bars-2; i>=0; i--)

                          {

                           data[i+1].time=data[i].time;

                           data[i+1].price=data[i].price;

                           data[i+1].ma=data[i].ma;

                          }

                        //----

                        if(CopyRates(_Symbol,time_frames,0,1,rates)!=1)

                          {

                           error=true;

                           break;

                          }

                        //----

                        data[0].time=rates[0].time;

                        data[0].price=rates[0].low;

                        double pr=2.0/(PeriodMa+1.0);

                        //----

                        for(int i=1; i>=0; i--)

                           data[i].ma=data[i].price*pr+data[i+1].ma*(1-pr);

                       }

                    }

                  //----

                  break;

                 }

               //----

               case PRICE_MEDIAN:

                 {

                  if(one_time)

                    {

                     int bars=Bars(_Symbol,time_frames);

                     //----

                     if(CopyRates(_Symbol,time_frames,0,bars,rates)!=bars)

                       {

                        error=true;

                        break;

                       }

                     //----

                     if(ArrayResize(data,bars)==-1)

                       {

                        error=true;

                        break;

                       }

                     //----

                     for(int i=0; i<bars; i++)

                       {

                        data[i].time=rates[i].time;

                        data[i].price=(rates[i].high+rates[i].low)/2.0;

                       }

                     //----

                     data[bars-PeriodMa].ma=data[bars-PeriodMa].price;

                     double pr=2.0/(PeriodMa+1.0);

                     //----

                     for(int i=bars-PeriodMa-1; i>=0; i--)

                        data[i].ma=data[i].price*pr+data[i+1].ma*(1-pr);

                     //----

                     one_time=false;

                    }

                  else

                    {

                     int bars=Bars(_Symbol,time_frames);

                     //----

                     if(bars>ArraySize(data))

                       {

                        int deff=bars-ArraySize(data);

                        //----

                        if(CopyRates(_Symbol,time_frames,0,deff+1,rates)!=deff+1)

                          {

                           error=true;

                           break;

                          }

                        //----

                        if(ArrayResize(data,bars)==-1)

                          {

                           error=true;

                           break;

                          }

                        //----

                        for(int i=bars-2; i>=0; i--)

                          {

                           data[i+1].time=data[i].time;

                           data[i+1].price=data[i].price;

                           data[i+1].ma=data[i].ma;

                          }

                        //----

                        for(int i=0; i<deff; i++)

                          {

                           data[i].time=rates[i].time;

                           data[i].price=(rates[i].high+rates[i].low)/2.0;

                          }

                        //----

                        double pr=2.0/(PeriodMa+1.0);

                        //----

                        for(int i=deff; i>=0; i--)

                           data[i].ma=data[i].price*pr+data[i+1].ma*(1-pr);

                       }

                     else

                       {

                        for(int i=bars-2; i>=0; i--)

                          {

                           data[i+1].time=data[i].time;

                           data[i+1].price=data[i].price;

                           data[i+1].ma=data[i].ma;

                          }

                        //----

                        if(CopyRates(_Symbol,time_frames,0,1,rates)!=1)

                          {

                           error=true;

                           break;

                          }

                        //----

                        data[0].time=rates[0].time;

                        data[0].price=(rates[0].high+rates[0].low)/2.0;

                        double pr=2.0/(PeriodMa+1.0);

                        //----

                        for(int i=1; i>=0; i--)

                           data[i].ma=data[i].price*pr+data[i+1].ma*(1-pr);

                       }

                    }

                  //----

                  break;

                 }

               //----

               case PRICE_TYPICAL:

                 {

                  if(one_time)

                    {

                     int bars=Bars(_Symbol,time_frames);

                     //----

                     if(CopyRates(_Symbol,time_frames,0,bars,rates)!=bars)

                       {

                        error=true;

                        break;

                       }

                     //----

                     if(ArrayResize(data,bars)==-1)

                       {

                        error=true;

                        break;

                       }

                     //----

                     for(int i=0; i<bars; i++)

                       {

                        data[i].time=rates[i].time;

                        data[i].price=(rates[i].high+rates[i].low+rates[i].close)/3.0;

                       }

                     //----

                     data[bars-PeriodMa].ma=data[bars-PeriodMa].price;

                     double pr=2.0/(PeriodMa+1.0);

                     //----

                     for(int i=bars-PeriodMa-1; i>=0; i--)

                        data[i].ma=data[i].price*pr+data[i+1].ma*(1-pr);

                     //----

                     one_time=false;

                    }

                  else

                    {

                     int bars=Bars(_Symbol,time_frames);

                     //----

                     if(bars>ArraySize(data))

                       {

                        int deff=bars-ArraySize(data);

                        //----

                        if(CopyRates(_Symbol,time_frames,0,deff+1,rates)!=deff+1)

                          {

                           error=true;

                           break;

                          }

                        //----

                        if(ArrayResize(data,bars)==-1)

                          {

                           error=true;

                           break;

                          }

                        //----

                        for(int i=bars-2; i>=0; i--)

                          {

                           data[i+1].time=data[i].time;

                           data[i+1].price=data[i].price;

                           data[i+1].ma=data[i].ma;

                          }

                        //----

                        for(int i=0; i<deff; i++)

                          {

                           data[i].time=rates[i].time;

                           data[i].price=(rates[i].high+rates[i].low+rates[i].close)/3.0;

                          }

                        //----

                        double pr=2.0/(PeriodMa+1.0);

                        //----

                        for(int i=deff; i>=0; i--)

                           data[i].ma=data[i].price*pr+data[i+1].ma*(1-pr);

                       }

                     else

                       {

                        for(int i=bars-2; i>=0; i--)

                          {

                           data[i+1].time=data[i].time;

                           data[i+1].price=data[i].price;

                           data[i+1].ma=data[i].ma;

                          }

                        //----

                        if(CopyRates(_Symbol,time_frames,0,1,rates)!=1)

                          {

                           error=true;

                           break;

                          }

                        //----

                        data[0].time=rates[0].time;

                        data[0].price=(rates[0].high+rates[0].low+rates[0].close)/3.0;

                        double pr=2.0/(PeriodMa+1.0);

                        //----

                        for(int i=1; i>=0; i--)

                           data[i].ma=data[i].price*pr+data[i+1].ma*(1-pr);

                       }

                    }

                  //----

                  break;

                 }

               //----

               case PRICE_WEIGHTED:

                 {

                  if(one_time)

                    {

                     int bars=Bars(_Symbol,time_frames);

                     //----

                     if(CopyRates(_Symbol,time_frames,0,bars,rates)!=bars)

                       {

                        error=true;

                        break;

                       }

                     //----

                     if(ArrayResize(data,bars)==-1)

                       {

                        error=true;

                        break;

                       }

                     //----

                     for(int i=0; i<bars; i++)

                       {

                        data[i].time=rates[i].time;

                        data[i].price=(rates[i].high+rates[i].low+rates[i].close+rates[i].close)/4.0;

                       }

                     //----

                     data[bars-PeriodMa].ma=data[bars-PeriodMa].price;

                     double pr=2.0/(PeriodMa+1.0);

                     //----

                     for(int i=bars-PeriodMa-1; i>=0; i--)

                        data[i].ma=data[i].price*pr+data[i+1].ma*(1-pr);

                     //----

                     one_time=false;

                    }

                  else

                    {

                     int bars=Bars(_Symbol,time_frames);

                     //----

                     if(bars>ArraySize(data))

                       {

                        int deff=bars-ArraySize(data);

                        //----

                        if(CopyRates(_Symbol,time_frames,0,deff+1,rates)!=deff+1)

                          {

                           error=true;

                           break;

                          }

                        //----

                        if(ArrayResize(data,bars)==-1)

                          {

                           error=true;

                           break;

                          }

                        //----

                        for(int i=bars-2; i>=0; i--)

                          {

                           data[i+1].time=data[i].time;

                           data[i+1].price=data[i].price;

                           data[i+1].ma=data[i].ma;

                          }

                        //----

                        for(int i=0; i<deff; i++)

                          {

                           data[i].time=rates[i].time;

                           data[i].price=(rates[i].high+rates[i].low+rates[i].close+rates[i].close)/4.0;

                          }

                        //----

                        double pr=2.0/(PeriodMa+1.0);

                        //----

                        for(int i=deff; i>=0; i--)

                           data[i].ma=data[i].price*pr+data[i+1].ma*(1-pr);

                       }

                     else

                       {

                        for(int i=bars-2; i>=0; i--)

                          {

                           data[i+1].time=data[i].time;

                           data[i+1].price=data[i].price;

                           data[i+1].ma=data[i].ma;

                          }

                        //----

                        if(CopyRates(_Symbol,time_frames,0,1,rates)!=1)

                          {

                           error=true;

                           break;

                          }

                        //----

                        data[0].time=rates[0].time;

                        data[0].price=(rates[0].high+rates[0].low+rates[0].close+rates[0].close)/4.0;

                        double pr=2.0/(PeriodMa+1.0);

                        //----

                        for(int i=1; i>=0; i--)

                           data[i].ma=data[i].price*pr+data[i+1].ma*(1-pr);

                       }

                    }

                 } //case PRICE_WEIGHTED:

              } //switch(PriceMa)

            //----

            break;

           } //case MODE_EMA:

         //----

         case MODE_SMMA:

           {

            switch(PriceMa)

              {

               case PRICE_CLOSE:

                 {

                  if(one_time)

                    {

                     int bars=Bars(_Symbol,time_frames);

                     //----

                     if(CopyRates(_Symbol,time_frames,0,bars,rates)!=bars)

                       {

                        error=true;

                        break;

                       }

                     //----

                     if(ArrayResize(data,bars)==-1)

                       {

                        error=true;

                        break;

                       }

                     //----

                     for(int i=0; i<bars; i++)

                       {

                        data[i].time=rates[i].time;

                        data[i].price=rates[i].close;

                       }

                     //----

                     for(int i=bars-PeriodMa-1; i>=0; i--)

                       {

                        if(i==bars-PeriodMa-1)

                          {

                           double sum=0.0;

                           //----

                           for(int j=PeriodMa-1; j>=0; j--)

                              sum+=data[i+j+1].price;

                           //----

                           data[i].ma=sum/PeriodMa;

                           continue;

                          }

                        //----

                        data[i].ma=(data[i+1].ma*(PeriodMa-1)+data[i].price)/PeriodMa;

                       }

                     //----

                     one_time=false;

                    }

                  else

                    {

                     int bars=Bars(_Symbol,time_frames);

                     //----

                     if(bars>ArraySize(data))

                       {

                        int deff=bars-ArraySize(data);

                        //----

                        if(CopyRates(_Symbol,time_frames,0,deff+1,rates)!=deff+1)

                          {

                           error=true;

                           break;

                          }

                        //----

                        if(ArrayResize(data,bars)==-1)

                          {

                           error=true;

                           break;

                          }

                        //----

                        for(int i=bars-2; i>=0; i--)

                          {

                           data[i+1].time=data[i].time;

                           data[i+1].price=data[i].price;

                           data[i+1].ma=data[i].ma;

                          }

                        //----

                        for(int i=0; i<deff; i++)

                          {

                           data[i].time=rates[i].time;

                           data[i].price=rates[i].close;

                          }

                        //----

                        for(int i=deff; i>=0; i--)

                           for(int j=i; j>=0; j--)

                              data[j].ma=(data[j+1].ma*(PeriodMa-1)+data[j].price)/PeriodMa;

                       }

                     else

                       {

                        for(int i=bars-2; i>=0; i--)

                          {

                           data[i+1].time=data[i].time;

                           data[i+1].price=data[i].price;

                           data[i+1].ma=data[i].ma;

                          }

                        //----

                        if(CopyRates(_Symbol,time_frames,0,1,rates)!=1)

                          {

                           error=true;

                           break;

                          }

                        //----

                        data[0].time=rates[0].time;

                        data[0].price=rates[0].close;

                        //----

                        for(int i=1; i>=0; i--)

                           for(int j=i; j>=0; j--)

                              data[j].ma=(data[j+1].ma*(PeriodMa-1)+data[j].price)/PeriodMa;

                       }

                    }

                  //----

                  break;

                 } //case PRICE_CLOSE:

               //----

               case PRICE_OPEN:

                 {

                  if(one_time)

                    {

                     int bars=Bars(_Symbol,time_frames);

                     //----

                     if(CopyRates(_Symbol,time_frames,0,bars,rates)!=bars)

                       {

                        error=true;

                        break;

                       }

                     //----

                     if(ArrayResize(data,bars)==-1)

                       {

                        error=true;

                        break;

                       }

                     //----

                     for(int i=0; i<bars; i++)

                       {

                        data[i].time=rates[i].time;

                        data[i].price=rates[i].open;

                       }

                     //----

                     for(int i=bars-PeriodMa-1; i>=0; i--)

                       {

                        if(i==bars-PeriodMa-1)

                          {

                           double sum=0.0;

                           //----

                           for(int j=PeriodMa-1; j>=0; j--)

                              sum+=data[i+j+1].price;

                           //----

                           data[i].ma=sum/PeriodMa;

                           continue;

                          }

                        //----

                        data[i].ma=(data[i+1].ma*(PeriodMa-1)+data[i].price)/PeriodMa;

                       }

                     //----

                     one_time=false;

                    }

                  else

                    {

                     int bars=Bars(_Symbol,time_frames);

                     //----

                     if(bars>ArraySize(data))

                       {

                        int deff=bars-ArraySize(data);

                        //----

                        if(CopyRates(_Symbol,time_frames,0,deff+1,rates)!=deff+1)

                          {

                           error=true;

                           break;

                          }

                        //----

                        if(ArrayResize(data,bars)==-1)

                          {

                           error=true;

                           break;

                          }

                        //----

                        for(int i=bars-2; i>=0; i--)

                          {

                           data[i+1].time=data[i].time;

                           data[i+1].price=data[i].price;

                           data[i+1].ma=data[i].ma;

                          }

                        //----

                        for(int i=0; i<deff; i++)

                          {

                           data[i].time=rates[i].time;

                           data[i].price=rates[i].open;

                          }

                        //----

                        for(int i=deff; i>=0; i--)

                           for(int j=i; j>=0; j--)

                              data[j].ma=(data[j+1].ma*(PeriodMa-1)+data[j].price)/PeriodMa;

                       }

                     else

                       {

                        for(int i=bars-2; i>=0; i--)

                          {

                           data[i+1].time=data[i].time;

                           data[i+1].price=data[i].price;

                           data[i+1].ma=data[i].ma;

                          }

                        //----

                        if(CopyRates(_Symbol,time_frames,0,1,rates)!=1)

                          {

                           error=true;

                           break;

                          }

                        //----

                        data[0].time=rates[0].time;

                        data[0].price=rates[0].open;

                        //----

                        for(int i=1; i>=0; i--)

                           for(int j=i; j>=0; j--)

                              data[j].ma=(data[j+1].ma*(PeriodMa-1)+data[j].price)/PeriodMa;

                       }

                    }

                  //----

                  break;

                 } //case PRICE_OPEN:

               //----

               case PRICE_HIGH:

                 {

                  if(one_time)

                    {

                     int bars=Bars(_Symbol,time_frames);

                     //----

                     if(CopyRates(_Symbol,time_frames,0,bars,rates)!=bars)

                       {

                        error=true;

                        break;

                       }

                     //----

                     if(ArrayResize(data,bars)==-1)

                       {

                        error=true;

                        break;

                       }

                     //----

                     for(int i=0; i<bars; i++)

                       {

                        data[i].time=rates[i].time;

                        data[i].price=rates[i].high;

                       }

                     //----

                     for(int i=bars-PeriodMa-1; i>=0; i--)

                       {

                        if(i==bars-PeriodMa-1)

                          {

                           double sum=0.0;

                           //----

                           for(int j=PeriodMa-1; j>=0; j--)

                              sum+=data[i+j+1].price;

                           //----

                           data[i].ma=sum/PeriodMa;

                           continue;

                          }

                        //----

                        data[i].ma=(data[i+1].ma*(PeriodMa-1)+data[i].price)/PeriodMa;

                       }

                     //----

                     one_time=false;

                    }

                  else

                    {

                     int bars=Bars(_Symbol,time_frames);

                     //----

                     if(bars>ArraySize(data))

                       {

                        int deff=bars-ArraySize(data);

                        //----

                        if(CopyRates(_Symbol,time_frames,0,deff+1,rates)!=deff+1)

                          {

                           error=true;

                           break;

                          }

                        //----

                        if(ArrayResize(data,bars)==-1)

                          {

                           error=true;

                           break;

                          }

                        //----

                        for(int i=bars-2; i>=0; i--)

                          {

                           data[i+1].time=data[i].time;

                           data[i+1].price=data[i].price;

                           data[i+1].ma=data[i].ma;

                          }

                        //----

                        for(int i=0; i<deff; i++)

                          {

                           data[i].time=rates[i].time;

                           data[i].price=rates[i].high;

                          }

                        //----

                        for(int i=deff; i>=0; i--)

                           for(int j=i; j>=0; j--)

                              data[j].ma=(data[j+1].ma*(PeriodMa-1)+data[j].price)/PeriodMa;

                       }

                     else

                       {

                        for(int i=bars-2; i>=0; i--)

                          {

                           data[i+1].time=data[i].time;

                           data[i+1].price=data[i].price;

                           data[i+1].ma=data[i].ma;

                          }

                        //----

                        if(CopyRates(_Symbol,time_frames,0,1,rates)!=1)

                          {

                           error=true;

                           break;

                          }

                        //----

                        data[0].time=rates[0].time;

                        data[0].price=rates[0].high;

                        //----

                        for(int i=1; i>=0; i--)

                           for(int j=i; j>=0; j--)

                              data[j].ma=(data[j+1].ma*(PeriodMa-1)+data[j].price)/PeriodMa;

                       }

                    }

                  //----

                  break;

                 } //case PRICE_HIGH:

               //----

               case PRICE_LOW:

                 {

                  if(one_time)

                    {

                     int bars=Bars(_Symbol,time_frames);

                     //----

                     if(CopyRates(_Symbol,time_frames,0,bars,rates)!=bars)

                       {

                        error=true;

                        break;

                       }

                     //----

                     if(ArrayResize(data,bars)==-1)

                       {

                        error=true;

                        break;

                       }

                     //----

                     for(int i=0; i<bars; i++)

                       {

                        data[i].time=rates[i].time;

                        data[i].price=rates[i].low;

                       }

                     //----

                     for(int i=bars-PeriodMa-1; i>=0; i--)

                       {

                        if(i==bars-PeriodMa-1)

                          {

                           double sum=0.0;

                           //----

                           for(int j=PeriodMa-1; j>=0; j--)

                              sum+=data[i+j+1].price;

                           //----

                           data[i].ma=sum/PeriodMa;

                           continue;

                          }

                        //----

                        data[i].ma=(data[i+1].ma*(PeriodMa-1)+data[i].price)/PeriodMa;

                       }

                     //----

                     one_time=false;

                    }

                  else

                    {

                     int bars=Bars(_Symbol,time_frames);

                     //----

                     if(bars>ArraySize(data))

                       {

                        int deff=bars-ArraySize(data);

                        //----

                        if(CopyRates(_Symbol,time_frames,0,deff+1,rates)!=deff+1)

                          {

                           error=true;

                           break;

                          }

                        //----

                        if(ArrayResize(data,bars)==-1)

                          {

                           error=true;

                           break;

                          }

                        //----

                        for(int i=bars-2; i>=0; i--)

                          {

                           data[i+1].time=data[i].time;

                           data[i+1].price=data[i].price;

                           data[i+1].ma=data[i].ma;

                          }

                        //----

                        for(int i=0; i<deff; i++)

                          {

                           data[i].time=rates[i].time;

                           data[i].price=rates[i].low;

                          }

                        //----

                        for(int i=deff; i>=0; i--)

                           for(int j=i; j>=0; j--)

                              data[j].ma=(data[j+1].ma*(PeriodMa-1)+data[j].price)/PeriodMa;

                       }

                     else

                       {

                        for(int i=bars-2; i>=0; i--)

                          {

                           data[i+1].time=data[i].time;

                           data[i+1].price=data[i].price;

                           data[i+1].ma=data[i].ma;

                          }

                        //----

                        if(CopyRates(_Symbol,time_frames,0,1,rates)!=1)

                          {

                           error=true;

                           break;

                          }

                        //----

                        data[0].time=rates[0].time;

                        data[0].price=rates[0].low;

                        //----

                        for(int i=1; i>=0; i--)

                           for(int j=i; j>=0; j--)

                              data[j].ma=(data[j+1].ma*(PeriodMa-1)+data[j].price)/PeriodMa;

                       }

                    }

                  //----

                  break;

                 } //case PRICE_LOW:

               //----

               case PRICE_MEDIAN:

                 {

                  if(one_time)

                    {

                     int bars=Bars(_Symbol,time_frames);

                     //----

                     if(CopyRates(_Symbol,time_frames,0,bars,rates)!=bars)

                       {

                        error=true;

                        break;

                       }

                     //----

                     if(ArrayResize(data,bars)==-1)

                       {

                        error=true;

                        break;

                       }

                     //----

                     for(int i=0; i<bars; i++)

                       {

                        data[i].time=rates[i].time;

                        data[i].price=(rates[i].high+rates[i].low)/2.0;

                       }

                     //----

                     for(int i=bars-PeriodMa-1; i>=0; i--)

                       {

                        if(i==bars-PeriodMa-1)

                          {

                           double sum=0.0;

                           //----

                           for(int j=PeriodMa-1; j>=0; j--)

                              sum+=data[i+j+1].price;

                           //----

                           data[i].ma=sum/PeriodMa;

                           continue;

                          }

                        //----

                        data[i].ma=(data[i+1].ma*(PeriodMa-1)+data[i].price)/PeriodMa;

                       }

                     //----

                     one_time=false;

                    }

                  else

                    {

                     int bars=Bars(_Symbol,time_frames);

                     //----

                     if(bars>ArraySize(data))

                       {

                        int deff=bars-ArraySize(data);

                        //----

                        if(CopyRates(_Symbol,time_frames,0,deff+1,rates)!=deff+1)

                          {

                           error=true;

                           break;

                          }

                        //----

                        if(ArrayResize(data,bars)==-1)

                          {

                           error=true;

                           break;

                          }

                        //----

                        for(int i=bars-2; i>=0; i--)

                          {

                           data[i+1].time=data[i].time;

                           data[i+1].price=data[i].price;

                           data[i+1].ma=data[i].ma;

                          }

                        //----

                        for(int i=0; i<deff; i++)

                          {

                           data[i].time=rates[i].time;

                           data[i].price=(rates[i].high+rates[i].low)/2.0;

                          }

                        //----

                        for(int i=deff; i>=0; i--)

                           for(int j=i; j>=0; j--)

                              data[j].ma=(data[j+1].ma*(PeriodMa-1)+data[j].price)/PeriodMa;

                       }

                     else

                       {

                        for(int i=bars-2; i>=0; i--)

                          {

                           data[i+1].time=data[i].time;

                           data[i+1].price=data[i].price;

                           data[i+1].ma=data[i].ma;

                          }

                        //----

                        if(CopyRates(_Symbol,time_frames,0,1,rates)!=1)

                          {

                           error=true;

                           break;

                          }

                        //----

                        data[0].time=rates[0].time;

                        data[0].price=(rates[0].high+rates[0].low)/2.0;

                        //----

                        for(int i=1; i>=0; i--)

                           for(int j=i; j>=0; j--)

                              data[j].ma=(data[j+1].ma*(PeriodMa-1)+data[j].price)/PeriodMa;

                       }

                    }

                  //----

                  break;

                 } //case PRICE_MEDIAN:

               //----

               case PRICE_TYPICAL:

                 {

                  if(one_time)

                    {

                     int bars=Bars(_Symbol,time_frames);

                     //----

                     if(CopyRates(_Symbol,time_frames,0,bars,rates)!=bars)

                       {

                        error=true;

                        break;

                       }

                     //----

                     if(ArrayResize(data,bars)==-1)

                       {

                        error=true;

                        break;

                       }

                     //----

                     for(int i=0; i<bars; i++)

                       {

                        data[i].time=rates[i].time;

                        data[i].price=(rates[i].high+rates[i].low+rates[i].close)/3.0;

                       }

                     //----

                     for(int i=bars-PeriodMa-1; i>=0; i--)

                       {

                        if(i==bars-PeriodMa-1)

                          {

                           double sum=0.0;

                           //----

                           for(int j=PeriodMa-1; j>=0; j--)

                              sum+=data[i+j+1].price;

                           //----

                           data[i].ma=sum/PeriodMa;

                           continue;

                          }

                        //----

                        data[i].ma=(data[i+1].ma*(PeriodMa-1)+data[i].price)/PeriodMa;

                       }

                     //----

                     one_time=false;

                    }

                  else

                    {

                     int bars=Bars(_Symbol,time_frames);

                     //----

                     if(bars>ArraySize(data))

                       {

                        int deff=bars-ArraySize(data);

                        //----

                        if(CopyRates(_Symbol,time_frames,0,deff+1,rates)!=deff+1)

                          {

                           error=true;

                           break;

                          }

                        //----

                        if(ArrayResize(data,bars)==-1)

                          {

                           error=true;

                           break;

                          }

                        //----

                        for(int i=bars-2; i>=0; i--)

                          {

                           data[i+1].time=data[i].time;

                           data[i+1].price=data[i].price;

                           data[i+1].ma=data[i].ma;

                          }

                        //----

                        for(int i=0; i<deff; i++)

                          {

                           data[i].time=rates[i].time;

                           data[i].price=(rates[i].high+rates[i].low+rates[i].close)/3.0;

                          }

                        //----

                        for(int i=deff; i>=0; i--)

                           for(int j=i; j>=0; j--)

                              data[j].ma=(data[j+1].ma*(PeriodMa-1)+data[j].price)/PeriodMa;

                       }

                     else

                       {

                        for(int i=bars-2; i>=0; i--)

                          {

                           data[i+1].time=data[i].time;

                           data[i+1].price=data[i].price;

                           data[i+1].ma=data[i].ma;

                          }

                        //----

                        if(CopyRates(_Symbol,time_frames,0,1,rates)!=1)

                          {

                           error=true;

                           break;

                          }

                        //----

                        data[0].time=rates[0].time;

                        data[0].price=(rates[0].high+rates[0].low+rates[0].close)/3.0;

                        //----

                        for(int i=1; i>=0; i--)

                           for(int j=i; j>=0; j--)

                              data[j].ma=(data[j+1].ma*(PeriodMa-1)+data[j].price)/PeriodMa;

                       }

                    }

                  //----

                  break;

                 } //case PRICE_TYPICAL:

               //----

               case PRICE_WEIGHTED:

                 {

                  if(one_time)

                    {

                     int bars=Bars(_Symbol,time_frames);

                     //----

                     if(CopyRates(_Symbol,time_frames,0,bars,rates)!=bars)

                       {

                        error=true;

                        break;

                       }

                     //----

                     if(ArrayResize(data,bars)==-1)

                       {

                        error=true;

                        break;

                       }

                     //----

                     for(int i=0; i<bars; i++)

                       {

                        data[i].time=rates[i].time;

                        data[i].price=(rates[i].high+rates[i].low+rates[i].close+rates[i].close)/4.0;

                       }

                     //----

                     for(int i=bars-PeriodMa-1; i>=0; i--)

                       {

                        if(i==bars-PeriodMa-1)

                          {

                           double sum=0.0;

                           //----

                           for(int j=PeriodMa-1; j>=0; j--)

                              sum+=data[i+j+1].price;

                           //----

                           data[i].ma=sum/PeriodMa;

                           continue;

                          }

                        //----

                        data[i].ma=(data[i+1].ma*(PeriodMa-1)+data[i].price)/PeriodMa;

                       }

                     //----

                     one_time=false;

                    }

                  else

                    {

                     int bars=Bars(_Symbol,time_frames);

                     //----

                     if(bars>ArraySize(data))

                       {

                        int deff=bars-ArraySize(data);

                        //----

                        if(CopyRates(_Symbol,time_frames,0,deff+1,rates)!=deff+1)

                          {

                           error=true;

                           break;

                          }

                        //----

                        if(ArrayResize(data,bars)==-1)

                          {

                           error=true;

                           break;

                          }

                        //----

                        for(int i=bars-2; i>=0; i--)

                          {

                           data[i+1].time=data[i].time;

                           data[i+1].price=data[i].price;

                           data[i+1].ma=data[i].ma;

                          }

                        //----

                        for(int i=0; i<deff; i++)

                          {

                           data[i].time=rates[i].time;

                           data[i].price=(rates[i].high+rates[i].low+rates[i].close+rates[i].close)/4.0;

                          }

                        //----

                        for(int i=deff; i>=0; i--)

                           for(int j=i; j>=0; j--)

                              data[j].ma=(data[j+1].ma*(PeriodMa-1)+data[j].price)/PeriodMa;

                       }

                     else

                       {

                        for(int i=bars-2; i>=0; i--)

                          {

                           data[i+1].time=data[i].time;

                           data[i+1].price=data[i].price;

                           data[i+1].ma=data[i].ma;

                          }

                        //----

                        if(CopyRates(_Symbol,time_frames,0,1,rates)!=1)

                          {

                           error=true;

                           break;

                          }

                        //----

                        data[0].time=rates[0].time;

                        data[0].price=(rates[0].high+rates[0].low+rates[0].close+rates[0].close)/4.0;

                        //----

                        for(int i=1; i>=0; i--)

                           for(int j=i; j>=0; j--)

                              data[j].ma=(data[j+1].ma*(PeriodMa-1)+data[j].price)/PeriodMa;

                       }

                    }

                  //----

                  break;

                 } //case PRICE_WEIGHTED:

              } //switch(PriceMa)

            //----

            break;

           } //case MODE_SMMA:

         //----

         case MODE_LWMA:

           {

            switch(PriceMa)

              {

               case PRICE_CLOSE:

                 {

                  if(one_time)

                    {

                     int bars=Bars(_Symbol,time_frames);

                     //----

                     if(CopyRates(_Symbol,time_frames,0,bars,rates)!=bars)

                       {

                        error=true;

                        break;

                       }

                     //----

                     if(ArrayResize(data,bars)==-1)

                       {

                        error=true;

                        break;

                       }

                     //----

                     for(int i=0; i<bars; i++)

                       {

                        data[i].time=rates[i].time;

                        data[i].price=rates[i].close;

                       }

                     //----

                     for(int i=bars-PeriodMa-1; i>=0; i--)

                       {

                        double sum=0.0;

                        int wsum=0;

                        //----

                        for(int j=PeriodMa; j>0; j--)

                          {

                           wsum+=j;

                           sum+=data[i+(j-1)].price*(PeriodMa-j+1);

                          }

                        //----

                        data[i].ma=sum/wsum;

                       }

                     //----

                     one_time=false;

                    }

                  else

                    {

                     int bars=Bars(_Symbol,time_frames);

                     //----

                     if(bars>ArraySize(data))

                       {

                        int deff=bars-ArraySize(data);

                        //----

                        if(CopyRates(_Symbol,time_frames,0,deff+1,rates)!=deff+1)

                          {

                           error=true;

                           break;

                          }

                        //----

                        if(ArrayResize(data,bars)==-1)

                          {

                           error=true;

                           break;

                          }

                        //----

                        for(int i=bars-2; i>=0; i--)

                          {

                           data[i+1].time=data[i].time;

                           data[i+1].price=data[i].price;

                           data[i+1].ma=data[i].ma;

                          }

                        //----

                        for(int i=0; i<deff; i++)

                          {

                           data[i].time=rates[i].time;

                           data[i].price=rates[i].close;

                          }

                        //----

                        for(int i=deff; i>=0; i--)

                          {

                           double sum=0.0;

                           int wsum=0;

                           //----

                           for(int j=PeriodMa; j>0; j--)

                             {

                              wsum+=j;

                              sum+=data[i+(j-1)].price*(PeriodMa-j+1);

                             }

                           //----

                           data[i].ma=sum/wsum;

                          }

                       }

                     else

                       {

                        for(int i=bars-2; i>=0; i--)

                          {

                           data[i+1].time=data[i].time;

                           data[i+1].price=data[i].price;

                           data[i+1].ma=data[i].ma;

                          }

                        //----

                        if(CopyRates(_Symbol,time_frames,0,1,rates)!=1)

                          {

                           error=true;

                           break;

                          }

                        //----

                        data[0].time=rates[0].time;

                        data[0].price=rates[0].close;

                        //----

                        for(int i=1; i>=0; i--)

                          {

                           double sum=0.0;

                           int wsum=0;

                           //----

                           for(int j=PeriodMa; j>0; j--)

                             {

                              wsum+=j;

                              sum+=data[i+(j-1)].price*(PeriodMa-j+1);

                             }

                           //----

                           data[i].ma=sum/wsum;

                          }

                       }

                    }

                  //----

                  break;

                 } //case PRICE_CLOSE:

               //----

               case PRICE_OPEN:

                 {

                  if(one_time)

                    {

                     int bars=Bars(_Symbol,time_frames);

                     //----

                     if(CopyRates(_Symbol,time_frames,0,bars,rates)!=bars)

                       {

                        error=true;

                        break;

                       }

                     //----

                     if(ArrayResize(data,bars)==-1)

                       {

                        error=true;

                        break;

                       }

                     //----

                     for(int i=0; i<bars; i++)

                       {

                        data[i].time=rates[i].time;

                        data[i].price=rates[i].open;

                       }

                     //----

                     for(int i=bars-PeriodMa-1; i>=0; i--)

                       {

                        double sum=0.0;

                        int wsum=0;

                        //----

                        for(int j=PeriodMa; j>0; j--)

                          {

                           wsum+=j;

                           sum+=data[i+(j-1)].price*(PeriodMa-j+1);

                          }

                        //----

                        data[i].ma=sum/wsum;

                       }

                     //----

                     one_time=false;

                    }

                  else

                    {

                     int bars=Bars(_Symbol,time_frames);

                     //----

                     if(bars>ArraySize(data))

                       {

                        int deff=bars-ArraySize(data);

                        //----

                        if(CopyRates(_Symbol,time_frames,0,deff+1,rates)!=deff+1)

                          {

                           error=true;

                           break;

                          }

                        //----

                        if(ArrayResize(data,bars)==-1)

                          {

                           error=true;

                           break;

                          }

                        //----

                        for(int i=bars-2; i>=0; i--)

                          {

                           data[i+1].time=data[i].time;

                           data[i+1].price=data[i].price;

                           data[i+1].ma=data[i].ma;

                          }

                        //----

                        for(int i=0; i<deff; i++)

                          {

                           data[i].time=rates[i].time;

                           data[i].price=rates[i].open;

                          }

                        //----

                        for(int i=deff; i>=0; i--)

                          {

                           double sum=0.0;

                           int wsum=0;

                           //----

                           for(int j=PeriodMa; j>0; j--)

                             {

                              wsum+=j;

                              sum+=data[i+(j-1)].price*(PeriodMa-j+1);

                             }

                           //----

                           data[i].ma=sum/wsum;

                          }

                       }

                     else

                       {

                        for(int i=bars-2; i>=0; i--)

                          {

                           data[i+1].time=data[i].time;

                           data[i+1].price=data[i].price;

                           data[i+1].ma=data[i].ma;

                          }

                        //----

                        if(CopyRates(_Symbol,time_frames,0,1,rates)!=1)

                          {

                           error=true;

                           break;

                          }

                        //----

                        data[0].time=rates[0].time;

                        data[0].price=rates[0].open;

                        //----

                        for(int i=1; i>=0; i--)

                          {

                           double sum=0.0;

                           int wsum=0;

                           //----

                           for(int j=PeriodMa; j>0; j--)

                             {

                              wsum+=j;

                              sum+=data[i+(j-1)].price*(PeriodMa-j+1);

                             }

                           //----

                           data[i].ma=sum/wsum;

                          }

                       }

                    }

                  //----

                  break;

                 } //case PRICE_OPEN:

               //----

               case PRICE_HIGH:

                 {

                  if(one_time)

                    {

                     int bars=Bars(_Symbol,time_frames);

                     //----

                     if(CopyRates(_Symbol,time_frames,0,bars,rates)!=bars)

                       {

                        error=true;

                        break;

                       }

                     //----

                     if(ArrayResize(data,bars)==-1)

                       {

                        error=true;

                        break;

                       }

                     //----

                     for(int i=0; i<bars; i++)

                       {

                        data[i].time=rates[i].time;

                        data[i].price=rates[i].high;

                       }

                     //----

                     for(int i=bars-PeriodMa-1; i>=0; i--)

                       {

                        double sum=0.0;

                        int wsum=0;

                        //----

                        for(int j=PeriodMa; j>0; j--)

                          {

                           wsum+=j;

                           sum+=data[i+(j-1)].price*(PeriodMa-j+1);

                          }

                        //----

                        data[i].ma=sum/wsum;

                       }

                     //----

                     one_time=false;

                    }

                  else

                    {

                     int bars=Bars(_Symbol,time_frames);

                     //----

                     if(bars>ArraySize(data))

                       {

                        int deff=bars-ArraySize(data);

                        //----

                        if(CopyRates(_Symbol,time_frames,0,deff+1,rates)!=deff+1)

                          {

                           error=true;

                           break;

                          }

                        //----

                        if(ArrayResize(data,bars)==-1)

                          {

                           error=true;

                           break;

                          }

                        //----

                        for(int i=bars-2; i>=0; i--)

                          {

                           data[i+1].time=data[i].time;

                           data[i+1].price=data[i].price;

                           data[i+1].ma=data[i].ma;

                          }

                        //----

                        for(int i=0; i<deff; i++)

                          {

                           data[i].time=rates[i].time;

                           data[i].price=rates[i].high;

                          }

                        //----

                        for(int i=deff; i>=0; i--)

                          {

                           double sum=0.0;

                           int wsum=0;

                           //----

                           for(int j=PeriodMa; j>0; j--)

                             {

                              wsum+=j;

                              sum+=data[i+(j-1)].price*(PeriodMa-j+1);

                             }

                           //----

                           data[i].ma=sum/wsum;

                          }

                       }

                     else

                       {

                        for(int i=bars-2; i>=0; i--)

                          {

                           data[i+1].time=data[i].time;

                           data[i+1].price=data[i].price;

                           data[i+1].ma=data[i].ma;

                          }

                        //----

                        if(CopyRates(_Symbol,time_frames,0,1,rates)!=1)

                          {

                           error=true;

                           break;

                          }

                        //----

                        data[0].time=rates[0].time;

                        data[0].price=rates[0].high;

                        //----

                        for(int i=1; i>=0; i--)

                          {

                           double sum=0.0;

                           int wsum=0;

                           //----

                           for(int j=PeriodMa; j>0; j--)

                             {

                              wsum+=j;

                              sum+=data[i+(j-1)].price*(PeriodMa-j+1);

                             }

                           //----

                           data[i].ma=sum/wsum;

                          }

                       }

                    }

                  //----

                  break;

                 } //case PRICE_HIGH:

               //----

               case PRICE_LOW:

                 {

                  if(one_time)

                    {

                     int bars=Bars(_Symbol,time_frames);

                     //----

                     if(CopyRates(_Symbol,time_frames,0,bars,rates)!=bars)

                       {

                        error=true;

                        break;

                       }

                     //----

                     if(ArrayResize(data,bars)==-1)

                       {

                        error=true;

                        break;

                       }

                     //----

                     for(int i=0; i<bars; i++)

                       {

                        data[i].time=rates[i].time;

                        data[i].price=rates[i].low;

                       }

                     //----

                     for(int i=bars-PeriodMa-1; i>=0; i--)

                       {

                        double sum=0.0;

                        int wsum=0;

                        //----

                        for(int j=PeriodMa; j>0; j--)

                          {

                           wsum+=j;

                           sum+=data[i+(j-1)].price*(PeriodMa-j+1);

                          }

                        //----

                        data[i].ma=sum/wsum;

                       }

                     //----

                     one_time=false;

                    }

                  else

                    {

                     int bars=Bars(_Symbol,time_frames);

                     //----

                     if(bars>ArraySize(data))

                       {

                        int deff=bars-ArraySize(data);

                        //----

                        if(CopyRates(_Symbol,time_frames,0,deff+1,rates)!=deff+1)

                          {

                           error=true;

                           break;

                          }

                        //----

                        if(ArrayResize(data,bars)==-1)

                          {

                           error=true;

                           break;

                          }

                        //----

                        for(int i=bars-2; i>=0; i--)

                          {

                           data[i+1].time=data[i].time;

                           data[i+1].price=data[i].price;

                           data[i+1].ma=data[i].ma;

                          }

                        //----

                        for(int i=0; i<deff; i++)

                          {

                           data[i].time=rates[i].time;

                           data[i].price=rates[i].low;

                          }

                        //----

                        for(int i=deff; i>=0; i--)

                          {

                           double sum=0.0;

                           int wsum=0;

                           //----

                           for(int j=PeriodMa; j>0; j--)

                             {

                              wsum+=j;

                              sum+=data[i+(j-1)].price*(PeriodMa-j+1);

                             }

                           //----

                           data[i].ma=sum/wsum;

                          }

                       }

                     else

                       {

                        for(int i=bars-2; i>=0; i--)

                          {

                           data[i+1].time=data[i].time;

                           data[i+1].price=data[i].price;

                           data[i+1].ma=data[i].ma;

                          }

                        //----

                        if(CopyRates(_Symbol,time_frames,0,1,rates)!=1)

                          {

                           error=true;

                           break;

                          }

                        //----

                        data[0].time=rates[0].time;

                        data[0].price=rates[0].low;

                        //----

                        for(int i=1; i>=0; i--)

                          {

                           double sum=0.0;

                           int wsum=0;

                           //----

                           for(int j=PeriodMa; j>0; j--)

                             {

                              wsum+=j;

                              sum+=data[i+(j-1)].price*(PeriodMa-j+1);

                             }

                           //----

                           data[i].ma=sum/wsum;

                          }

                       }

                    }

                  //----

                  break;

                 } //case PRICE_LOW:

               //----

               case PRICE_MEDIAN:

                 {

                  if(one_time)

                    {

                     int bars=Bars(_Symbol,time_frames);

                     //----

                     if(CopyRates(_Symbol,time_frames,0,bars,rates)!=bars)

                       {

                        error=true;

                        break;

                       }

                     //----

                     if(ArrayResize(data,bars)==-1)

                       {

                        error=true;

                        break;

                       }

                     //----

                     for(int i=0; i<bars; i++)

                       {

                        data[i].time=rates[i].time;

                        data[i].price=(rates[i].high+rates[i].low)/2.0;

                       }

                     //----

                     for(int i=bars-PeriodMa-1; i>=0; i--)

                       {

                        double sum=0.0;

                        int wsum=0;

                        //----

                        for(int j=PeriodMa; j>0; j--)

                          {

                           wsum+=j;

                           sum+=data[i+(j-1)].price*(PeriodMa-j+1);

                          }

                        //----

                        data[i].ma=sum/wsum;

                       }

                     //----

                     one_time=false;

                    }

                  else

                    {

                     int bars=Bars(_Symbol,time_frames);

                     //----

                     if(bars>ArraySize(data))

                       {

                        int deff=bars-ArraySize(data);

                        //----

                        if(CopyRates(_Symbol,time_frames,0,deff+1,rates)!=deff+1)

                          {

                           error=true;

                           break;

                          }

                        //----

                        if(ArrayResize(data,bars)==-1)

                          {

                           error=true;

                           break;

                          }

                        //----

                        for(int i=bars-2; i>=0; i--)

                          {

                           data[i+1].time=data[i].time;

                           data[i+1].price=data[i].price;

                           data[i+1].ma=data[i].ma;

                          }

                        //----

                        for(int i=0; i<deff; i++)

                          {

                           data[i].time=rates[i].time;

                           data[i].price=(rates[i].high+rates[i].low)/2.0;

                          }

                        //----

                        for(int i=deff; i>=0; i--)

                          {

                           double sum=0.0;

                           int wsum=0;

                           //----

                           for(int j=PeriodMa; j>0; j--)

                             {

                              wsum+=j;

                              sum+=data[i+(j-1)].price*(PeriodMa-j+1);

                             }

                           //----

                           data[i].ma=sum/wsum;

                          }

                       }

                     else

                       {

                        for(int i=bars-2; i>=0; i--)

                          {

                           data[i+1].time=data[i].time;

                           data[i+1].price=data[i].price;

                           data[i+1].ma=data[i].ma;

                          }

                        //----

                        if(CopyRates(_Symbol,time_frames,0,1,rates)!=1)

                          {

                           error=true;

                           break;

                          }

                        //----

                        data[0].time=rates[0].time;

                        data[0].price=(rates[0].high+rates[0].low)/2.0;

                        //----

                        for(int i=1; i>=0; i--)

                          {

                           double sum=0.0;

                           int wsum=0;

                           //----

                           for(int j=PeriodMa; j>0; j--)

                             {

                              wsum+=j;

                              sum+=data[i+(j-1)].price*(PeriodMa-j+1);

                             }

                           //----

                           data[i].ma=sum/wsum;

                          }

                       }

                    }

                  //----

                  break;

                 } //case PRICE_MEDIAN:

               //----

               case PRICE_TYPICAL:

                 {

                  if(one_time)

                    {

                     int bars=Bars(_Symbol,time_frames);

                     //----

                     if(CopyRates(_Symbol,time_frames,0,bars,rates)!=bars)

                       {

                        error=true;

                        break;

                       }

                     //----

                     if(ArrayResize(data,bars)==-1)

                       {

                        error=true;

                        break;

                       }

                     //----

                     for(int i=0; i<bars; i++)

                       {

                        data[i].time=rates[i].time;

                        data[i].price=(rates[i].high+rates[i].low+rates[i].close)/3.0;

                       }

                     //----

                     for(int i=bars-PeriodMa-1; i>=0; i--)

                       {

                        double sum=0.0;

                        int wsum=0;

                        //----

                        for(int j=PeriodMa; j>0; j--)

                          {

                           wsum+=j;

                           sum+=data[i+(j-1)].price*(PeriodMa-j+1);

                          }

                        //----

                        data[i].ma=sum/wsum;

                       }

                     //----

                     one_time=false;

                    }

                  else

                    {

                     int bars=Bars(_Symbol,time_frames);

                     //----

                     if(bars>ArraySize(data))

                       {

                        int deff=bars-ArraySize(data);

                        //----

                        if(CopyRates(_Symbol,time_frames,0,deff+1,rates)!=deff+1)

                          {

                           error=true;

                           break;

                          }

                        //----

                        if(ArrayResize(data,bars)==-1)

                          {

                           error=true;

                           break;

                          }

                        //----

                        for(int i=bars-2; i>=0; i--)

                          {

                           data[i+1].time=data[i].time;

                           data[i+1].price=data[i].price;

                           data[i+1].ma=data[i].ma;

                          }

                        //----

                        for(int i=0; i<deff; i++)

                          {

                           data[i].time=rates[i].time;

                           data[i].price=(rates[i].high+rates[i].low+rates[i].close)/3.0;

                          }

                        //----

                        for(int i=deff; i>=0; i--)

                          {

                           double sum=0.0;

                           int wsum=0;

                           //----

                           for(int j=PeriodMa; j>0; j--)

                             {

                              wsum+=j;

                              sum+=data[i+(j-1)].price*(PeriodMa-j+1);

                             }

                           //----

                           data[i].ma=sum/wsum;

                          }

                       }

                     else

                       {

                        for(int i=bars-2; i>=0; i--)

                          {

                           data[i+1].time=data[i].time;

                           data[i+1].price=data[i].price;

                           data[i+1].ma=data[i].ma;

                          }

                        //----

                        if(CopyRates(_Symbol,time_frames,0,1,rates)!=1)

                          {

                           error=true;

                           break;

                          }

                        //----

                        data[0].time=rates[0].time;

                        data[0].price=(rates[0].high+rates[0].low+rates[0].close)/3.0;

                        //----

                        for(int i=1; i>=0; i--)

                          {

                           double sum=0.0;

                           int wsum=0;

                           //----

                           for(int j=PeriodMa; j>0; j--)

                             {

                              wsum+=j;

                              sum+=data[i+(j-1)].price*(PeriodMa-j+1);

                             }

                           //----

                           data[i].ma=sum/wsum;

                          }

                       }

                    }

                  //----

                  break;

                 } //case PRICE_TYPICAL:

               //----

               case PRICE_WEIGHTED:

                 {

                  if(one_time)

                    {

                     int bars=Bars(_Symbol,time_frames);

                     //----

                     if(CopyRates(_Symbol,time_frames,0,bars,rates)!=bars)

                       {

                        error=true;

                        break;

                       }

                     //----

                     if(ArrayResize(data,bars)==-1)

                       {

                        error=true;

                        break;

                       }

                     //----

                     for(int i=0; i<bars; i++)

                       {

                        data[i].time=rates[i].time;

                        data[i].price=(rates[i].high+rates[i].low+rates[i].close+rates[i].close)/4.0;

                       }

                     //----

                     for(int i=bars-PeriodMa-1; i>=0; i--)

                       {

                        double sum=0.0;

                        int wsum=0;

                        //----

                        for(int j=PeriodMa; j>0; j--)

                          {

                           wsum+=j;

                           sum+=data[i+(j-1)].price*(PeriodMa-j+1);

                          }

                        //----

                        data[i].ma=sum/wsum;

                       }

                     //----

                     one_time=false;

                    }

                  else

                    {

                     int bars=Bars(_Symbol,time_frames);

                     //----

                     if(bars>ArraySize(data))

                       {

                        int deff=bars-ArraySize(data);

                        //----

                        if(CopyRates(_Symbol,time_frames,0,deff+1,rates)!=deff+1)

                          {

                           error=true;

                           break;

                          }

                        //----

                        if(ArrayResize(data,bars)==-1)

                          {

                           error=true;

                           break;

                          }

                        //----

                        for(int i=bars-2; i>=0; i--)

                          {

                           data[i+1].time=data[i].time;

                           data[i+1].price=data[i].price;

                           data[i+1].ma=data[i].ma;

                          }

                        //----

                        for(int i=0; i<deff; i++)

                          {

                           data[i].time=rates[i].time;

                           data[i].price=(rates[i].high+rates[i].low+rates[i].close+rates[i].close)/4.0;

                          }

                        //----

                        for(int i=deff; i>=0; i--)

                          {

                           double sum=0.0;

                           int wsum=0;

                           //----

                           for(int j=PeriodMa; j>0; j--)

                             {

                              wsum+=j;

                              sum+=data[i+(j-1)].price*(PeriodMa-j+1);

                             }

                           //----

                           data[i].ma=sum/wsum;

                          }

                       }

                     else

                       {

                        for(int i=bars-2; i>=0; i--)

                          {

                           data[i+1].time=data[i].time;

                           data[i+1].price=data[i].price;

                           data[i+1].ma=data[i].ma;

                          }

                        //----

                        if(CopyRates(_Symbol,time_frames,0,1,rates)!=1)

                          {

                           error=true;

                           break;

                          }

                        //----

                        data[0].time=rates[0].time;

                        data[0].price=(rates[0].high+rates[0].low+rates[0].close+rates[0].close)/4.0;

                        //----

                        for(int i=1; i>=0; i--)

                          {

                           double sum=0.0;

                           int wsum=0;

                           //----

                           for(int j=PeriodMa; j>0; j--)

                             {

                              wsum+=j;

                              sum+=data[i+(j-1)].price*(PeriodMa-j+1);

                             }

                           //----

                           data[i].ma=sum/wsum;

                          }

                       }

                    }

                  //----

                  break;

                 } //case PRICE_WEIGHTED:

              } //switch(PriceMa)

           } //case MODE_LWMA:

        } //switch(MethodMa)

      //----

      if(error)

         return(rates_total);

      //----

      is_open_bar=false;

      break;

     } //while(is_open_bar)

//----

   bool error=false;

//----

   switch(MethodMa)

     {

      case MODE_SMA:

        {

         switch(PriceMa)

           {

            case PRICE_CLOSE:

              {

               if(CopyRates(_Symbol,time_frames,0,1,rates)!=1)

                 {

                  error=true;

                  break;

                 }

               //----

               data[0].time=rates[0].time;

               data[0].price=rates[0].close;

               double sum=0.0;

               //----

               for(int i=PeriodMa-1; i>=0; i--)

                  sum+=data[i].price;

               //----

               data[0].ma=sum/PeriodMa;

               break;

              }

            //----

            case PRICE_OPEN:

              {

               if(CopyRates(_Symbol,time_frames,0,1,rates)!=1)

                 {

                  error=true;

                  break;

                 }

               //----

               data[0].time=rates[0].time;

               data[0].price=rates[0].open;

               double sum=0.0;

               //----

               for(int i=PeriodMa-1; i>=0; i--)

                  sum+=data[i].price;

               //----

               data[0].ma=sum/PeriodMa;

               break;

              }

            //----

            case PRICE_HIGH:

              {

               if(CopyRates(_Symbol,time_frames,0,1,rates)!=1)

                 {

                  error=true;

                  break;

                 }

               //----

               data[0].time=rates[0].time;

               data[0].price=rates[0].high;

               double sum=0.0;

               //----

               for(int i=PeriodMa-1; i>=0; i--)

                  sum+=data[i].price;

               //----

               data[0].ma=sum/PeriodMa;

               break;

              }

            //----

            case PRICE_LOW:

              {

               if(CopyRates(_Symbol,time_frames,0,1,rates)!=1)

                 {

                  error=true;

                  break;

                 }

               //----

               data[0].time=rates[0].time;

               data[0].price=rates[0].low;

               double sum=0.0;

               //----

               for(int i=PeriodMa-1; i>=0; i--)

                  sum+=data[i].price;

               //----

               data[0].ma=sum/PeriodMa;

               break;

              }

            //----

            case PRICE_MEDIAN:

              {

               if(CopyRates(_Symbol,time_frames,0,1,rates)!=1)

                 {

                  error=true;

                  break;

                 }

               //----

               data[0].time=rates[0].time;

               data[0].price=(rates[0].high+rates[0].low)/2.0;

               double sum=0.0;

               //----

               for(int i=PeriodMa-1; i>=0; i--)

                  sum+=data[i].price;

               //----

               data[0].ma=sum/PeriodMa;

               break;

              }

            //----

            case PRICE_TYPICAL:

              {

               if(CopyRates(_Symbol,time_frames,0,1,rates)!=1)

                 {

                  error=true;

                  break;

                 }

               //----

               data[0].time=rates[0].time;

               data[0].price=(rates[0].high+rates[0].low+rates[0].close)/3.0;

               double sum=0.0;

               //----

               for(int i=PeriodMa-1; i>=0; i--)

                  sum+=data[i].price;

               //----

               data[0].ma=sum/PeriodMa;

               break;

              }

            //----

            case PRICE_WEIGHTED:

              {

               if(CopyRates(_Symbol,time_frames,0,1,rates)!=1)

                 {

                  error=true;

                  break;

                 }

               //----

               data[0].time=rates[0].time;

               data[0].price=(rates[0].high+rates[0].low+rates[0].close+rates[0].close)/4.0;

               double sum=0.0;

               //----

               for(int i=PeriodMa-1; i>=0; i--)

                  sum+=data[i].price;

               //----

               data[0].ma=sum/PeriodMa;

              }

           } //switch(PriceMa)

         //----

         break;

        } //case MODE_SMA:

      //----

      case MODE_EMA:

        {

         switch(PriceMa)

           {

            case PRICE_CLOSE:

              {

               if(CopyRates(_Symbol,time_frames,0,1,rates)!=1)

                 {

                  error=true;

                  break;

                 }

               //----

               data[0].time=rates[0].time;

               data[0].price=rates[0].close;

               double pr=2.0/(PeriodMa+1.0);

               data[0].ma=data[0].price*pr+data[1].ma*(1.0-pr);

               break;

              }

            //----

            case PRICE_OPEN:

              {

               if(CopyRates(_Symbol,time_frames,0,1,rates)!=1)

                 {

                  error=true;

                  break;

                 }

               //----

               data[0].time=rates[0].time;

               data[0].price=rates[0].open;

               double pr=2.0/(PeriodMa+1.0);

               data[0].ma=data[0].price*pr+data[1].ma*(1-pr);

               break;

              }

            //----

            case PRICE_HIGH:

              {

               if(CopyRates(_Symbol,time_frames,0,1,rates)!=1)

                 {

                  error=true;

                  break;

                 }

               //----

               data[0].time=rates[0].time;

               data[0].price=rates[0].high;

               double pr=2.0/(PeriodMa+1.0);

               data[0].ma=data[0].price*pr+data[1].ma*(1-pr);

               break;

              }

            //----

            case PRICE_LOW:

              {

               if(CopyRates(_Symbol,time_frames,0,1,rates)!=1)

                 {

                  error=true;

                  break;

                 }

               //----

               data[0].time=rates[0].time;

               data[0].price=rates[0].low;

               double pr=2.0/(PeriodMa+1.0);

               data[0].ma=data[0].price*pr+data[1].ma*(1-pr);

               break;

              }

            //----

            case PRICE_MEDIAN:

              {

               if(CopyRates(_Symbol,time_frames,0,1,rates)!=1)

                 {

                  error=true;

                  break;

                 }

               //----

               data[0].time=rates[0].time;

               data[0].price=(rates[0].high+rates[0].low)/2.0;

               double pr=2.0/(PeriodMa+1.0);

               data[0].ma=data[0].price*pr+data[1].ma*(1-pr);

               break;

              }

            //----

            case PRICE_TYPICAL:

              {

               if(CopyRates(_Symbol,time_frames,0,1,rates)!=1)

                 {

                  error=true;

                  break;

                 }

               //----

               data[0].time=rates[0].time;

               data[0].price=(rates[0].high+rates[0].low+rates[0].close)/3.0;

               double pr=2.0/(PeriodMa+1.0);

               data[0].ma=data[0].price*pr+data[1].ma*(1-pr);

               break;

              }

            //----

            case PRICE_WEIGHTED:

              {

               if(CopyRates(_Symbol,time_frames,0,1,rates)!=1)

                 {

                  error=true;

                  break;

                 }

               //----

               data[0].time=rates[0].time;

               data[0].price=(rates[0].high+rates[0].low+rates[0].close+rates[0].close)/4.0;

               double pr=2.0/(PeriodMa+1.0);

               data[0].ma=data[0].price*pr+data[1].ma*(1-pr);

              }

           } //switch(PriceMa)

         //----

         break;

        } //case MODE_EMA:

      //----

      case MODE_SMMA:

        {

         switch(PriceMa)

           {

            case PRICE_CLOSE:

              {

               if(CopyRates(_Symbol,time_frames,0,1,rates)!=1)

                 {

                  error=true;

                  break;

                 }

               //----

               data[0].time=rates[0].time;

               data[0].price=rates[0].close;

               data[0].ma=(data[1].ma*(PeriodMa-1)+data[0].price)/PeriodMa;

               break;

              }

            //----

            case PRICE_OPEN:

              {

               if(CopyRates(_Symbol,time_frames,0,1,rates)!=1)

                 {

                  error=true;

                  break;

                 }

               //----

               data[0].time=rates[0].time;

               data[0].price=rates[0].open;

               data[0].ma=(data[1].ma*(PeriodMa-1)+data[0].price)/PeriodMa;

               break;

              }

            //----

            case PRICE_HIGH:

              {

               if(CopyRates(_Symbol,time_frames,0,1,rates)!=1)

                 {

                  error=true;

                  break;

                 }

               //----

               data[0].time=rates[0].time;

               data[0].price=rates[0].high;

               data[0].ma=(data[1].ma*(PeriodMa-1)+data[0].price)/PeriodMa;

               break;

              }

            //----

            case PRICE_LOW:

              {

               if(CopyRates(_Symbol,time_frames,0,1,rates)!=1)

                 {

                  error=true;

                  break;

                 }

               //----

               data[0].time=rates[0].time;

               data[0].price=rates[0].low;

               data[0].ma=(data[1].ma*(PeriodMa-1)+data[0].price)/PeriodMa;

               break;

              }

            //----

            case PRICE_MEDIAN:

              {

               if(CopyRates(_Symbol,time_frames,0,1,rates)!=1)

                 {

                  error=true;

                  break;

                 }

               //----

               data[0].time=rates[0].time;

               data[0].price=(rates[0].high+rates[0].low)/2.0;

               data[0].ma=(data[1].ma*(PeriodMa-1)+data[0].price)/PeriodMa;

               break;

              }

            //----

            case PRICE_TYPICAL:

              {

               if(CopyRates(_Symbol,time_frames,0,1,rates)!=1)

                 {

                  error=true;

                  break;

                 }

               //----

               data[0].time=rates[0].time;

               data[0].price=(rates[0].high+rates[0].low+rates[0].close)/3.0;

               data[0].ma=(data[1].ma*(PeriodMa-1)+data[0].price)/PeriodMa;

               break;

              }

            //----

            case PRICE_WEIGHTED:

              {

               if(CopyRates(_Symbol,time_frames,0,1,rates)!=1)

                 {

                  error=true;

                  break;

                 }

               //----

               data[0].time=rates[0].time;

               data[0].price=(rates[0].high+rates[0].low+rates[0].close+rates[0].close)/4.0;

               data[0].ma=(data[1].ma*(PeriodMa-1)+data[0].price)/PeriodMa;

              }

           } //switch(PriceMa)

         //----

         break;

        } //case MODE_SMMA:

      //----

      case MODE_LWMA:

        {

         switch(PriceMa)

           {

            case PRICE_CLOSE:

              {

               if(CopyRates(_Symbol,time_frames,0,1,rates)!=1)

                 {

                  error=true;

                  break;

                 }

               //----

               data[0].time=rates[0].time;

               data[0].price=rates[0].close;

               double sum=0.0;

               int wsum=0;

               //----

               for(int i=PeriodMa; i>0; i--)

                 {

                  wsum+=i;

                  sum+=data[i-1].price*(PeriodMa-i+1);

                 }

               //----

               data[0].ma=sum/wsum;

               break;

              }

            //----

            case PRICE_OPEN:

              {

               if(CopyRates(_Symbol,time_frames,0,1,rates)!=1)

                 {

                  error=true;

                  break;

                 }

               //----

               data[0].time=rates[0].time;

               data[0].price=rates[0].open;

               double sum=0.0;

               int wsum=0;

               //----

               for(int i=PeriodMa; i>0; i--)

                 {

                  wsum+=i;

                  sum+=data[i-1].price*(PeriodMa-i+1);

                 }

               //----

               data[0].ma=sum/wsum;

               break;

              }

            //----

            case PRICE_HIGH:

              {

               if(CopyRates(_Symbol,time_frames,0,1,rates)!=1)

                 {

                  error=true;

                  break;

                 }

               //----

               data[0].time=rates[0].time;

               data[0].price=rates[0].high;

               double sum=0.0;

               int wsum=0;

               //----

               for(int i=PeriodMa; i>0; i--)

                 {

                  wsum+=i;

                  sum+=data[i-1].price*(PeriodMa-i+1);

                 }

               //----

               data[0].ma=sum/wsum;

               break;

              }

            //----

            case PRICE_LOW:

              {

               if(CopyRates(_Symbol,time_frames,0,1,rates)!=1)

                 {

                  error=true;

                  break;

                 }

               //----

               data[0].time=rates[0].time;

               data[0].price=rates[0].low;

               double sum=0.0;

               int wsum=0;

               //----

               for(int i=PeriodMa; i>0; i--)

                 {

                  wsum+=i;

                  sum+=data[i-1].price*(PeriodMa-i+1);

                 }

               //----

               data[0].ma=sum/wsum;

               break;

              }

            //----

            case PRICE_MEDIAN:

              {

               if(CopyRates(_Symbol,time_frames,0,1,rates)!=1)

                 {

                  error=true;

                  break;

                 }

               //----

               data[0].time=rates[0].time;

               data[0].price=(rates[0].high+rates[0].low)/2.0;

               double sum=0.0;

               int wsum=0;

               //----

               for(int i=PeriodMa; i>0; i--)

                 {

                  wsum+=i;

                  sum+=data[i-1].price*(PeriodMa-i+1);

                 }

               //----

               data[0].ma=sum/wsum;

               break;

              }

            //----

            case PRICE_TYPICAL:

              {

               if(CopyRates(_Symbol,time_frames,0,1,rates)!=1)

                 {

                  error=true;

                  break;

                 }

               //----

               data[0].time=rates[0].time;

               data[0].price=(rates[0].high+rates[0].low+rates[0].close)/3.0;

               double sum=0.0;

               int wsum=0;

               //----

               for(int i=PeriodMa; i>0; i--)

                 {

                  wsum+=i;

                  sum+=data[i-1].price*(PeriodMa-i+1);

                 }

               //----

               data[0].ma=sum/wsum;

               break;

              }

            //----

            case PRICE_WEIGHTED:

              {

               if(CopyRates(_Symbol,time_frames,0,1,rates)!=1)

                 {

                  error=true;

                  break;

                 }

               //----

               data[0].time=rates[0].time;

               data[0].price=(rates[0].high+rates[0].low+rates[0].close+rates[0].close)/4.0;

               double sum=0.0;

               int wsum=0;

               //----

               for(int i=PeriodMa; i>0; i--)

                 {

                  wsum+=i;

                  sum+=data[i-1].price*(PeriodMa-i+1);

                 }

               //----

               data[0].ma=sum/wsum;

              }

           } //switch(PriceMa)

        } //case MODE_LWMA:

     } //switch(MethodMa)

//----

   if(error)

     {

      one_time=true;

      return(0);

     }

//----

   int limit=rates_total-prev_calculated;

//----

   if(prev_calculated==0)

      limit=rates_total-1;

//----

   int factor=PeriodSeconds(time_frames)/PeriodSeconds();

   limit=(limit+1)*factor;

//----

   if(Shift<0)

      limit-=Shift*factor;

//----

   limit=MathMin(limit,rates_total-1);

//----

   for(int i=limit; i>=0; i--)

     {

      if(i>=ArraySize(ExtMaBuffer))

         continue;

      //----

      ExtMaBuffer[i]=0.0;

      //----

      if(Shift<0

         && i<MathAbs(Shift)*factor)

        {

         ExtMaBuffer[i]=0.0;

         continue;

        }

      //----

      datetime _time=(datetime)MathFloor((double)time[i]/(double)PeriodSeconds(time_frames))*PeriodSeconds(time_frames);

      int pos=iBarShift(_Symbol,time_frames,_time,false);

      //----

      if(Shift!=0)

         pos+=Shift;

      //----

      if(pos==-1)

         continue;

      //----

      if(pos<0)

         continue;

      //----

      if(pos>=ArraySize(data))

         continue;

      //----

      if(PriceSize>0)

        {

         if(digits>0)

           {

            if(price_size<0)

               ExtMaBuffer[i]=MathRound(data[pos].ma/MathPow(10.0,MathAbs(price_size)))*MathPow(10.0,MathAbs(price_size));

            else

               ExtMaBuffer[i]=NormalizeDouble(data[pos].ma,price_size);

           }

         else

           {

            if(price_size<0)

               ExtMaBuffer[i]=MathRound(data[pos].ma/MathPow(10.0,MathAbs(price_size)))*MathPow(10.0,MathAbs(price_size));

            else

               ExtMaBuffer[i]=NormalizeDouble(data[pos].ma,price_size);

           }

        }

      else

         ExtMaBuffer[i]=NormalizeDouble(data[pos].ma,price_size);

      //----

      if(i>=rates_total-1)

         continue;

      //----

      if(ExtMaBuffer[i]>ExtMaBuffer[i+1])

        {

         ExtColorBuffer[i]=1.0;

         continue;

        }

      //----

      if(ExtMaBuffer[i]<ExtMaBuffer[i+1])

        {

         ExtColorBuffer[i]=0.0;

         continue;

        }

      //----

      if(ExtMaBuffer[i]==ExtMaBuffer[i+1]

         && ExtColorBuffer[i+1]==1.0)

        {

         ExtColorBuffer[i]=1.0;

         continue;

        }

      //----

      if(ExtMaBuffer[i]==ExtMaBuffer[i+1]

         && ExtColorBuffer[i+1]==0.0)

         ExtColorBuffer[i]=0.0;

     }

//----

   return(rates_total);

  }

//+------------------------------------------------------------------+

Comments