WATR_Alert.mq4
WATR_Alert.mq4 FOREX MetaTrader4 Indicators Download
WATR_Alert.mq4 download link will appear after 20 seconds.
WATR_Alert.mq4 Programming source code.
//+------------------------------------------------------------------+ //| WATR.mq4 | //+------------------------------------------------------------------+ //---- #property indicator_chart_window #property indicator_buffers 2 #property indicator_color1 Coral #property indicator_color2 DodgerBlue //---- input parameters extern int WATR_K = 10; extern double WATR_M = 4.0; extern int ATR = 21; extern bool ALERTS = true; //---- buffers double ExtMapBufferUp[]; double ExtMapBufferDown[]; //--- datetime AlertLast = 0; //--- //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ int init() { IndicatorBuffers(2); SetIndexBuffer(0, ExtMapBufferUp); ArraySetAsSeries(ExtMapBufferUp, true); SetIndexStyle(0, DRAW_LINE, STYLE_SOLID, 2); SetIndexBuffer(1, ExtMapBufferDown); ArraySetAsSeries(ExtMapBufferDown, true); SetIndexStyle(1, DRAW_LINE, STYLE_SOLID, 2); IndicatorShortName("WATR(" + WATR_K + ", " + WATR_M + ")"); SetIndexLabel(0, "WATR_Up"); SetIndexLabel(1, "WATR_Dn"); IndicatorDigits(_Digits); return(0); } //+------------------------------------------------------------------+ //| Custom indicator deinitialization function | //+------------------------------------------------------------------+ int deinit() { //---- return(0); } //+------------------------------------------------------------------+ //| Custom indicator function | //+------------------------------------------------------------------+ bool AntiTrendBar(int i) { bool res = (TrendUp(i) && (Close[i] < Open[i])) || (!TrendUp(i) && (Close[i] > Open[i])); return(res); } //+------------------------------------------------------------------+ //| Custom indicator function | //+------------------------------------------------------------------+ double CalcIndicValue(int i, bool trend) { double res = Close[i]; if(trend) res -= (WATR_K*Point + WATR_M*iATR(NULL, 0, ATR, i)); else res += (WATR_K*Point + WATR_M*iATR(NULL, 0, ATR, i)); return(NormalizeDouble(res, _Digits)); } //+------------------------------------------------------------------+ //| Custom indicator function | //+------------------------------------------------------------------+ bool TrendUp(int i) { return((Close[i+1] > ExtMapBufferUp[i+1]) && (ExtMapBufferUp[i+1] != EMPTY_VALUE)); } //+------------------------------------------------------------------+ //| Custom indicator iteration function | //+------------------------------------------------------------------+ int start() { int limit; int counted_bars = IndicatorCounted(); //---- ÔÓÒΉÌËÈ ÔÓÒ˜ËÚ‡ÌÌ˚È ·‡ ·Û‰ÂÚ ÔÂÂÒ˜ËÚ‡Ì //---- Ô‚Ó Á̇˜ÂÌË Ë̉Ë͇ÚÓ‡ == ˆÂÌÂ-1 point, // ÚÓ ÂÒÚ¸ Ò˜ËÚ‡ÂÚ ÚẨ ‚ÓÒıÓ‰ˇ˘ËÏ ExtMapBufferUp[Bars] = Close[Bars] - WATR_K*Point; // limit = (counted_bars > 0) ? (Bars - counted_bars) : (Bars - 1); limit = Bars - counted_bars; //---- ÓÒÌÓ‚ÌÓÈ ˆËÍÎ for(int i = limit; i >= 0; i--) { if(AntiTrendBar(i)) { ExtMapBufferUp[i] = ExtMapBufferUp[i+1]; ExtMapBufferDown[i] = ExtMapBufferDown[i+1]; } else { if(TrendUp(i)) { ExtMapBufferUp[i] = CalcIndicValue(i, true); if(ExtMapBufferUp[i] < ExtMapBufferUp[i+1]) ExtMapBufferUp[i] = ExtMapBufferUp[i+1]; ExtMapBufferDown[i] = EMPTY_VALUE; } else { ExtMapBufferDown[i] = CalcIndicValue(i, false); if(ExtMapBufferDown[i] > ExtMapBufferDown[i+1]) ExtMapBufferDown[i] = ExtMapBufferDown[i+1]; ExtMapBufferUp[i] = EMPTY_VALUE; } } // ÔÂÂÒ˜ÂÌˡ Ò ˆÂÌÓÈ if(TrendUp(i) && (Close[i] < ExtMapBufferUp[i])) { ExtMapBufferDown[i] = CalcIndicValue(i, false); ExtMapBufferUp[i] = EMPTY_VALUE; } if((!TrendUp(i)) && (Close[i] > ExtMapBufferDown[i])) { ExtMapBufferUp[i] = CalcIndicValue(i, true); ExtMapBufferDown[i] = EMPTY_VALUE; } } //--- //--- if (ALERTS && AlertLast != Time[0]) { if (ExtMapBufferDown[0] != EMPTY_VALUE && NormalizeDouble(Bid, _Digits) >= NormalizeDouble(ExtMapBufferDown[0], _Digits)) { AlertLast = Time[0]; Alert("WATR > ", Symbol(), " : ", eGetPeriodString(), " > DOWN"); } if (ExtMapBufferUp[0] != EMPTY_VALUE && NormalizeDouble(Bid, _Digits) <= NormalizeDouble(ExtMapBufferUp[0], _Digits)) { AlertLast = Time[0]; Alert("WATR > ", Symbol(), " : ", eGetPeriodString(), " > UP"); } } //--- return(0); } //+------------------------------------------------------------------+ string eGetPeriodString() { string periodStr = "??"; if (_Period == PERIOD_M1) { periodStr = "M1"; } else if (_Period == PERIOD_M5) { periodStr = "M5"; } else if (_Period == PERIOD_M15) { periodStr = "M15"; } else if (_Period == PERIOD_M30) { periodStr = "M30"; } else if (_Period == PERIOD_H1) { periodStr = "H1"; } else if (_Period == PERIOD_H4) { periodStr = "H4"; } else if (_Period == PERIOD_D1) { periodStr = "D1"; } else if (_Period == PERIOD_W1) { periodStr = "W1"; } else if (_Period == PERIOD_MN1) { periodStr = "MN1"; } //--- return(periodStr); } //+------------------------------------------------------------------+