Indicators Used
Indicator of the average true rangeStandard Deviation indicator
Miscellaneous
Implements a curve of type %1
0 Views
0 Downloads
0 Favorites
gnorm
/*
iCustom(NULL,0,"~norm",Source,SourcePeriod,Window,Sens,Power,Smooth,Signal,Fade, N,i);
ãäå N:
0 - ðåç-ò íîðìèðîâàíèÿ
1 - ñãëàæèâàíèå çàòóõàíèÿ
2 - ñãëàæèâàíèå ôðîíòà
3 - áóôåð èñòî÷íèêà âîëàòèëüíîñòè // íå âûâîäèòñÿ
4 - ñûðîå íîðìèðîâàíèå // íå âûâîäèòñÿ
*/

#property indicator_separate_window // â îêíå èíäèêàòîðà
#property indicator_buffers 5
#property indicator_color1 Green // ðåçóëüòàò íîðìèðîâàíèÿ
#property indicator_color2 Red // ñãëàæåííîå çàòóõàíèå
#property indicator_color3 Red // ñãëàæåííûé ôðîíò
#property indicator_maximum 1
#property indicator_minimum 0

// âõîäíûå ïàðàìåòðû
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=0; // ïîðîã ÷óâñòâòèòåëüíîñòè â ïï.èëè òèêàõ (îáúåì)
   double sens; // ïîðîã ÷óâñòâòèòåëüíîñòè â öåíàõ èëè òèêàõ (îáúåì)
extern double Power=1; // ñòåïåíü äëÿ ïåðåäàòî÷íîé ôóíêöèè
extern int Smooth=1; // ñãëàæèâàíèå íîðìèðîâàíèÿ; <0 EMA, >0 SMA
   double kSm; // êîýôô.EMA äëÿ Smooth
   bool bSl;
extern int Signal=1; // ñèãíàëüíàÿ; <0 EMA, >0 SMA
   double kSg; // êîýôô.EMA äëÿ Signal
   bool bSg;
extern int Fade=1; // çàòóõàíèå ñèãíàëüíîé
   double kFd; // êîýôô.EMA äëÿ Fade

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

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

// îáùèå (ãëîáàëüíûå) ïåðåìåííûå
bool first=1; // ôëàã ïåðâîãî çàïóñêà

// èíèöèàëèçàöèÿ
int init()
  {
   first=1; // ôëàã ïåðâîãî çàïóñêà
   if(Source>0) sens=Sens*Point; // ïðèâåäåíèå ïîðîãà ê öåíàì äëÿ öåíîâûõ èñòî÷íèêîâ
   else sens=Sens; 
   if(Sens>0) string _sn=DoubleToStr(Sens,1)+" ";
   // âû÷èñëåíèå êîýôôèöèåíòîâ EMA
   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;
   // if(Fade>1) 
   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; // ñò.äåâèàöèÿ
      case 4: _src=_src+"H/L"; // ñò.äåâèàöèÿ
     }
   _src=_src+"("+(string)SourcePeriod+")";
   string _nrm=" ["+(string)Window+","+(string)Smooth+"]";
   IndicatorShortName(_sn+_src+_nrm+_sgfd); 

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

   SetIndexBuffer(1,NEG);
   SetIndexStyle(1,DRAW_LINE,2);
   SetIndexLabel(1,"Neg"+_sgfd);

   SetIndexBuffer(2,POS);
   SetIndexStyle(2,DRAW_LINE,2);
   SetIndexLabel(2,"Pos"+_sgfd);

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

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

   return(0);
  }

// ô-ÿ äîïîëíèòåëüíîé èíèöèàëèçàöèè
int reinit() 
  {
   ArrayInitialize(NRM,0.0); // îáíóëåíèå ìàññèâà
   ArrayInitialize(NEG,0.0); // îáíóëåíèå ìàññèâà
   ArrayInitialize(POS,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) limit-=2;
   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: 
            double atr0 =iATR(NULL,0,1, i); // ATR
            double atrsh=iATR(NULL,0,1,sh); // ATR
            if(bSp) SRC[i]=kSp*atr0+(1-kSp)*SRC[i+1]; // ÅÌÀ
            else { // SMA
               ma=SRC[i+1]*SourcePeriod-atrsh;
               SRC[i]=(ma+atr0)/SourcePeriod;
              }
           break; 
         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;
              }
        }
//==
      // íîðìèðîâàíèå
         // ýêñòðåìóìû
      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;
         // ïî ôðîíòó
      POS[i]=kFd*sgn+(1-kFd)*POS[i+1];
      if(sgn<POS[i+1]) POS[i]=sgn;
//=========================================

      // ñèíõðîíèçàöèÿ
      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 ---