//+------------------------------------------------------------------+ //| MAOnDay.mq4 | //| Scriptong | //| scriptong@mail.ru | //+------------------------------------------------------------------+ #property copyright "Scriptong" #property link "scriptong@mail.ru" #property indicator_chart_window #property indicator_buffers 1 #property indicator_color1 Red //---- input parameters extern int MethodMA=0; extern int PriceMA=0; extern int LargeTF = 1440; bool Activate; datetime NowDay, LastDay; double Buffer[]; int Count; //---- buffers double MA[]; //+-------------------------------------------------------------------------------------+ //| Custom indicator initialization function | //+-------------------------------------------------------------------------------------+ int init() { Activate = False; // - 1 - == Проверка правильности выбранного пользователем таймфрейма =================== if (Period() >= LargeTF) { Comment("Индикатор DayAdaptiveMA работает на таймфреймах, меньших, чем D1."); return(0); } // - 1 - == Окончание блока ============================================================= // - 2 - == Инициализация индикаторного буфера ========================================== SetIndexStyle(0,DRAW_LINE); SetIndexBuffer(0, MA); SetIndexEmptyValue(0, 0); // - 2 - == Окончание блока ============================================================= // - 3 - == Инициализация буфера для подсчета среднего ================================== ArrayResize(Buffer, MathCeil(LargeTF/Period())+1); ArrayInitialize(Buffer, 0); // - 3 - == Окончание блока ============================================================= Activate = True; //---- return(0); } //+-------------------------------------------------------------------------------------+ //| Custom indicator deinitialization function | //+-------------------------------------------------------------------------------------+ int deinit() { //---- Comment(""); //---- return(0); } //+-------------------------------------------------------------------------------------+ //| Custom indicator iteration function | //+-------------------------------------------------------------------------------------+ int start() { // - 1 - == Правильно ли инициализирован индикатор? ===================================== if (!Activate) return(0); // - 1 - == Окончание блока ============================================================= int limit, counted_bars=IndicatorCounted(); limit=Bars-counted_bars; if(counted_bars==0) limit--; // - 2 - == Расчет номера бара текущего ТФ, соответствующего началу дня ================= if(counted_bars>0) counted_bars--; limit = iBarShift(Symbol(), 0, iTime(Symbol(), LargeTF, iBarShift(Symbol(), LargeTF, Time[limit]))); // - 2 - == Окончание блока ============================================================= LastDay = 1; for (int i = limit; i >= 0; i--) { // - 3 - == Если начался новый день, формируем все данные заново ======================== NowDay = iTime(Symbol(), LargeTF, iBarShift(Symbol(), LargeTF, Time[i])); if (LastDay != NowDay) { ArrayInitialize(Buffer, 0); Count = 0; LastDay = NowDay; } // - 3 - == Окончание блока ============================================================= // - 4 - == Определение цены, по которой производится расчет МА ========================= switch (PriceMA) { case 0: /*Close*/ Buffer[Count] = Close[i]; break; case 1: /*Open*/ Buffer[Count] = Open[i]; break; case 2: /*High*/ Buffer[Count] = High[i]; break; case 3: /*Low*/ Buffer[Count] = Low[i]; break; case 4: /*Median*/ Buffer[Count] = (High[i]+Low[i])/2; break; case 5: /*Typical*/ Buffer[Count] = (High[i]+Low[i]+Close[i])/3; break; case 6: /*Weighted*/ Buffer[Count] = (High[i]+Low[i]+2*Close[i])/4; break; } // - 4 - == Окончание блока ============================================================= // - 5 - == Расчет средней скользящей по данным сегодняшнего дня ======================== MA[i] = iMAOnArray(Buffer, Count+1, Count+1, 0, MethodMA, 0); Count++; // - 5 - == Окончание блока ============================================================= } return(0); }