Author: Copyright � 2005, MetaQuotes Software Corp.
aNina
Indicators Used
Moving average indicator
Miscellaneous
Implements a curve of type %1
0 Views
0 Downloads
0 Favorites
aNina
//+------------------------------------------------------------------+
//|                                                         Nina.mq4 |
//|                      Copyright © 2005, MetaQuotes Software Corp. |
//|                                        http://www.metaquotes.net |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2005, MetaQuotes Software Corp."
#property link      "http://www.metaquotes.net"

#property indicator_separate_window
#property indicator_buffers 5
#property indicator_color1 Brown
#property indicator_color2 DeepSkyBlue
#property indicator_color3 Green
#property indicator_color4 Red
#property indicator_color5 Blue
#property indicator_minimum 0
#property indicator_maximum 1
//---- input parameters
extern int PeriodWATR = 10;
extern double Kwatr = 1.0000;
extern int HighLow = 0;
extern int cbars = 1000;
extern int from  = 0;
//---- indicator buffers
double LineMinBuffer[];
double LineMidBuffer[];
double LineBuyBuffer[];
double LineSellBuffer[];
double LineExitBuffer[];
double Ma50[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
  int init()
  {
   string short_name;
   IndicatorBuffers(6);
   SetIndexBuffer(0, LineMinBuffer);
   SetIndexBuffer(1, LineMidBuffer);
   SetIndexBuffer(2, LineBuyBuffer);
   SetIndexBuffer(3, LineSellBuffer);
   SetIndexBuffer(4, LineExitBuffer);
   SetIndexBuffer(5, Ma50);
//---- indicator line
   SetIndexStyle(0, DRAW_LINE);
   SetIndexStyle(1, DRAW_LINE);
   SetIndexStyle(2, DRAW_ARROW, 0, 1);
   SetIndexStyle(3, DRAW_ARROW, 0, 1);
   SetIndexStyle(4, DRAW_ARROW, 0, 1);
   SetIndexStyle(5, DRAW_NONE);
//----
   SetIndexArrow(2, 233);
   SetIndexArrow(3, 234);
   SetIndexArrow(4, 174);
//----
   SetIndexEmptyValue(2, 0);
   SetIndexEmptyValue(3, 0);
   SetIndexEmptyValue(4, 0);
   SetIndexEmptyValue(5, 0);  
//----
   IndicatorDigits(Digits + 1);
//---- name for DataWindow and indicator subwindow label
   short_name="Nina(" + PeriodWATR + "," + Kwatr + "," + HighLow + ")";
   IndicatorShortName(short_name);
//----
   SetIndexDrawBegin(0, PeriodWATR);
   SetIndexDrawBegin(1, PeriodWATR);
//----
   return(0);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int last_ind_inv(int shift, int dir)
  {
    if(dir != 0)
      {
        for(int i = shift; i < cbars; i++)
          {
            if(dir > 0)
              {
	               if(iCustom(NULL, 0, "0_IndInverse", 2, cbars, 1, i) != 0) 
	                   return (i);
              }
            else 
                if(dir < 0)
                  {
	                   if(iCustom(NULL, 0, "0_IndInverse", 2, cbars, 2, i) != 0) 
	                       return(-i);
                  }
          }
      }
//----
    return (0);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int start()
  {
    int    i, shift, TrendMin, TrendMax, TrendMid;
    double SminMin0, SmaxMin0, SminMin1, SmaxMin1, SumRange, dK, WATR0, WATRmax, WATRmin; 
    double WATRmid;
    double SminMax0, SmaxMax0, SminMax1, SmaxMax1, SminMid0, SmaxMid0, SminMid1, SmaxMid1;
    double linemin, linemax, linemid, Stoch1, Stoch2, bsmin, bsmax;
//----
    int StepSizeMin, StepSizeMax, StepSizeMid;
    double min, max, mid, h, l, c;
//----
    int b = 0;	
    int last = 0, ma = 0;
//----
    for(shift = cbars - 1; shift >= from; shift--)
      {	
	       SumRange = 0;
	       for(i = PeriodWATR - 1; i >= from; i--)
	         { 
            dK = 1 + 1.0*(PeriodWATR - i) / PeriodWATR;
            SumRange += dK*MathAbs(High[i+shift] - Low[i+shift]);
          }
	       WATR0 = SumRange / PeriodWATR;
	       WATRmax = MathMax(WATR0, WATRmax);
	       //----
        if(shift == cbars - 1 - PeriodWATR) 
	           WATRmin = WATR0;
	       WATRmin = MathMin(WATR0, WATRmin);
	       StepSizeMin = MathRound(Kwatr*WATRmin / Point);
	       StepSizeMax = MathRound(Kwatr*WATRmax / Point);
	       StepSizeMid = MathRound(Kwatr*0.5*(WATRmax + WATRmin) / Point);
        min = Kwatr*WATRmin;
        max = Kwatr*WATRmax;
        mid = Kwatr*0.5*(WATRmax + WATRmin);
	       c = Close[shift];
	       h = High[shift];
	       l = Low[shift];
	       //----
        if(HighLow > 0)
          {
	           SmaxMin0 = l + 2*min;
	           SminMin0 = h - 2*min;
	           SmaxMax0 = l + 2*max;
	           SminMax0 = h - 2*max;
	           SmaxMid0 = l + 2*mid;
	           SminMid0 = h - 2*mid;
	           //----
            if(c > SmaxMin1) 
                TrendMin = 1; 
	           //----
            if(c < SminMin1) 
	               TrendMin = -1;
	           //----
            if(c > SmaxMax1) 
                TrendMax = 1; 
	           //----
            if(c < SminMax1) 
	               TrendMax = -1;
	           //----
            if(c > SmaxMid1) 
                TrendMid = 1; 
	           //----
            if(c < SminMid1) 
	               TrendMid = -1;
	         }
	       //----
        if(HighLow == 0)
          {
	           SmaxMin0 = c + 2*min;
	           SminMin0 = c - 2*min;
	  
	           SmaxMax0 = c + 2*max;
	           SminMax0 = c - 2*max;
	  
	           SmaxMid0 = c + 2*mid;
	           SminMid0 = c - 2*mid;
	           //----
            if(c > SmaxMin1) 
                TrendMin = 1; 
	           //----
            if(c < SminMin1) 
	               TrendMin = -1;
	           //----
            if(c > SmaxMax1) 
                TrendMax = 1; 
	           //----
            if(c < SminMax1) 
	               TrendMax = -1;
	           //----
            if(c > SmaxMid1) 
	               TrendMid = 1; 
	           //----
            if(c < SminMid1) 
	               TrendMid = -1;
	         }
	       //----
        if(TrendMin > 0 && SminMin0 < SminMin1) 
            SminMin0 = SminMin1;
	       //----
        if(TrendMin < 0 && SmaxMin0 > SmaxMin1) 
            SmaxMin0 = SmaxMin1;
	       //----
        if(TrendMax > 0 && SminMax0 < SminMax1) 
	           SminMax0 = SminMax1;
	       //----
        if(TrendMax < 0 && SmaxMax0 > SmaxMax1) 
	           SmaxMax0 = SmaxMax1;
	       //----
        if(TrendMid > 0 && SminMid0 < SminMid1) 
            SminMid0 = SminMid1;
	       //----
        if(TrendMid < 0 && SmaxMid0 > SmaxMid1)
            SmaxMid0 = SmaxMid1;
	       //----
        if(TrendMin > 0) 
            linemin = SminMin0 + min;
	       //----
        if(TrendMin < 0) 
            linemin = SmaxMin0 - min;
	       //----
        if(TrendMax > 0) 
            linemax = SminMax0 + max;
	       //----
        if(TrendMax < 0) 
            linemax = SmaxMax0 - max;
	       //----
        if(TrendMid > 0) 
            linemid = SminMid0 + mid;
	       //----
        if(TrendMid < 0) 
            linemid = SmaxMid0 - mid;
	       bsmin = linemax - max;
	       bsmax = linemax + max;
	       if((bsmax - bsmin) != 0)
	         {
	           Stoch1 = (linemin - bsmin) / (bsmax - bsmin);
	           Stoch2 = (linemid - bsmin) / (bsmax - bsmin);
	           LineMinBuffer[shift] = Stoch1;
	           LineMidBuffer[shift] = Stoch2;
	         }
	       SminMin1 = SminMin0;
	       SmaxMin1 = SmaxMin0;
	       SminMax1 = SminMax0;
	       SmaxMax1 = SmaxMax0;
	       SminMid1 = SminMid0;
	       SmaxMid1 = SmaxMid0;
	       //----
        if((LineMinBuffer[shift] - LineMidBuffer[shift])*(LineMinBuffer[shift+1] - 
           LineMidBuffer[shift+1]) < 0)
          {
	           LineExitBuffer[shift] = LineMidBuffer[shift];
	           // BUY or SELL
            if(LineMinBuffer[shift] > LineMidBuffer[shift])
              {
                last = shift;
              }
            else 
                if(LineMinBuffer[shift] < LineMidBuffer[shift])
                  {
                    last = -shift;
                  } 
	         }
	       //----
        if(last != 0 && Ma50[shift+1] != 0)
	         {
	           if(last > 0 && ma > 0 && last_ind_inv(shift, 1) > 0) 
	             LineBuyBuffer[shift] = LineMidBuffer[shift];
	           else 
	               if(last < 0 && ma < 0 && last_ind_inv(shift, -1) < 0) 
	                   LineSellBuffer[shift] = LineMidBuffer[shift];
	         }
	       Ma50[shift] = iMA(NULL, 0, 50, 0, MODE_EMA, PRICE_MEDIAN, shift);
	       //----
        if(Ma50[shift] >= MathMax(Close[shift], Open[shift]) - 2.5*Point || 
	          Ma50[shift] <= MathMin(Close[shift], Open[shift]) + 2.5*Point) 
	           Ma50[shift] = 0;
	       else
	         {
	           if(Close[shift] > Open[shift])
	             {
	               ma = shift;
	             }
	           else 
	               if(Close[shift] < Open[shift])
	                 {
	                   ma = -shift;
	                 }
	         }
	     }
	   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 ---