//+------------------------------------------------------------------+ //| Version July 20, 2006 | //| Editing Nikolay Kositsin 15.06.2006 farria@mail.redcom.ru | //+------------------------------------------------------------------+ //+------------------------------------------------------------------+ //| NRTR.mq4 | //| Ramdass - Conversion only | //+------------------------------------------------------------------+ #property copyright "CRamdass - Conversion only" #property link "" //---- отрисовка индикатора в главном окне #property indicator_chart_window //---- количество индикаторных буфферов #property indicator_buffers 2 //---- цвета индикатора #property indicator_color1 Blue #property indicator_color2 Red //---- толщина индикаторных линий #property indicator_width1 1 #property indicator_width2 1 //---- ВХОДНЫЕ ПАРАМЕТРЫ ИНДИКАТОРА extern int AveragePeriod = 10; //---- индикаторные буфферы double Ind_Buffer1[]; double Ind_Buffer2[]; //+------------------------------------------------------------------+ //| NRTR initialization function | //+------------------------------------------------------------------+ int init() { //---- 2 индикаторных буффера использованы для счёта SetIndexBuffer(0, Ind_Buffer1); SetIndexBuffer(1, Ind_Buffer2); //---- Стиль исполнения графика SetIndexStyle(0, DRAW_ARROW); SetIndexStyle(1, DRAW_ARROW); SetIndexArrow(0, 159); SetIndexArrow(1, 159); //---- установка значений индикатора, которые не будут видимы на графике SetIndexEmptyValue(0, 0.0); SetIndexEmptyValue(1, 0.0); //---- имя для окон данных и лэйба для субъокон SetIndexLabel(0, "NRTRUp(" + AveragePeriod + ")"); SetIndexLabel(1, "NRTRDown(" + AveragePeriod + ")"); //---- установка номера бара, начиная с которого будет отрисовываться индикатор SetIndexDrawBegin(0,AveragePeriod); SetIndexDrawBegin(1,AveragePeriod); //---- Установка формата точности (количество знаков после десятичной точки) // для визуализации значений индикатора IndicatorDigits(Digits); //---- завершение инициализации return(0); } //+------------------------------------------------------------------+ //| NRTR | //+------------------------------------------------------------------+ int start() { //---- проверка количества баров на достаточность для расчёта if(Bars <= AveragePeriod) return(0); //---- введение переменных памяти static double PRICE,RESALT; static bool TREND; static int time2; //----+ Введение переменных с плавающей точкой double Resalt, close, open, dK, AvgRange, price, NewVel; //---- введение логических переменных bool trend; //----+ Введение целых переменных и получение уже подсчитанных баров int bar, MaxBar, limit, counted_bars = IndicatorCounted(); //---- проверка на возможные ошибки if(counted_bars < 0) return(-1); //---- последний подсчитанный бар должен быть пересчитан if(counted_bars > 0) counted_bars--; //---- определение номера самого старого бара, начиная с которого будет // произведён полный пересчёт всех баров MaxBar = Bars - 1 - AveragePeriod; //---- определение номера самого старого бара, начиная с которого будет // произедён пересчёт только новых баров limit = Bars - 1 - counted_bars; //+--- восстановление значений переменных int Tnew = Time[limit + 1]; if(limit < MaxBar) if(Tnew == time2) { price = PRICE; trend = TREND; Resalt = RESALT; } else { if(Tnew > time2) Print("ERROR01"); else Print("ERROR02"); return(-1); } //---- инициализация нуля if(limit >= MaxBar) { for(int iii = 0; iii < AveragePeriod; iii++) { Ind_Buffer1[MaxBar-iii] = 0.0; Ind_Buffer2[MaxBar-iii] = 0.0; limit = MaxBar - AveragePeriod; } //---- AvgRange = 0; for(int jjj = AveragePeriod - 1; jjj >= 0; jjj--) AvgRange += MathAbs(High[MaxBar+jjj] - Low[MaxBar+jjj]); dK = AvgRange / (AveragePeriod*10000*Point ); close = Close[MaxBar]; open = Open [MaxBar]; price = close; //---- if(close > open) { Resalt = close * (1 - dK); trend = true; } //---- if(close < open) { Resalt = close * (1 + dK); trend = false; } if(trend) Ind_Buffer1[MaxBar] = Resalt; if(!trend) Ind_Buffer2[MaxBar] = Resalt; } //----+ основной цикл расчёта индиатора bar = limit; while(bar >= 0) { //+--- Сохранение значений переменных if(bar == 1) if(((limit == 1) && (time2 == Time[2])) || (limit > 1)) { time2 = Time[2]; PRICE = price; TREND = trend; RESALT = Resalt; } //+---+==========================================+ AvgRange = 0; for(int kkk = AveragePeriod-1; kkk >= 0; kkk--) AvgRange += MathAbs(High[bar+kkk] - Low[bar+kkk]); dK = AvgRange / (AveragePeriod*10000*Point ); close = Close[bar]; Ind_Buffer1[bar] = 0; Ind_Buffer2[bar] = 0; //---- if(trend) { if(close > price) { price = close; NewVel = close * (1 - dK); if(NewVel > Resalt) Resalt=NewVel; } else if(close < Resalt) { price = close; Resalt = close * (1 + dK); trend = false; } } //---- if(!trend) { if(close < price) { price = close; NewVel = close * (1 + dK); if(NewVel < Resalt) Resalt=NewVel; } else if(close > Resalt) { price = close; Resalt = close * (1 - dK); trend = true; } } //---- if(trend) Ind_Buffer1[bar] = Resalt; if(!trend) Ind_Buffer2[bar] = Resalt; bar--; } //----+ завершение основного цикла return(0); } //+---------------------------------------------------------------------------------------------------------------------------+