Indicators Used
Indicator of the average true rangeStandard Deviation indicatorStochastic oscillator
Miscellaneous
Implements a curve of type %1
0 Views
0 Downloads
0 Favorites
7StochAM
//+------------------------------------------------------------------+
//|                                                      ProjectName |
//|                                      Copyright 2012, CompanyName |
//|                                       http://www.companyname.net |
//+------------------------------------------------------------------+
/*
iCustom(NULL,0,"~StochAM",Kperiod,Dperiod,Slowing,PriceField, Source,SourcePeriod,Window,Sens,Power,Smooth,Signal,Fade, N,i);
ãäå N:
0 - ñòîõàñòèê
1 - ñèãíàëüíàÿ %D
2 - ðåç-ò íîðìèðîâàíèÿ
3 - ñãëàæèâàíèå çàòóõàíèÿ
4 - áóôåð èñòî÷íèêà âîëàòèëüíîñòè // íå âûâîäèòñÿ
5 - ñûðîå íîðìèðîâàíèå // íå âûâîäèòñÿ
*/

#property indicator_separate_window // â îêíå èíäèêàòîðà
#property indicator_buffers 6
#property indicator_color1 Green // ñòîõàñòèê
#property indicator_color2 Red // ñèãíàëüíàÿ
#property indicator_maximum 100
#property indicator_minimum 0
#property indicator_level1 80
#property indicator_level2 20

// âõîäíûå ïàðàìåòðû
extern int Kperiod=5; // %K
extern int Dperiod=3; // %D: >0 SMA, <0 EMA
double kDp; // êîýôô.EMA äëÿ %D
bool bDp;
extern int Slowing=3; // çàìåäëåíèå
int Method=0; // ìåòîä ñãëàæèâàíèÿ %D
extern int PriceField=0; // 0- High/Low, 1- Close
extern int Source=2; // 0- îáúåì, 1- ATR, 2- ñò.äåâ., 3- Close
extern int SourcePeriod=5; // ïåðèîä èñòî÷íèêà, <0 EMA, >0 SMA
double kSp; // êîýôô.EMA äëÿ SourcePeriod
bool bSp;
extern int Window=5; // îêíî íîðìèðîâàíèÿ â áàðàõ
extern double Sens=2; // ïîðîã ÷óâñòâòèòåëüíîñòè â ïï.èëè òèêàõ (îáúåì)
double sens; // ïîðîã ÷óâñòâòèòåëüíîñòè â öåíàõ èëè òèêàõ (îáúåì)
extern double Power=2; // ñòåïåíü äëÿ ïåðåäàòî÷íîé ôóíêöèè
extern int Smooth=1; // ñãëàæèâàíèå íîðìèðîâàíèÿ
double kSm; // êîýôô.EMA äëÿ Smooth
bool bSl;
extern int Signal=1; // ñèãíàëüíàÿ
double kSg; // êîýôô.EMA äëÿ Signal
bool bSg;
extern int Fade=12; // çàòóõàíèå ñèãíàëüíîé
double kFd; // êîýôô.EMA äëÿ Fade

int History=0; // 0- âñå áàðû

               // ìàññèâû èíä.áóôåðîâ
double
STH[], // ñòîõàñòèê
SGN[], // ñèãíàëüíàÿ (%D) ñòîõàñòèêà
NRM[], // ðåç-ò íîðìèðîâàíèÿ
NEG[], // ñãëàæèâàíèå çàòóõàíèÿ
SRC[], // áóôåð èñòî÷íèêà âîëàòèëüíîñòè // íå âûâîäèòñÿ
NR0[]; // ñûðîå íîðìèðîâàíèå // íå âûâîäèòñÿ

       // îáùèå (ãëîáàëüíûå) ïåðåìåííûå
bool first=1; // ôëàã ïåðâîãî çàïóñêà
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
// èíèöèàëèçàöèÿ
int init()
  {
   first=1; // ôëàã ïåðâîãî çàïóñêà
   string _sth="Stoch("+(string)Kperiod+","+(string)Dperiod+","+(string)Slowing+") ";
   if(Source>0) sens=Sens*Point; // ïðèâåäåíèå ïîðîãà ê öåíàì äëÿ öåíîâûõ èñòî÷íèêîâ
   else sens=Sens;
   if(Sens>0) string _sn=DoubleToStr(Sens,1)+" ";
// âû÷èñëåíèå êîýôôèöèåíòîâ EMA
   if(Dperiod<0) {Dperiod=-Dperiod; kDp=2.0/(1+Dperiod); bDp=1;} else bDp=0;
   if(SourcePeriod<0) {SourcePeriod=-SourcePeriod; kSp=2.0/(1+SourcePeriod); bSp=1;} else bSp=0;
   if(Smooth<0) {Smooth=-Smooth; kSm=2.0/(1+Smooth); bSl=1;} else bSl=0;
   if(Signal<0) {Signal=-Signal; kSg=2.0/(1+Signal); bSg=1;} else bSg=0;
   kFd=2.0/(1+Fade);

   string _sgfd=" ("+(string)Signal+","+(string)Fade+")";
   string _src="";
   switch(Source)
     {
      case 0: _src=_src+"Volume"; break; // îáúåì
      case 1: _src=_src+"ATR"; break; // ATR
      case 2: _src=_src+"StDev"; break; // ñò.äåâèàöèÿ
      case 3: _src=_src+"Close"; break; // Close
      case 4: _src=_src+"H/L"; // High/Low
     }
   _src=_src+"("+(string)SourcePeriod+")";
   string _nrm=" ["+(string)Window+","+(string)Smooth+"]";
   IndicatorShortName(_sth+_sn+_src+_nrm+_sgfd);

// èíä.áóôåðû
   SetIndexBuffer(0,STH);
   SetIndexStyle(0,DRAW_LINE);
   SetIndexLabel(0,_sth);

   SetIndexBuffer(1,SGN);
   SetIndexStyle(1,DRAW_LINE,2);
   SetIndexLabel(1,"Sgn("+(string)Slowing+")");

   SetIndexBuffer(2,NRM);
   SetIndexStyle(2,DRAW_NONE);
   SetIndexLabel(2,_nrm);

   SetIndexBuffer(3,NEG);
   SetIndexStyle(3,DRAW_NONE,2);
   SetIndexLabel(3,"Neg"+_sgfd);

   SetIndexBuffer(4,SRC);
   SetIndexStyle(4,DRAW_NONE);
   SetIndexLabel(4,NULL);

   SetIndexBuffer(5,NR0);
   SetIndexStyle(5,DRAW_NONE);
   SetIndexLabel(5,NULL);

   return(0);
  }
// ô-ÿ äîïîëíèòåëüíîé èíèöèàëèçàöèè
int reinit()
  {
   ArrayInitialize(STH,0.0); // îáíóëåíèå ìàññèâà
   ArrayInitialize(SGN,0.0); // îáíóëåíèå ìàññèâà
   ArrayInitialize(NRM,0.0); // îáíóëåíèå ìàññèâà
   ArrayInitialize(NEG,0.0); // îáíóëåíèå ìàññèâà
   ArrayInitialize(SRC,0.0); // îáíóëåíèå ìàññèâà
   ArrayInitialize(NR0,0.0); // îáíóëåíèå ìàññèâà
   return(0);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int start()
  {
   int ic=IndicatorCounted();
   if(!first && Bars-ic-1>1) ic=reinit(); // åñëè åñòü ïðîïóùåííûå áàðû íå íà ïîäêëþ÷åíèè - ïåðåñ÷åò
   bool ic0=ic==0; // ôëàã ïåðåñ÷åòà
   int limit=Bars-ic; // êîë-âî ïåðåñ÷åòîâ
   if(ic==0)
     {
      reinit();
      limit-=3;
     }
   for(int i=limit; i>=0; i--)
     { // öèêë ïåðåñ÷åòà ïî ÂÑÅÌ áàðàì
      bool reset=i==limit && ic0; // ñáðîñ íà ïåðâîé èòåðàöèè öèêëà ïåðåñ÷åòà
      if(reset)
        {
         static int BarsPrev=0; // ïðåä. çíà÷åíèå Bars
        }
      bool NewBar=(ic0 && i>0) || BarsPrev!=Bars; // ïåðâûé òèê íîâîãî áàðà
                                                  //=========================================
      // èñòî÷íèê
      int sh=i+SourcePeriod;
      switch(Source)
        {
         case 0: // îáúåì
            if(bSp) SRC[i]=kSp*Volume[i]+(1-kSp)*SRC[i+1]; // ÅÌÀ
            else
              { // SMA
               double ma=SRC[i+1]*SourcePeriod-Volume[sh];
               SRC[i]=(ma+Volume[i])/SourcePeriod;
              }
            break;
         case 1: SRC[i]=iATR(NULL,0,SourcePeriod,i); break; // ATR
         case 2: SRC[i]=iStdDev(NULL,0,SourcePeriod,0,bSp,0,i); break; // ñò.äåâèàöèÿ
         case 3: // Close
            if(bSp) SRC[i]=kSp*Close[i]+(1-kSp)*SRC[i+1]; // ÅÌÀ
            else
              { // SMA
               ma=SRC[i+1]*SourcePeriod-Close[sh];
               SRC[i]=(ma+Close[i])/SourcePeriod;
              }
            break;
        }
      //=========================================
      // íîðìèðîâàíèå
      // ýêñòðåìóìû
      double max=SRC[ArrayMaximum(SRC,Window,i)];
      double min=SRC[ArrayMinimum(SRC,Window,i)];
      double c=SRC[i];
      // øóìîïîäàâëåíèå
      double delta=max-min; // ðàçìàõ
      double diff=sens-delta; // ðàçíèöà ìåæäó ïîðîãîì ÷óâñòâ. è ðàçìàõîì
      if(diff>0)
        { // åñëè ðàçíèöà >0 (ðàçìàõ ìåíüøå ïîðîãà), òî
         delta=sens; // ðàçìàõ = ïîðîãó,
         min-=diff/2; // íîâîå çíà÷åíèå ìèíèìóìà
        }
      // íîðìèðîâàíèå
      if(delta!=0) NR0[i]=MathPow((c-min)/delta,Power);
      //==
      // çàìåäëåíèå
      if(bSl) NRM[i]=kSm*NR0[i]+(1-kSm)*NRM[i+1]; // EMA
      else
        { // SMA
         sh=i+Smooth;
         ma=NRM[i+1]*Smooth-NR0[sh];
         NRM[i]=(ma+NR0[i])/Smooth;
        }
      //==
      // ñèãíàëüíàÿ
      if(reset) {static double sgnPrev=0;}
      if(bSg) double sgn=kSg*NRM[i]+(1-kSg)*sgnPrev; // EMA
      else
        { // SMA
         sh=i+Signal;
         ma=sgnPrev*Signal-NRM[sh];
         sgn=(ma+NRM[i])/Signal;
        }
      //==      
      // çàòóõàíèå ñèãíàëüíîé
      // ïî çàòóõàíèþ
      NEG[i]=kFd*sgn+(1-kFd)*NEG[i+1];
      if(sgn>NEG[i+1]) NEG[i]=sgn;

      //=========================================
      // ñòîõàñòèê
      double sth=iStochastic(NULL,0,Kperiod,1,Slowing,0,PriceField,0,i)-50;
      STH[i]=NEG[i]*sth+50; // ìîäóëÿöèÿ íîìèðîâàííîé âîëàòèëüíîñòüþ
                            // ñèãíàëüíàÿ %D
      if(bDp) SGN[i]=kDp*STH[i]+(1-kDp)*SGN[i+1]; // EMA
      else
        { // SMA
         sh=i+Dperiod;
         if(sh<ArraySize(STH) && i+1<ArraySize(SGN))
           {
            ma=SGN[i+1]*Dperiod-STH[sh];
            SGN[i]=(ma+STH[i])/Dperiod;
           }
        }
      //=========================================
      // ñèíõðîíèçàöèÿ
      if(NewBar) {sgnPrev=sgn; BarsPrev=Bars;}
     }
   first=0; // ñáðîñ ôëàãà ïåðâîãî öèêëà
   return(0);
  }
//+------------------------------------------------------------------+

Comments

Markdown supported. Formatting help

Markdown Formatting Guide

Element Markdown Syntax
Heading # H1
## H2
### H3
Bold **bold text**
Italic *italicized text*
Link [title](https://www.example.com)
Image ![alt text](image.jpg)
Code `code`
Code Block ```
code block
```
Quote > blockquote
Unordered List - Item 1
- Item 2
Ordered List 1. First item
2. Second item
Horizontal Rule ---