//+------------------------------------------------------------------+ //| Speed_MA_V2/2.mq4 | //|Что нового: | //| V2/2 от 12.03.2010 добавлено: | //| - настройка периода усреднения суммы, отображается | //| дополнительной линией | //| V2/1 от 11.03.2010 добавлено: | //| - возможность отключения визуализации линий | //| V2 от 09.03.2010 добавлено: | //| - настройка метода усреднения МА и точки бара для расчёта, | //| - отображение значений скоростей в окне индикатора. | //| - возможность позиционирования отображаемой информации по оси X.| //| - определять участок поиска максимального значения | //| valenok2003@mail.ru | //| ICQ 365919666 | //| Пишу на заказ, цена договорная.| //| http://www.mebel-for-you.com | //+------------------------------------------------------------------+ //Определяет скорости MA в процентах Вычисляет их суммарное значение. //За 100% принимается максимальное изменение MA между двумя соседними барами //найденное на участке графика длинной в 500 бар. #property copyright "valenok2003@mail.ru" #property link "http://www.mebel-for-you.com" #property indicator_separate_window //#property indicator_minimum -150 //#property indicator_maximum 150 #property indicator_buffers 6 // Количество буферов #property indicator_color1 Red #property indicator_color2 Gray #property indicator_color3 Yellow #property indicator_color4 LimeGreen #property indicator_color5 DodgerBlue #property indicator_color6 Gray extern int Period_MA5 = 5; extern int Period_MA15 = 15; extern int Period_MA60 = 60; extern string MA_method = "SMA"; extern string MA_price = "CLOSE"; extern int Period_Average = 5; extern int tf = 0; extern string Rem_0 = "-период усреднения суммы-"; extern string Rem_1 = "-видимость кривых-"; extern bool Viz_05 = true; extern bool Viz_15 = true; extern bool Viz_60 = true; extern bool Viz_Sum = true; extern bool Viz_Average = true; extern string Rem_2 = "Участок поиска максимума (бар)"; extern int search_Max = 500; extern string Rem_3 = "--Смещ. текста по оси Х--"; extern int shift_txt = 920; int method; int price; // цвет названия должен соответствовать цвету кривой extern color Color_Txt_Comment = Gray, Color_Txt_MA5 = Yellow, Color_Txt_MA15 = LimeGreen, Color_Txt_MA60 = DodgerBlue, Color_Txt_Sum = Gray, Color_Txt_Average = Red, Color_Txt_UP = Lime, Color_Txt_DOWN = Red; color color_txt; //---- buffers double Sum_Average[], Sum_Speed[], Speed_MA5[], Speed_MA15[], Speed_MA60[], Nul_Line[]; //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ int init() { //---- name for indicator window string name_window="Speed_MA_V2"; IndicatorShortName(name_window); //---- indicators - предусмотрена возможность отключения линий if(Viz_Average == true) SetIndexStyle(0,DRAW_LINE,STYLE_SOLID,2); else SetIndexStyle(0,DRAW_NONE); SetIndexBuffer(0,Sum_Average); if(Viz_Sum == true) SetIndexStyle(1,DRAW_LINE,STYLE_SOLID,2); else SetIndexStyle(1,DRAW_NONE); SetIndexBuffer(1,Sum_Speed); if(Viz_05 == true) SetIndexStyle(2,DRAW_LINE); else SetIndexStyle(2,DRAW_NONE); SetIndexBuffer(2,Speed_MA5); if(Viz_15 == true) SetIndexStyle(3,DRAW_LINE); else SetIndexStyle(3,DRAW_NONE); SetIndexBuffer(3,Speed_MA15); if(Viz_60 == true) SetIndexStyle(4,DRAW_LINE); else SetIndexStyle(4,DRAW_NONE); SetIndexBuffer(4,Speed_MA60); SetIndexStyle(5,DRAW_LINE); SetIndexBuffer(5,Nul_Line); //---- return(0); } //+------------------------------------------------------------------+ //| Custom indicator deinitialization function | //+------------------------------------------------------------------+ int deinit() { //---- //---- return(0); } //+------------------------------------------------------------------+ //| Custom indicator iteration function | //+------------------------------------------------------------------+ int start() { int X; int met = 0; if(MA_method == "SMA") { method = MODE_SMA; met = 1;} if(MA_method == "EMA") { method = MODE_EMA; met = 1;} if(MA_method == "SMMA"){ method = MODE_SMMA; met = 1;} if(MA_method == "LWMA"){ method = MODE_LWMA; met = 1;} if(met == 0) { Alert("Сообщение от индикатора 00_Speed_MA:", "\nЗначение ", MA_method," ошибочно. Установлено значение по умолчанию - SMA", "\nВерные значения - SMA, EMA, SMMA, LWMA" ); method = MODE_SMA; MA_method = "SMA"; } int prc = 0; if(MA_price == "CLOSE"){ price = PRICE_CLOSE; prc = 1;} if(MA_price == "OPEN") { price = PRICE_OPEN; prc = 1;} if(MA_price == "HIGH") { price = PRICE_HIGH; prc = 1;} if(MA_price == "LOW") { price = PRICE_LOW; prc = 1;} if(MA_price == "MED") { price = PRICE_MEDIAN; prc = 1;} if(MA_price == "TYP") { price = PRICE_TYPICAL; prc = 1;} if(MA_price == "WEI") { price = PRICE_WEIGHTED; prc = 1;} if(prc == 0) { Alert("Сообщение от индикатора 00_Speed_MA:", "\nЗначение ", MA_price," ошибочно. Установлено значение по умолчанию - CLOSE", "\nВерные значения - CLOSE, OPEN, HIGH, LOW, MED, TYP,WEI"); price = PRICE_CLOSE; MA_price = "CLOSE"; } //- ИЩЕМ МАКСИМАЛЬНОЕ ИЗМЕНЕНИЕ _М_А ЗА 1 БАР ------------------------ //--- (принимаем это значение за 100 процентов)----------------------- int i; double MA_0, MA_1, Dif_MA5 = 0, Max_MA5 = 0, Dif_MA15 = 0, Max_MA15 = 0, Dif_MA60 = 0, Max_MA60 = 0; i = 0; while(i < search_Max) { // Для MA5 MA_0 = iMA(NULL,tf,Period_MA5,0,method,price,i); MA_1 = iMA(NULL,tf,Period_MA5,0,method,price,i+1); Dif_MA5 = MA_0 - MA_1; if(Max_MA5 < Dif_MA5) Max_MA5 = Dif_MA5; // Для MA15 MA_0 = iMA(NULL,tf,Period_MA15,0,method,price,i); MA_1 = iMA(NULL,tf,Period_MA15,0,method,price,i+1); Dif_MA15 = MA_0 - MA_1; if(Max_MA15 < Dif_MA15) Max_MA15 = Dif_MA15; // Для MA60 MA_0 = iMA(NULL,tf,Period_MA60,0,method,price,i); MA_1 = iMA(NULL,tf,Period_MA60,0,method,price,i+1); Dif_MA60 = MA_0 - MA_1; if(Max_MA60 < Dif_MA60) Max_MA60 = Dif_MA60; i++; // Расчёт индекса следующего бара } //-------------------------------------------------------------------- //-------------строим кривые изменения скорости МА в процентах-------- int Counted_bars=IndicatorCounted(); // Количество просчитанных баров i=Bars-Counted_bars-1; // Индекс первого непосчитанного while(i>=0) { // Для MA5 MA_0 = iMA(NULL,tf,Period_MA5,0,method,price,i); MA_1 = iMA(NULL,tf,Period_MA5,0,method,price,i+1); Speed_MA5[i] = ((MA_0 - MA_1)/(0.01*Max_MA5)); //Для MA15 MA_0 = iMA(NULL,tf,Period_MA15,0,method,price,i); MA_1 = iMA(NULL,tf,Period_MA15,0,method,price,i+1); Speed_MA15[i] = ((MA_0 - MA_1)/(0.01*Max_MA15)); //Для MA60 MA_0 = iMA(NULL,tf,Period_MA60,0,method,price,i); MA_1 = iMA(NULL,tf,Period_MA60,0,method,price,i+1); Speed_MA60[i] = ((MA_0 - MA_1)/(0.01*Max_MA60)); // Для суммы быстрой и медленной МА Sum_Speed[i] = (Speed_MA5[i] + Speed_MA15[i] + Speed_MA60[i])/3; // усредняем сумму double Tmp_Sum = 0; for(int n=0; n < Period_Average; n++) { Tmp_Sum = Tmp_Sum + Sum_Speed[i+n]; } Sum_Average[i] = Tmp_Sum/Period_Average; // Нулевая линия Nul_Line[i] = 0; i--; // Расчёт индекса следующего бара } color_txt = Color_Txt_Comment; ObjectCreate("Label", OBJ_LABEL, WindowFind("Speed_MA_V2"), 0, 0); ObjectSetText("Label",MA_method+" "+MA_price,7, "Verdana", color_txt); ObjectSet("Label", OBJPROP_CORNER, 0); ObjectSet("Label", OBJPROP_XDISTANCE, shift_txt); ObjectSet("Label", OBJPROP_YDISTANCE, 5); color_txt = Color_Txt_MA5; ObjectCreate("Speed_MA5", OBJ_LABEL, WindowFind("Speed_MA_V2"), 0, 0); ObjectSetText("Speed_MA5","MA"+Period_MA5,7, "Verdana", color_txt); ObjectSet("Speed_MA5", OBJPROP_CORNER, 0); ObjectSet("Speed_MA5", OBJPROP_XDISTANCE, shift_txt); ObjectSet("Speed_MA5", OBJPROP_YDISTANCE, 20); if(Speed_MA5[0]>0)color_txt = Color_Txt_UP; if(Speed_MA5[0]<0)color_txt = Color_Txt_DOWN; X = shift_txt + 30; ObjectCreate("Speed_MA5_value", OBJ_LABEL, WindowFind("Speed_MA_V2"), 0, 0); ObjectSetText("Speed_MA5_value"," = "+DoubleToStr(Speed_MA5[0],2),7, "Verdana", color_txt); ObjectSet("Speed_MA5_value", OBJPROP_CORNER, 0); ObjectSet("Speed_MA5_value", OBJPROP_XDISTANCE, X); ObjectSet("Speed_MA5_value", OBJPROP_YDISTANCE, 20); color_txt = Color_Txt_MA15; ObjectCreate("Speed_MA15", OBJ_LABEL, WindowFind("Speed_MA_V2"), 0, 0); ObjectSetText("Speed_MA15","MA"+Period_MA15,7, "Verdana", color_txt); ObjectSet("Speed_MA15", OBJPROP_CORNER, 0); ObjectSet("Speed_MA15", OBJPROP_XDISTANCE, shift_txt); ObjectSet("Speed_MA15", OBJPROP_YDISTANCE, 35); if(Speed_MA15[0]>0)color_txt = Color_Txt_UP; if(Speed_MA15[0]<0)color_txt = Color_Txt_DOWN; X = shift_txt + 30; ObjectCreate("Speed_MA15_value", OBJ_LABEL, WindowFind("Speed_MA_V2"), 0, 0); ObjectSetText("Speed_MA15_value"," = "+DoubleToStr(Speed_MA15[0],2),7, "Verdana", color_txt); ObjectSet("Speed_MA15_value", OBJPROP_CORNER, 0); ObjectSet("Speed_MA15_value", OBJPROP_XDISTANCE, X); ObjectSet("Speed_MA15_value", OBJPROP_YDISTANCE, 35); color_txt = Color_Txt_MA60; ObjectCreate("Speed_MA60", OBJ_LABEL, WindowFind("Speed_MA_V2"), 0, 0); ObjectSetText("Speed_MA60","MA"+Period_MA60,7, "Verdana", color_txt); ObjectSet("Speed_MA60", OBJPROP_CORNER, 0); ObjectSet("Speed_MA60", OBJPROP_XDISTANCE, shift_txt); ObjectSet("Speed_MA60", OBJPROP_YDISTANCE, 50); if(Speed_MA60[0]>0)color_txt = Color_Txt_UP; if(Speed_MA60[0]<0)color_txt = Color_Txt_DOWN; X = shift_txt + 30; ObjectCreate("Speed_MA60_value", OBJ_LABEL, WindowFind("Speed_MA_V2"), 0, 0); ObjectSetText("Speed_MA60_value"," = "+DoubleToStr(Speed_MA60[0],2),7, "Verdana", color_txt); ObjectSet("Speed_MA60_value", OBJPROP_CORNER, 0); ObjectSet("Speed_MA60_value", OBJPROP_XDISTANCE, X); ObjectSet("Speed_MA60_value", OBJPROP_YDISTANCE, 50); color_txt = Color_Txt_Sum; // цвет названия соответствует цвету кривой ObjectCreate("Sum_Speed", OBJ_LABEL, WindowFind("Speed_MA_V2"), 0, 0); ObjectSetText("Sum_Speed","Sum",7, "Verdana", color_txt); ObjectSet("Sum_Speed", OBJPROP_CORNER, 0); ObjectSet("Sum_Speed", OBJPROP_XDISTANCE, shift_txt); ObjectSet("Sum_Speed", OBJPROP_YDISTANCE, 65); if(Sum_Speed[0]>0)color_txt = Color_Txt_UP; if(Sum_Speed[0]<0)color_txt = Color_Txt_DOWN; X = shift_txt + 30; ObjectCreate("Sum_Speed_value", OBJ_LABEL, WindowFind("Speed_MA_V2"), 0, 0); ObjectSetText("Sum_Speed_value"," = "+DoubleToStr(Sum_Speed[0],2),7, "Verdana", color_txt); ObjectSet("Sum_Speed_value", OBJPROP_CORNER, 0); ObjectSet("Sum_Speed_value", OBJPROP_XDISTANCE, X); ObjectSet("Sum_Speed_value", OBJPROP_YDISTANCE, 65); color_txt = Color_Txt_Average; // цвет названия соответствует цвету кривой ObjectCreate("Sum_Average", OBJ_LABEL, WindowFind("Speed_MA_V2"), 0, 0); ObjectSetText("Sum_Average","Sum_Average",7, "Verdana", color_txt); ObjectSet("Sum_Average", OBJPROP_CORNER, 0); ObjectSet("Sum_Average", OBJPROP_XDISTANCE, shift_txt); ObjectSet("Sum_Average", OBJPROP_YDISTANCE, 80); if(Sum_Average[0]>0)color_txt = Color_Txt_UP; if(Sum_Average[0]<0)color_txt = Color_Txt_DOWN; X = shift_txt + 20; ObjectCreate("Sum_Average_value", OBJ_LABEL, WindowFind("Speed_MA_V2"), 0, 0); ObjectSetText("Sum_Average_value",DoubleToStr(Sum_Average[0],2),7, "Verdana", color_txt); ObjectSet("Sum_Average_value", OBJPROP_CORNER, 0); ObjectSet("Sum_Average_value", OBJPROP_XDISTANCE, X); ObjectSet("Sum_Average_value", OBJPROP_YDISTANCE, 95); color_txt = Color_Txt_Comment; ObjectCreate("Period_Average", OBJ_LABEL, WindowFind("Speed_MA_V2"), 0, 0); ObjectSetText("Period_Average","Period_Average",7, "Verdana", color_txt); ObjectSet("Period_Average", OBJPROP_CORNER, 0); ObjectSet("Period_Average", OBJPROP_XDISTANCE, shift_txt); ObjectSet("Period_Average", OBJPROP_YDISTANCE, 110); X = shift_txt + 40; ObjectCreate("Period_Average_value", OBJ_LABEL, WindowFind("Speed_MA_V2"), 0, 0); ObjectSetText("Period_Average_value",DoubleToStr(Period_Average,0),7, "Verdana", color_txt); ObjectSet("Period_Average_value", OBJPROP_CORNER, 0); ObjectSet("Period_Average_value", OBJPROP_XDISTANCE, X); ObjectSet("Period_Average_value", OBJPROP_YDISTANCE, 125); //---- return(0); }