Miscellaneous
Implements a curve of type %1
0 Views
0 Downloads
0 Favorites
iFMA
//+------------------------------------------------------------------+
//|                                                      ProjectName |
//|                                      Copyright 2012, CompanyName |
//|                                       http://www.companyname.net |
//+------------------------------------------------------------------+
/*
âûçîâ èç êîäîâ ïî ïîëÿì ïàðàìåòðîâ íè÷åì íå îòëè÷àåòñÿ îò ñòàíäàðòíîé iMA:
double iCustom(
   string symbol,       // ñèìâîëüíîå èìÿ èíñòðóìåíòà (NULL- òåêóùèé)
   int timeframe,       // òàéì-ôðåéì (0- òåêóùèé)
   "iFMA",              // èìÿ ýòîãî èíäèêàòîðà
   double period,       // ïåðèîä MA; ì.á.äðîáíûì (>1) è â âèäå êîýôô-òà (<1)
   double ma_shift,     // ñäâèã MA; ì.á. äðîáíûì (>0)
   int ma_method,       // ìåòîä óñðåäíåíèÿ:
                           // 0- SMA (ïðîñòàÿ),
                           // 1- EMA (ýêñïîíåíöèàëüíàÿ),
                           // 2- SSMA (ñãëàæåííàÿ),
                           // 3- LWMA (ëèíåéíî-âçâåøåííàÿ)
   int applied_price,   // òèï ñãëàæèâàåìûõ äàííûõ:
                           // 0- Close, 1- Open, 2- High, 3- Low, 
                           // 4- Middle=(High+Low)/2 (ñðåäíÿÿ),
                           // 5- Typical=(High+Low+Close)/3 (òèïè÷íàÿ),
                           // 6- Weighted=High+Low+2*Close)/4 (âçâåøåííàÿ),
                           // 7- Volume (îáúåì)
   0,                   // mode - íîìåð áóôåðà èíäèêàòîðà (0)
   int shift            // ñäâèã
   ) 

==============

iCustom(NULL,0,"iFMA",MAperiod,Shift,Method,Price, 0,i);
*/

#property indicator_chart_window // â îêíå èíñòðóìåíòà
#property indicator_buffers 3
#property indicator_color1 Red  

// âõîäíûå ïàðàìåòðû
extern double MAperiod=3;
extern double Shift=0;
extern int Method=0;
extern int Price=0;
int History=0; // 0- âñå áàðû

double MA[],b0[],b1[]; // ìàññèâû èíä. è âñïîìîãàòåëüíûõ áóôåðîâ
double k0,k1,period; // êîýôô. EMA è ïðîèçâîäíûé ïåðèîä
double rt; // äðîáíàÿ ÷àñòü ïåðèîäà
int per; // öåëàÿ ÷àñòü ïåðèîäà
double rts0,rts1; // öåëûé è äðîáíûé âåñà áàðîâ ñäâèãà
int pers; // öåëàÿ ÷àñòü ñäâèãà
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
// èíèöèàëèçàöèÿ
void init()
  {
   if(MAperiod>1) {k0=2/(1+MAperiod); period=MAperiod;}
   else {k0=MAperiod; period=(2-MAperiod)/MAperiod;}
   k1=1-k0;

   per=MathFloor(period);
   rt=period-per;
   pers=MathFloor(Shift);
   rts1=Shift-pers; rts0=1-rts1;

   string _sn=_method(Method)+"("+DoubleToStr(period,2)+")";
   IndicatorShortName(_sn);

   SetIndexBuffer(0,MA); // èíäèêàòîð
   SetIndexLabel(0,_sn);
   SetIndexEmptyValue(0,0.0);
   SetIndexBuffer(1,b0); // âñïîìîãàòåëüíûé áóôåð
   SetIndexStyle(1,DRAW_NONE);
   SetIndexLabel(1,NULL);
   SetIndexEmptyValue(1,0.0);
   SetIndexBuffer(2,b1); // âñïîìîãàòåëüíûé áóôåð
   SetIndexStyle(2,DRAW_NONE);
   SetIndexLabel(2,NULL);
   SetIndexEmptyValue(2,0.0);

   ArrayInitialize(MA,0.0);
   ArrayInitialize(b0,0.0);
   ArrayInitialize(b1,0.0);

  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void start()
  {
/*int limit=Bars-IndicatorCounted()-1;
   if(limit>1) 
     {
      limit=Bars-1;
      ArrayInitialize(MA,0.0);
      ArrayInitialize(b0,0.0);
      ArrayInitialize(b1,0.0);
     }
*/
//   if(History!=0 && limit>History) limit=History-1; // êîë-âî ïåðåñ÷åòîâ ïî èñòîðèè
//                                                    // öèêë ïåðåñ÷åòà

   int counted_bars=IndicatorCounted();
   if(counted_bars<0) return(-1);
   if(counted_bars>0) counted_bars--;
   int limit=Bars-counted_bars;
   if(counted_bars==0) limit-=1+per;

   for(int i=limit; i>=0; i--)
     {
      double ma=0,mp=0;
      switch(Method)
        {
         case 0: // SMA
            int lim=limit-per-(rt>0)+1;
            if(i<=lim || i<2)
              { // ðàñ÷åòíàÿ èñòîðèÿ
               int j=i+per; // ïîëîæåíèå ñòàðøåãî äðîáíîãî áàðà
               if(i==lim)
                 { // íà÷àëüíîå çíà÷åíèå
                  ma=rt*Price(Price,j); // âåñ ñòàðøåãî äðîáíîãî áàðà
                  j--;
                  for(; j>=i; j--) ma+=Price(Price,j); // ñóììà öåëûõ áàðîâ
                 }
               else
                 { // îñíîâíîé ðàñ÷åò
                  if(rt>0) ma=b0[i+1]*period-rt*Price(Price,j+1)-(1-rt)*Price(Price,j)+Price(Price,i);
                  else ma=b0[i+1]*period-Price(Price,j)+Price(Price,i);
                 }
               b0[i]=ma/period; // MA
              }
            break;
         case 1: // EMA
            if(i==limit && i>1) ma=Price(Price,i); // íà÷àëüíîå çíà÷åíèå
            else ma=k0*Price(Price,i)+k1*b0[i+1]; // îñíîâíîé ðàñ÷åò
            b0[i]=ma;
            break;
         case 2: // SMMA
            lim=limit-per-(rt>0)+1;
            if(i<=lim || i<2)
              { // ðàñ÷åòíàÿ èñòîðèÿ
               if(i==lim)
                 { // íà÷àëüíîå çíà÷åíèå
                  j=i+per; // ïîëîæåíèå ñòàðøåãî äðîáíîãî áàðà
                  ma=rt*Price(Price,j); // âåñ ñòàðøåãî äðîáíîãî áàðà
                  j--;
                  for(; j>=i; j--) ma+=Price(Price,j); // ñóììà öåëûõ áàðîâ
                  ma/=period;
                 }
               else ma=((period-1)*b0[i+1]+Price(Price,i))/period; // îñíîâíîé ðàñ÷åò
              }
            b0[i]=ma; // MA
            break;
         case 3: // LWMA
            static double wt;
            lim=limit-per-(rt>0)+1;
            j=i+per; // ïîëîæåíèå ñòàðøåãî äðîáíîãî áàðà
            if(i<=lim || i<2)
              { // ðàñ÷åòíàÿ èñòîðèÿ
               if(i==lim)
                 { // íà÷àëüíîå çíà÷åíèå
                  if(rt>0)
                    {
                     ma=rt*Price(Price,j); // âåñ ñòàðøåãî äðîáíîãî áàðà
                     mp=ma; wt=rt;
                    }
                  else {wt=0; ma=0; mp=0;}
                  j--;
                  for(int k=1; j>=i; j--,k++)
                    { // ñóììà âåñîâ öåëûõ áàðîâ
                     ma+=Price(Price,j)*k;
                     mp+=Price(Price,j);
                     wt+=k;
                    }
                 }
               else
                 { // îñíîâíîé ðàñ÷åò
                  if(rt>0)
                    {
                     ma=b0[i+1]*wt-b1[i+1]+rt*Price(Price,j)+per*Price(Price,i);
                     mp=b1[i+1]-rt*Price(Price,j+1)-(1-rt)*Price(Price,j)+Price(Price,i);
                    }
                  else
                    {
                     ma=b0[i+1]*wt-b1[i+1]+per*Price(Price,i);
                     mp=b1[i+1]-Price(Price,j)+Price(Price,i);
                    }
                 }
               b0[i]=ma/wt; b1[i]=mp;// MA
              }
        }
      // ñäâèã (ëèíåéíàÿ èíòåðïîëÿöèÿ)
      double b01=b0[i+pers+1];
      if(b01!=0 || rts1==0) MA[i]=rts1*b01+rts0*b0[i+pers];
     }
  }
// òèï öåíû
double Price(int ApplPrice,int i)
  {
   switch(ApplPrice)
     {
      case 0: return(Close[i]);
      case 1: return(Open[i]);
      case 2: return(High[i]);
      case 3: return(Low[i]);
      case 4: return((High[i]+Low[i])/2); // Middle
      case 5: return((High[i]+Low[i]+Close[i])/3); // Typical
      case 6: return((High[i]+Low[i]+2*Close[i])/4); // Weighted
      case 7: return(Volume[i]);
      default: return(Close[i]);
     }
  }
// íàçâàíèå ìåòîäà
string _method(int m)
  {
   switch(m)
     {
      case 0: return("SMA"); // SMA
      case 1: return("EMA"); // EMA
      case 2: return("SMMA"); // SMMA
      case 3: return("LWMA"); // LWMA
      default: return("SMA");
     }
  }
//+------------------------------------------------------------------+

Comments