#property copyright "Eugene Labunsky / http://www.trendmedium.com/tmt4/" #property link "http://www.trendmedium.com/tmt4/" #property indicator_chart_window extern int MainFilterSpeed = 8; extern int MainFilterSlow = 16; extern int SmallFilterSpeed = 3; extern int SmallFilterSlow = 12; double MainFiltersMultipleFactor = 1.0; double SmallFiltersMultipleFactor = 1.0; extern bool SmallArrow = true; int SlowFilterOffset = 0; double emaBuffer[999]; double emaRes[999]; double getAbsEMACO(int period, int shift) { if (iMA(NULL, 0, 1, 0, MODE_SMA, PRICE_CLOSE, shift + period + 1) == 0) return (0); else { int i = 0; for (i = 0; i < period; i++) { emaBuffer[period - 1-i] = MathAbs(iMA(NULL, 0, 1, 0, MODE_SMA, PRICE_CLOSE, shift + i) - iMA(NULL, 0, 1, 0, MODE_SMA, PRICE_OPEN, shift + i)); } double pr = 2.0 / (period + 1); emaRes[0] = emaBuffer[0]; for (i = 1; i < period; i++) { emaRes[i] = emaBuffer[i] *pr + emaRes[i - 1]*(1-pr); } return (emaRes[period - 1]); } } double getEMACO(int period, int shift) { if (iMA(NULL, 0, 1, 0, MODE_SMA, PRICE_CLOSE, shift + period + 1) == 0) return (0); else { int i = 0; for (i = 0; i < period; i++) { emaBuffer[period - 1-i] = (iMA(NULL, 0, 1, 0, MODE_SMA, PRICE_CLOSE, shift + i) - iMA(NULL, 0, 1, 0, MODE_SMA, PRICE_OPEN, shift + i)); } double pr = 2.0 / (period + 1); emaRes[0] = emaBuffer[0]; for (i = 1; i < period; i++) { emaRes[i] = emaBuffer[i] *pr + emaRes[i - 1]*(1-pr); } return (emaRes[period - 1]); } } //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ int init() { string short_name = "ELabunskyVolaPresser"; IndicatorShortName(short_name); SetIndexLabel(0, short_name); ObjectsDeleteAll(); } int start() { int countedBars = IndicatorCounted(); if (countedBars < 0) { countedBars = 0; ObjectsDeleteAll(); } else countedBars--; int limit = Bars - countedBars; double ShiftY = MathAbs(High[Bars - 1] - Low[WindowFirstVisibleBar()]); for (int i = 0; i < limit; i++) { int signal = 0; string objName = "ELA_" + Symbol() + "-" + Period() + "-" + Time[i]; if (ObjectFind(objName) >= 0) ObjectDelete(objName); int currOffSet = i; if (getAbsEMACO(MainFilterSpeed, currOffSet) > getAbsEMACO(MainFilterSlow, currOffSet + SlowFilterOffset)) { double _smallFilterSpeed = getEMACO(SmallFilterSpeed, currOffSet); double _SmallFilterSlow = getAbsEMACO(SmallFilterSlow, currOffSet); if (_smallFilterSpeed > _SmallFilterSlow *SmallFiltersMultipleFactor) signal = 1; else if (_smallFilterSpeed < - _SmallFilterSlow * SmallFiltersMultipleFactor) signal = - 1; } if (signal == 1) { if (!SmallArrow) { ObjectCreate(objName, OBJ_ARROW, 0, Time[i], Low[i]); //ObjectSet(objName,OBJPROP_ARROWCODE,SYMBOL_ARROWDOWN); ObjectSet(objName, OBJPROP_ARROWCODE, 233); ObjectSet(objName, OBJPROP_WIDTH, 1); ObjectSet(objName, OBJPROP_COLOR, Green); } else { ObjectCreate(objName, OBJ_ARROW, 0, Time[i], Low[i]); ObjectSet(objName, OBJPROP_ARROWCODE, 1); ObjectSet(objName, OBJPROP_WIDTH, 1); ObjectSet(objName, OBJPROP_COLOR, Green); } } if (signal == - 1) { if (!SmallArrow) { ObjectCreate(objName, OBJ_ARROW, 0, Time[i], High[i] + ShiftY / 100); //ObjectSet(objName,OBJPROP_ARROWCODE,SYMBOL_ARROWDOWN); ObjectSet(objName, OBJPROP_ARROWCODE, 234); ObjectSet(objName, OBJPROP_WIDTH, 1); ObjectSet(objName, OBJPROP_COLOR, Red); } else { ObjectCreate(objName, OBJ_ARROW, 0, Time[i], High[i]); ObjectSet(objName, OBJPROP_ARROWCODE, 2); ObjectSet(objName, OBJPROP_WIDTH, 1); ObjectSet(objName, OBJPROP_COLOR, Red); } } } return (0); } int deinit() { ObjectsDeleteAll(); return (0); }