//+------------------------------------------------------------------+ //| | //| Copyright 2022, Sababa Media | //| https://sababa.media | //+------------------------------------------------------------------+ #include #property copyright "Copyright 2022, Sababa Media" #property link "https://sababa.media" #property version "1.00" #property description "TSI + ADX" #property indicator_separate_window #property indicator_buffers 10 #property indicator_plots 3 //--- plot TSI #property indicator_label1 "TSI" #property indicator_type1 DRAW_LINE #property indicator_color1 C'239, 83, 80' #property indicator_style1 STYLE_SOLID #property indicator_width1 1 //--- plot SM1 #property indicator_label2 "Короткая" #property indicator_type2 DRAW_LINE #property indicator_color2 C'38, 166, 154' #property indicator_style2 STYLE_SOLID #property indicator_width2 1 //--- input parameters input uint i_tsi_period_1 = 67; // Период 1 input uint i_tsi_period_2 = 26; // Период 2 input uint i_tsi_period_3 = 26; // Период 3 input double i_tsi_overbought = 28.0; // Перекупленность input double i_tsi_oversold = -28.0; // Перепроданность //--- indicator buffers double v_tsi_buffer_tsi[]; double v_tsi_buffer_sh[]; double v_tsi_buffer_udm[]; double v_tsi_buffer_adm[]; double v_tsi_buffer_udm1[]; double v_tsi_buffer_udm2[]; double v_tsi_buffer_adm1[]; double v_tsi_buffer_adm2[]; double v_tsi_buffer_ma[]; //--- global variables extern double g_tsi_overbought = (fabs(i_tsi_overbought) < 0.1 ? 0.1 : i_tsi_overbought > 100.0 ? 100.0 : fabs(i_tsi_overbought));; extern double g_tsi_oversold = (-fabs(i_tsi_oversold) > -0.1 ? -0.1 : -fabs(i_tsi_oversold) < -100.0 ? -100.0 : -fabs(i_tsi_oversold)); extern int g_tsi_period_sm_1 = int(i_tsi_period_1 < 2 ? 2 : i_tsi_period_1); extern int g_tsi_period_sm_2 = int(i_tsi_period_2 < 2 ? 2 : i_tsi_period_2); int g_tsi_period_sm_3 = int(i_tsi_period_3 < 2 ? 2 : i_tsi_period_3);; int g_tsi_handle_ma = iMA(NULL, PERIOD_CURRENT, 1, 0, MODE_SMA, PRICE_CLOSE);; int OnInit() { //--- indicator buffers mapping SetIndexBuffer(0, v_tsi_buffer_tsi, INDICATOR_DATA); SetIndexBuffer(1, v_tsi_buffer_sh, INDICATOR_DATA); SetIndexBuffer(3, v_tsi_buffer_udm, INDICATOR_CALCULATIONS); SetIndexBuffer(4, v_tsi_buffer_udm1, INDICATOR_CALCULATIONS); SetIndexBuffer(5, v_tsi_buffer_udm2, INDICATOR_CALCULATIONS); SetIndexBuffer(6, v_tsi_buffer_adm, INDICATOR_CALCULATIONS); SetIndexBuffer(7, v_tsi_buffer_adm1, INDICATOR_CALCULATIONS); SetIndexBuffer(8, v_tsi_buffer_adm2, INDICATOR_CALCULATIONS); SetIndexBuffer(9, v_tsi_buffer_ma, INDICATOR_CALCULATIONS); IndicatorSetString(INDICATOR_SHORTNAME, "Makar Miner Indicator"); //--- setting indicator parameters IndicatorSetString(INDICATOR_SHORTNAME, "Makar Miner Indicator (" + (string) 1 + ", " + (string)g_tsi_period_sm_1 + ", " + (string)g_tsi_period_sm_2 + ", " + (string)g_tsi_period_sm_3 + ")"); IndicatorSetInteger(INDICATOR_DIGITS, Digits()); IndicatorSetInteger(INDICATOR_LEVELS, 2); IndicatorSetDouble(INDICATOR_LEVELVALUE, 0, g_tsi_overbought); IndicatorSetDouble(INDICATOR_LEVELVALUE, 1, g_tsi_oversold); IndicatorSetString(INDICATOR_LEVELTEXT, 0, "TSI Перекуплен"); IndicatorSetString(INDICATOR_LEVELTEXT, 1, "TSI Перепродан"); IndicatorSetInteger(INDICATOR_LEVELCOLOR, 0, C'113,41,41'); IndicatorSetInteger(INDICATOR_LEVELCOLOR, 1, C'113,41,41'); //--- setting buffer arrays as timeseries ArraySetAsSeries(v_tsi_buffer_tsi, true); ArraySetAsSeries(v_tsi_buffer_udm, true); ArraySetAsSeries(v_tsi_buffer_udm2, true); ArraySetAsSeries(v_tsi_buffer_adm, true); ArraySetAsSeries(v_tsi_buffer_adm2, true); ArraySetAsSeries(v_tsi_buffer_ma, true); return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ //| Custom indicator iteration function | //+------------------------------------------------------------------+ int OnCalculate(const int v_tsi_rates_total, const int v_tsi_prev_calculated, const datetime &time[], const double &open[], const double &high[], const double &low[], const double &close[], const long &tick_volume[], const long &volume[], const int &spread[]) { if(v_tsi_rates_total < 2) return 0; int v_tsi_limit = v_tsi_rates_total - v_tsi_prev_calculated; if(v_tsi_limit > 1) { v_tsi_limit = v_tsi_rates_total - 1 - 2; ArrayInitialize(v_tsi_buffer_tsi, 0); ArrayInitialize(v_tsi_buffer_udm, 0); ArrayInitialize(v_tsi_buffer_udm1, 0); ArrayInitialize(v_tsi_buffer_udm2, 0); ArrayInitialize(v_tsi_buffer_adm, 0); ArrayInitialize(v_tsi_buffer_adm1, 0); ArrayInitialize(v_tsi_buffer_adm2, 0); ArrayInitialize(v_tsi_buffer_ma, 0); } int v_tsi_count = (v_tsi_limit > 1 ? v_tsi_rates_total : 1); int v_tsi_copied = CopyBuffer(g_tsi_handle_ma, 0, 0, v_tsi_count, v_tsi_buffer_ma); if(v_tsi_copied != v_tsi_count) return 0; for(int i = v_tsi_limit; i >= 0 && !IsStopped(); i--) { v_tsi_buffer_udm[i] = v_tsi_buffer_ma[i] - v_tsi_buffer_ma[i + 1]; v_tsi_buffer_adm[i] = fabs(v_tsi_buffer_udm[i]); } if(ExponentialMAOnBuffer(v_tsi_rates_total, v_tsi_prev_calculated, 1, g_tsi_period_sm_1, v_tsi_buffer_udm, v_tsi_buffer_udm1) == 0) return 0; if(ExponentialMAOnBuffer(v_tsi_rates_total, v_tsi_prev_calculated, 1, g_tsi_period_sm_1, v_tsi_buffer_adm, v_tsi_buffer_adm1) == 0) return 0; if(ExponentialMAOnBuffer(v_tsi_rates_total, v_tsi_prev_calculated, g_tsi_period_sm_1, g_tsi_period_sm_2, v_tsi_buffer_udm1, v_tsi_buffer_udm2) == 0) return 0; if(ExponentialMAOnBuffer(v_tsi_rates_total, v_tsi_prev_calculated, g_tsi_period_sm_1, g_tsi_period_sm_2, v_tsi_buffer_adm1, v_tsi_buffer_adm2) == 0) return 0; //--- Расчёт индикатора for(int i = v_tsi_limit; i >= 0 && !IsStopped(); i--) v_tsi_buffer_tsi[i] = (v_tsi_buffer_adm2[i] != 0 ? 100.0 * v_tsi_buffer_udm2[i] / v_tsi_buffer_adm2[i] : 0); if(SimpleMAOnBuffer(v_tsi_rates_total, v_tsi_prev_calculated, 0, g_tsi_period_sm_3, v_tsi_buffer_tsi, v_tsi_buffer_sh) == 0) return 0; return(v_tsi_rates_total); }