//+-------------------------------------------------------------------------------------+ //| EldersImpulse.mq4 | //| Scriptong | //| scriptong@mail.ru | //+-------------------------------------------------------------------------------------+ #property copyright "Scriptong" #property link "scriptong@mail.ru" #property indicator_chart_window #property indicator_buffers 4 #property indicator_color1 Red #property indicator_color2 Aqua #property indicator_color3 Red #property indicator_color4 Aqua #property indicator_width1 1 #property indicator_width2 1 #property indicator_width3 3 #property indicator_width4 3 extern string A1 = "Периоды быстрой, медленной и сигнальной линий MACD"; extern int FastMACD = 12; extern int SlowMACD = 26; extern int SignalMACD = 9; extern string A2 = "==============================================="; extern string A3 = "Период, метод и цена применения средней скользящей"; extern int MAPeriod = 13; extern int MAMethod = MODE_EMA; extern int MAPrice = PRICE_CLOSE; extern string A4 = "==============================================="; extern string A4_1 = "Включить дополнительные условия (Большой ТФ и сигнальную МАСД)"; extern bool AddCondition = False; extern string A5 = "\"Большой\" таймфрейм для определения тренда"; extern int LargeTF = 1440; extern string A6 = "==============================================="; extern string A7 = "Период, метод и цена применения средней скользящей большего ТФ"; extern int MALPeriod = 26; extern int MALMethod = MODE_EMA; extern int MALPrice = PRICE_CLOSE; extern string A8 = "==============================================="; //---- buffers double ExtMapBuffer1[]; double ExtMapBuffer2[]; double ExtMapBuffer3[]; double ExtMapBuffer4[]; bool Activate; //+-------------------------------------------------------------------------------------+ //| Custom indicator initialization function | //+-------------------------------------------------------------------------------------+ int init() { Activate = False; // - 1 - === Закрепление массивов за буферами индикатора и определение стилей =========== SetIndexStyle(0,DRAW_HISTOGRAM, 0, 1); SetIndexBuffer(0, ExtMapBuffer1); SetIndexStyle(1,DRAW_HISTOGRAM, 0, 1); SetIndexBuffer(1, ExtMapBuffer2); SetIndexStyle(2,DRAW_HISTOGRAM, 0, 3); SetIndexBuffer(2, ExtMapBuffer3); SetIndexStyle(3,DRAW_HISTOGRAM, 0, 3); SetIndexBuffer(3, ExtMapBuffer4); // - 1 - =========================== Окончание блока ==================================== // - 2 - ================= Проверка корректности входных параметров ===================== if (FastMACD < 1) { Comment("Период FastMACD должен быть больше нуля! Советник отключен!"); Print("Период FastMACD должен быть больше нуля! Советник отключен!"); return(0); } if (SignalMACD < 1) { Comment("Период SignalMACD должен быть больше нуля! Советник отключен!"); Print("Период SignalMACD должен быть больше нуля! Советник отключен!"); return(0); } if (SlowMACD < 1) { Comment("Период SlowMACD должен быть больше нуля! Советник отключен!"); Print("Период SlowMACD должен быть больше нуля! Советник отключен!"); return(0); } if (MAPeriod < 1) { Comment("Период средней должен быть больше нуля! Советник отключен!"); Print("Период средней должен быть больше нуля! Советник отключен!"); return(0); } if (MAMethod < 0 || MAMethod > 3) { Comment("Метод средней должен быть от 0 до 3! Советник отключен!"); Print("Метод средней должен быть от 0 до 3! Советник отключен!"); return(0); } if (MAPrice < 0 || MAPrice > 6) { Comment("Цена применения средней должна быть от 0 до 6! Советник отключен!"); Print("Цена применения средней должна быть от 0 до 6! Советник отключен!"); return(0); } if (FastMACD >= SlowMACD) { Comment("Период FastMACD должен быть меньше SlowMACD! Советник отключен!"); Print("Период FastMACD должен быть меньше SlowMACD! Советник отключен!"); return(0); } // - 2 - =========================== Окончание блока ==================================== Activate = True; return(0); } //+-------------------------------------------------------------------------------------+ //| Custom indicator deinitialization function | //+-------------------------------------------------------------------------------------+ int deinit() { return(0); } //+-------------------------------------------------------------------------------------+ //| Custom indicator iteration function | //+-------------------------------------------------------------------------------------+ int start() { // - 1 - ========================== Можно ли индикатору работать ======================== if (!Activate) return(0); // - 1 - ============================= Окончание блока ================================== // - 2 - ======================= Достаточно ли текущей загруженной истории? ============= if(Bars <= MathMax(SlowMACD, MAPeriod)) return(0); // - 2 - ============================= Окончание блока ================================== // - 3 - ======================= Количество баров, нуждающихся в перерисовке ============ int cb = IndicatorCounted(); if (cb < 0) return(-1); if (cb > 0) cb--; int limit = Bars - cb - 1; // - 3 - ============================= Окончание блока ================================== // - 4 - ======================= Получение значений индикаторов ========================= for (int i = limit; i >= 0; i--) { double MA1 = iMA(NULL, 0, MAPeriod, 0, MAMethod, MAPrice, i); double MA2 = iMA(NULL, 0, MAPeriod, 0, MAMethod, MAPrice, i+1); double MACD1 = iMACD(NULL, 0, FastMACD, SlowMACD, SignalMACD, PRICE_CLOSE, MODE_MAIN,i); double MACD2 = iMACD(NULL, 0, FastMACD, SlowMACD, SignalMACD, PRICE_CLOSE, MODE_MAIN,i+1); if (AddCondition) { double MAL1 = iMA(NULL, LargeTF, MALPeriod, 0, MALMethod, MALPrice, i); double MAL2 = iMA(NULL, LargeTF, MALPeriod, 0, MALMethod, MALPrice, i+1); double SMACD = iMACD(NULL,0,FastMACD,SlowMACD, SignalMACD, PRICE_CLOSE, MODE_SIGNAL, i); } // - 4 - ============================= Окончание блока ================================== // - 5 - ======================= Свеча окрашивается в синий цвет ======================== if (MA1 > MA2 && MACD1 > MACD2 && (!AddCondition || (MAL1 > MAL2 && MACD1 > SMACD))) { ExtMapBuffer1[i] = Low[i]; ExtMapBuffer2[i] = High[i]; if (Open[i] < Close[i]) { ExtMapBuffer3[i] = Open[i]; ExtMapBuffer4[i] = Close[i]; } else { ExtMapBuffer4[i] = Open[i]; ExtMapBuffer3[i] = Close[i]; } } // - 5 - ============================= Окончание блока ================================== // - 6 - ===================== Свеча окрашивается в красный цвет ======================== else if (MA1 < MA2 && MACD1 < MACD2 && (!AddCondition || (MAL1 < MAL2 && MACD1 < SMACD))) { ExtMapBuffer2[i] = Low[i]; ExtMapBuffer1[i] = High[i]; if (Open[i] > Close[i]) { ExtMapBuffer3[i] = Open[i]; ExtMapBuffer4[i] = Close[i]; } else { ExtMapBuffer4[i] = Open[i]; ExtMapBuffer3[i] = Close[i]; } } // - 6 - ============================= Окончание блока ================================== // - 7 - ========================== Свеча не окрашивается =============================== else { ExtMapBuffer1[i] = EMPTY_VALUE; ExtMapBuffer2[i] = EMPTY_VALUE; ExtMapBuffer3[i] = EMPTY_VALUE; ExtMapBuffer4[i] = EMPTY_VALUE; } } // - 7 - ============================= Окончание блока ================================== return(0); } //+------------------------------------------------------------------+