Author:
Snake
Indicators Used
Moving average indicator
0 Views
0 Downloads
0 Favorites
Snake
//+------------+-----------------------------------------------------+
//| v.19.04.07 |                                           Snake.mq4 |
//+------------+                                   "ÔÈËÜÒÐÓÉ ÁÀÇÀÐ!" |
//|            |              Bookkeeper, 2006, yuzefovich@gmail.com |
//+------------------------------------------------------------------+
#property copyright ""
#property link      "http://www.forexter.land.ru/indicators.htm"
//----
#property indicator_chart_window
#property indicator_buffers 6
#property indicator_color1  Blue
#property indicator_color2  Blue
#property indicator_color3  Maroon
#property indicator_color4  Maroon
#property indicator_color5  Black
#property indicator_color6  Black
//----
extern int    SnakeRange   =3; 
extern int    FilterPeriod =21; 
extern double MartFiltr    =2;
extern int    PRICE_Const  =1; // 0 - Close
                               // 1 - Open
                               // 2 - High
                               // 3 - Low
                               // 4 - (H+L)/2
                               // 5 - (H+L+C)/3
                               // 6 - (H+L+2*C)/4
extern bool   HardCalc     =false;
//----
double        BorderTop[];
double        BorderBot[];
double        Mart[];
double        Axis[];
double        Mood[];  // äëÿ iCustom
double        Width[]; // äëÿ iCustom
//----
//----
void deinit()
{
  return;
}
//----
int init()
{
int    draw_begin;
   draw_begin=FilterPeriod+SnakeRange+2;
   IndicatorBuffers  (6);
   SetIndexBuffer    (0,BorderTop);
   SetIndexBuffer    (1,BorderBot); 
   SetIndexBuffer    (2,Mart); 
   SetIndexBuffer    (3,Axis); 
   SetIndexBuffer    (4,Mood); 
   SetIndexBuffer    (5,Width); 
   SetIndexStyle     (0,DRAW_LINE);
   SetIndexStyle     (1,DRAW_LINE);
   SetIndexStyle     (2,DRAW_LINE, EMPTY, 2); 
   SetIndexStyle     (3,DRAW_LINE,STYLE_DOT);
   SetIndexStyle     (4,DRAW_NONE);
   SetIndexStyle     (5,DRAW_NONE);
   SetIndexDrawBegin (0,draw_begin);
   SetIndexDrawBegin (1,draw_begin);
   SetIndexDrawBegin (2,draw_begin);
   SetIndexDrawBegin (3,draw_begin);
   SetIndexDrawBegin (4,draw_begin);
   SetIndexDrawBegin (5,draw_begin);
   return(0);
}
//----
int start()
{
int counted_bars=IndicatorCounted();
int limit,i;
   if(counted_bars<0)  return(-1);
   if(Bars<=(FilterPeriod+SnakeRange+2)) return(-1);
   if(SnakeRange<3) SnakeRange=3;
   if(counted_bars>0)  counted_bars--;
   limit=Bars-counted_bars;
   for(i=limit;i>=0;i--) MainCalculation(i);
   return(0);
}
//---------------------------------------------------------------------
void MainCalculation(int Pos)
{
   if((Bars-Pos)>(SnakeRange+1)) MartAxis(Pos); 
   else Axis[Pos]=0;
   if((Bars-Pos)>(FilterPeriod+SnakeRange+2)) 
   {
      if(HardCalc==true) SmoothOverMart2(Pos);
      else SmoothOverMart(Pos);
   } 
   else 
   {
      BorderTop[Pos]=0;
      BorderBot[Pos]=0;
      Mart[Pos]=0;
      Mood[Pos]=0;
      Width[Pos]=0;
   }
   return;
}
//---------------------------------------------------------------------
void MartAxis(int Pos)
{  
int    SnakeWeight, i, w, ww, Shift;
double SnakeSum;
   switch(PRICE_Const) {
   case  0: Axis[Pos]=iMA(NULL,0,SnakeRange+1,0,MODE_LWMA,PRICE_CLOSE,Pos);
      break;
   case  1: Axis[Pos]=iMA(NULL,0,SnakeRange+1,0,MODE_LWMA,PRICE_OPEN,Pos);
      break;
   case  2: Axis[Pos]=iMA(NULL,0,SnakeRange+1,0,MODE_LWMA,PRICE_HIGH,Pos);
      break;
   case  3: Axis[Pos]=iMA(NULL,0,SnakeRange+1,0,MODE_LWMA,PRICE_LOW,Pos);
      break;
   case  4: Axis[Pos]=iMA(NULL,0,SnakeRange+1,0,MODE_LWMA,PRICE_MEDIAN,Pos);
      break;
   case  5: Axis[Pos]=iMA(NULL,0,SnakeRange+1,0,MODE_LWMA,PRICE_TYPICAL,Pos);
      break;
   case  6: Axis[Pos]=iMA(NULL,0,SnakeRange+1,0,MODE_LWMA,PRICE_WEIGHTED,Pos);
      break;
   default: Axis[Pos]=iMA(NULL,0,SnakeRange+1,0,MODE_LWMA,PRICE_WEIGHTED,Pos);
      break; }
   for(Shift=Pos+SnakeRange+2;Shift>Pos;Shift--)
   {
      SnakeSum=0.0;
      SnakeWeight=0;
      i=0;
      w=Shift+SnakeRange;
      ww=Shift-SnakeRange;
      if(ww<Pos) ww=Pos;
      while(w>=Shift)
      {
         i++;
         SnakeSum=SnakeSum+i*SnakePrice(w);
         SnakeWeight=SnakeWeight+i;
         w--;
      }
      while(w>=ww)
      {
         i--;
         SnakeSum=SnakeSum+i*SnakePrice(w);
         SnakeWeight=SnakeWeight+i;
         w--;
      }
      Axis[Shift]=SnakeSum/SnakeWeight;
   }
   return;
}
//----
double SnakePrice(int Shift)
{
   switch(PRICE_Const) {
   case  0:
      return(Close[Shift]);
   case  1:
      return(Open[Shift]);
   case  2:
      return(High[Shift]);
   case  3:
      return(Low[Shift]);
   case  4:
      return((High[Shift]+Low[Shift])/2);
   case  5:
      return((Close[Shift]+High[Shift]+Low[Shift])/3);
   case  6:
      return((2*Close[Shift]+High[Shift]+Low[Shift])/4);
   default:
      return((2*Close[Shift]+High[Shift]+Low[Shift])/4); }
}
//---------------------------------------------------------------------
void SmoothOverMart(int Pos)
{ 
int    Shift;
double a, t, b;
   for(Shift=Pos+SnakeRange+2;Shift>=Pos;Shift--)
   {
      t=Axis[ArrayMaximum(Axis,FilterPeriod,Shift)];
      b=Axis[ArrayMinimum(Axis,FilterPeriod,Shift)];
      a=Axis[Shift];
      BorderTop[Shift]=(2*(1+MartFiltr)*a+(t-b))/2/(1+MartFiltr);
      BorderBot[Shift]=(2*(1+MartFiltr)*a-(t-b))/2/(1+MartFiltr);
      Mart[Shift]=(2*(2+MartFiltr)*a-(t+b))/2/(1+MartFiltr);
      Width[Shift]=BorderTop[Shift]-BorderBot[Shift];
      Mood[Shift]=2.0*(Mart[Shift]-BorderBot[Shift])/
                   (BorderTop[Shift]-BorderBot[Shift])-1.0;
   }
   return;
}
//---------------------------------------------------------------------
void SmoothOverMart2(int Shift)
{ 
double a, t, b;
      t=Axis[ArrayMaximum(Axis,FilterPeriod,Shift)];
      b=Axis[ArrayMinimum(Axis,FilterPeriod,Shift)];
      a=Axis[Shift];
      BorderTop[Shift]=(2*(1+MartFiltr)*a+(t-b))/2/(1+MartFiltr);
      BorderBot[Shift]=(2*(1+MartFiltr)*a-(t-b))/2/(1+MartFiltr);
      Mart[Shift]=(2*(2+MartFiltr)*a-(t+b))/2/(1+MartFiltr);
      Width[Shift]=BorderTop[Shift]-BorderBot[Shift];
      Mood[Shift]=2.0*(Mart[Shift]-BorderBot[Shift])/
                   (BorderTop[Shift]-BorderBot[Shift])-1.0;
   return;
}
//---------------------------------------------------------------------

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 ---