//+------------------------------------------------------------------+ //| ProjectName | //| Copyright 2018, CompanyName | //| http://www.companyname.net | //+------------------------------------------------------------------+ #property indicator_separate_window #property indicator_minimum -1.0 #property indicator_maximum 1.0 #property indicator_levelstyle 0 #property indicator_buffers 5 #property indicator_color1 clrDimGray #property indicator_color2 clrRed #property indicator_color3 clrRed #property indicator_color4 clrBlue #property indicator_color5 clrBlue extern string time_frame = "Current time frame"; extern int period_rsi = 5; extern int rsi_applied_price = PRICE_CLOSE; extern int period_ma = 21; extern int ma_price_mode = MODE_EMA; double Gd_100 = 0.0; double Gd_108 = 0.0; double Gd_116 = -0.0; bool Gi_124 = false; double G_ibuf_128[]; double G_ibuf_132[]; double G_ibuf_136[]; double G_ibuf_140[]; double G_ibuf_144[]; double G_ibuf_148[]; double G_ibuf_152[]; double G_ibuf_156[]; string Gs_160; bool G_bool_168; bool G_bool_172; int G_timeframe_176; string Gsa_180[] = {"M1", "M5", "M15", "M30", "H1", "H4", "D1", "W1", "MN"}; int Gia_184[] = {1, 5, 15, 30, 60, 240, 1440, 10080, 43200}; //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ int init() { IndicatorBuffers(8); SetIndexBuffer(0, G_ibuf_144); Gs_160 = WindowExpertName(); G_bool_168 = time_frame == "returnBars"; if(G_bool_168) return (0); G_bool_172 = time_frame == "calculateValue"; if(G_bool_172) { SetIndexBuffer(1, G_ibuf_156); SetIndexBuffer(2, G_ibuf_136); SetIndexBuffer(3, G_ibuf_140); SetIndexBuffer(4, G_ibuf_128); SetIndexBuffer(5, G_ibuf_132); SetIndexBuffer(6, G_ibuf_148); SetIndexBuffer(7, G_ibuf_152); return (0); } SetIndexBuffer(1, G_ibuf_136); SetIndexBuffer(2, G_ibuf_140); SetIndexBuffer(3, G_ibuf_128); SetIndexBuffer(4, G_ibuf_132); SetIndexBuffer(5, G_ibuf_148); SetIndexBuffer(6, G_ibuf_152); SetIndexBuffer(7, G_ibuf_156); SetLevelValue(0, Gd_100); SetLevelValue(1, Gd_108); SetLevelValue(2, Gd_116); G_timeframe_176 = f0_3(time_frame); IndicatorShortName(f0_0(G_timeframe_176) + "Touchline"); SetIndexLabel(0, NULL); SetIndexLabel(1, NULL); SetIndexLabel(2, NULL); SetIndexLabel(3, NULL); SetIndexLabel(4, NULL); return (0); } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ int deinit() { return (0); } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ int start() { int shift_12; int datetime_16; double Ld_24; int Li_8 = IndicatorCounted(); if(Li_8 < 0) return (-1); if(Li_8 > 0) Li_8--; int Li_0 = MathMax(Bars - Li_8, Bars - 1); if(G_bool_168) { G_ibuf_144[0] = Li_0 + 1; return (0); } if(G_bool_172 || G_timeframe_176 == Period()) { if(!G_bool_172) if(G_ibuf_156[Li_0] == 1.0) f0_1(Li_0, G_ibuf_128, G_ibuf_132); if(!G_bool_172) if(G_ibuf_156[Li_0] == -1.0) f0_1(Li_0, G_ibuf_136, G_ibuf_140); for(int Li_4 = Li_0; Li_4 >= 0; Li_4--) G_ibuf_148[Li_4] = (iRSI(NULL, 0, period_rsi, rsi_applied_price, Li_4) - 50.0) / 10.0; for(Li_4 = Li_0; Li_4 >= 0; Li_4--) { G_ibuf_152[Li_4] = iMAOnArray(G_ibuf_148, 0, period_ma, 0, ma_price_mode, Li_4); G_ibuf_144[Li_4] = (MathExp(2.0 * G_ibuf_152[Li_4]) - 1.0) / (MathExp(2.0 * G_ibuf_152[Li_4]) + 1.0); G_ibuf_156[Li_4] = G_ibuf_156[Li_4 + 1]; if(G_ibuf_144[Li_4] < Gd_100 && G_ibuf_144[Li_4] > Gd_116) G_ibuf_156[Li_4] = 0; if(G_ibuf_144[Li_4] > Gd_100) G_ibuf_156[Li_4] = 1; if(G_ibuf_144[Li_4] < Gd_116) G_ibuf_156[Li_4] = -1; if(G_bool_172 == false) { G_ibuf_136[Li_4] = EMPTY_VALUE; G_ibuf_140[Li_4] = EMPTY_VALUE; G_ibuf_128[Li_4] = EMPTY_VALUE; G_ibuf_132[Li_4] = EMPTY_VALUE; if(G_ibuf_156[Li_4] == 1.0) f0_4(Li_4, G_ibuf_128, G_ibuf_132, G_ibuf_144); if(G_ibuf_156[Li_4] == -1.0) f0_4(Li_4, G_ibuf_136, G_ibuf_140, G_ibuf_144); } } return (0); } Li_0 = MathMax(Li_0, MathMin(Bars - 1, iCustom(NULL, G_timeframe_176, Gs_160, "returnBars", 0, 0) * G_timeframe_176 / Period())); if(G_ibuf_156[Li_0] == 1.0) f0_1(Li_0, G_ibuf_128, G_ibuf_132); if(G_ibuf_156[Li_0] == -1.0) f0_1(Li_0, G_ibuf_136, G_ibuf_140); for(Li_4 = Li_0; Li_4 >= 0; Li_4--) { shift_12 = iBarShift(NULL, G_timeframe_176, Time[Li_4]); G_ibuf_156[Li_4] = iCustom(NULL, G_timeframe_176, Gs_160, "calculateValue", period_rsi, rsi_applied_price, period_ma, ma_price_mode, Gd_100, Gd_108, Gd_116, 1, shift_12); G_ibuf_144[Li_4] = iCustom(NULL, G_timeframe_176, Gs_160, "calculateValue", period_rsi, rsi_applied_price, period_ma, ma_price_mode, Gd_100, Gd_108, Gd_116, 0, shift_12); G_ibuf_136[Li_4] = EMPTY_VALUE; G_ibuf_140[Li_4] = EMPTY_VALUE; G_ibuf_128[Li_4] = EMPTY_VALUE; G_ibuf_132[Li_4] = EMPTY_VALUE; if(G_timeframe_176 <= Period() || shift_12 == iBarShift(NULL, G_timeframe_176, Time[Li_4 - 1])) continue; if(Gi_124) { datetime_16 = iTime(NULL, G_timeframe_176, shift_12); for(int Li_20 = 1; Li_4 + Li_20 < Bars && Time[Li_4 + Li_20] >= datetime_16; Li_20++) { } Ld_24 = 1.0 / Li_20; for(int Li_32 = 1; Li_32 < Li_20; Li_32++) G_ibuf_144[Li_4 + Li_32] = Li_32 * Ld_24 * (G_ibuf_144[Li_4 + Li_20]) + (1.0 - Li_32 * Ld_24) * G_ibuf_144[Li_4]; } } for(Li_4 = Li_0; Li_4 >= 0; Li_4--) { if(G_ibuf_156[Li_4] == 1.0) f0_4(Li_4, G_ibuf_128, G_ibuf_132, G_ibuf_144); if(G_ibuf_156[Li_4] == -1.0) f0_4(Li_4, G_ibuf_136, G_ibuf_140, G_ibuf_144); } return (0); } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ void f0_1(int Ai_0, double &Ada_4[], double &Ada_8[]) { if(Ada_8[Ai_0] != EMPTY_VALUE && Ada_8[Ai_0 + 1] != EMPTY_VALUE) { Ada_8[Ai_0 + 1] = EMPTY_VALUE; return; } if(Ada_4[Ai_0] != EMPTY_VALUE && Ada_4[Ai_0 + 1] != EMPTY_VALUE && Ada_4[Ai_0 + 2] == EMPTY_VALUE) Ada_4[Ai_0 + 1] = EMPTY_VALUE; } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ void f0_4(int Ai_0, double &Ada_4[], double &Ada_8[], double &Ada_12[]) { if(Ada_4[Ai_0 + 1] == EMPTY_VALUE) { if(Ada_4[Ai_0 + 2] == EMPTY_VALUE) { Ada_4[Ai_0] = Ada_12[Ai_0]; Ada_4[Ai_0 + 1] = Ada_12[Ai_0 + 1]; Ada_8[Ai_0] = EMPTY_VALUE; return; } Ada_8[Ai_0] = Ada_12[Ai_0]; Ada_8[Ai_0 + 1] = Ada_12[Ai_0 + 1]; Ada_4[Ai_0] = EMPTY_VALUE; return; } Ada_4[Ai_0] = Ada_12[Ai_0]; Ada_8[Ai_0] = EMPTY_VALUE; } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ int f0_3(string As_0) { As_0 = f0_2(As_0); for(int Li_8 = ArraySize(Gia_184) - 1; Li_8 >= 0; Li_8--) if(As_0 == Gsa_180[Li_8] || As_0 == "" + Gia_184[Li_8]) return (MathMax(Gia_184[Li_8], Period())); return (Period()); } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ string f0_0(int Ai_0) { for(int Li_4 = ArraySize(Gia_184) - 1; Li_4 >= 0; Li_4--) if(Ai_0 == Gia_184[Li_4]) return (Gsa_180[Li_4]); return (""); } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ string f0_2(string As_0) { int Li_20; string Ls_ret_8 = As_0; for(int Li_16 = StringLen(As_0) - 1; Li_16 >= 0; Li_16--) { Li_20 = StringGetChar(Ls_ret_8, Li_16); if((Li_20 > '`' && Li_20 < '{') || (Li_20 > 'Я' && Li_20 < 256)) Ls_ret_8 = StringSetChar(Ls_ret_8, Li_16, Li_20 - 32); else if(Li_20 > -33 && Li_20 < 0) Ls_ret_8 = StringSetChar(Ls_ret_8, Li_16, Li_20 + 224); } return (Ls_ret_8); } //+------------------------------------------------------------------+