//+------------------------------------------------------------------+ //| Speed_MA_V3.mq4 | //|Что нового: | //| V3 от 15.04.2010 добавлено: | //| - возможность отображения суммы в виде гистограммы | //| - проверка значений параметров МА вводимых пользователем | //| V2.2 от 12.03.2010 добавлено: | //| - настройка периода сглаживания суммы (отображается красной | //| линией) | //| V2.1 от 11.03.2010 добавлено: | //| - возможность отключения визуализации линий | //| V2 от 09.03.2010 добавлено: | //| - настройка метода усреднения МА и точки бара для расчёта, | //| - отображение значений скоростей в окне индикатора. | //| - возможность позиционирования отображаемой информации по оси X.| //| - задание участка для поиска максимального значения | //| valenok2003@mail.ru | //| ICQ 365919666 | //| Пишу на заказ, цена договорная.| //| http://mebel-for-you.com/programs | //+------------------------------------------------------------------+ //Рисует скорости трёх, заданных пользователем, MA //в процентах от максимального значения скорости за некоторый период времени. //Рисует их суммарное значение с возможностью сглаживания. //За 100% принимается максимальное изменение MA между двумя соседними барами //найденное на участке графика длинной в search_Max, по умолчанию 500 бар. #property copyright "valenok2003@mail.ru" #property link "http://mebel-for-you.com/programs" #property indicator_separate_window //#property indicator_minimum -120 //#property indicator_maximum 120 #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_MA_fast = 5; extern int Period_MA_med = 15; extern int Period_MA_slow = 60; extern int Period_Average_Sum = 15; #include extern string Rem_1 = "-видимость кривых-"; extern bool Show_Average = true; extern bool Show_Sum = false; extern bool Show_fast = false; extern bool Show_med = false; extern bool Show_slow = false; extern string Rem_2 = "-показать как гистограмму-"; extern bool Show_Histogram = false; extern string Rem_3 = "Участок поиска максимума (бар)"; extern int search_Max = 500; extern string Rem_4 = "--Смещ. текста по оси Х--"; extern int shift_txt = 920; // цвет названия должен соответствовать цвету кривой color Color_Txt_Comment = Gray, Color_Txt_MA_fast = Yellow, Color_Txt_MA_med = LimeGreen, Color_Txt_MA_slow = 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_MA_fast[], Speed_MA_med[], Speed_MA_slow[], Nul_Line[]; //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ int init() { //---- name for indicator window string name_window="Speed_MA"; IndicatorShortName(name_window); //---- indicators - предусмотрена возможность отключения линий if(Show_Average == true) { if(Show_Histogram == true) SetIndexStyle(0,DRAW_HISTOGRAM); else SetIndexStyle(0,DRAW_LINE); } else SetIndexStyle(0,DRAW_NONE); SetIndexBuffer(0,Sum_Average); if(Show_Sum == true) SetIndexStyle(1,DRAW_LINE); else SetIndexStyle(1,DRAW_NONE); SetIndexBuffer(1,Sum_Speed); if(Show_fast == true) SetIndexStyle(2,DRAW_LINE); else SetIndexStyle(2,DRAW_NONE); SetIndexBuffer(2,Speed_MA_fast); if(Show_med == true) SetIndexStyle(3,DRAW_LINE); else SetIndexStyle(3,DRAW_NONE); SetIndexBuffer(3,Speed_MA_med); if(Show_slow == true) SetIndexStyle(4,DRAW_LINE); else SetIndexStyle(4,DRAW_NONE); SetIndexBuffer(4,Speed_MA_slow); 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; // переменная для задания позиции по оси Х //проверка условий пользователя -------------------------------------- Check_MA_Parametrs("Speed MA"); //-------------------------------------------------------------------- //- ИЩЕМ МАКСИМАЛЬНОЕ ИЗМЕНЕНИЕ _М_А ЗА 1 БАР ------------------------ //--- (принимаем это значение за 100 процентов)----------------------- int i; double MA_0, MA_1, Dif_MA_fast = 0, Max_MA_fast = 0, Dif_MA_med = 0, Max_MA_med = 0, Dif_MA_slow = 0, Max_MA_slow = 0; i = 0; while(i < search_Max) { // Для MA_fast MA_0 = iMA(NULL,ma_tf,Period_MA_fast,0,ma_method,ma_price,i); MA_1 = iMA(NULL,ma_tf,Period_MA_fast,0,ma_method,ma_price,i+1); Dif_MA_fast = MA_0 - MA_1; if(Max_MA_fast < Dif_MA_fast) Max_MA_fast = Dif_MA_fast; // Для MA_med MA_0 = iMA(NULL,ma_tf,Period_MA_med,0,ma_method,ma_price,i); MA_1 = iMA(NULL,ma_tf,Period_MA_med,0,ma_method,ma_price,i+1); Dif_MA_med = MA_0 - MA_1; if(Max_MA_med < Dif_MA_med) Max_MA_med = Dif_MA_med; // Для MA_slow MA_0 = iMA(NULL,ma_tf,Period_MA_slow,0,ma_method,ma_price,i); MA_1 = iMA(NULL,ma_tf,Period_MA_slow,0,ma_method,ma_price,i+1); Dif_MA_slow = MA_0 - MA_1; if(Max_MA_slow < Dif_MA_slow) Max_MA_slow = Dif_MA_slow; i++; // Расчёт индекса следующего бара } //-------------------------------------------------------------------- //-------------строим кривые изменения скорости МА в процентах-------- int Counted_bars=IndicatorCounted(); // Количество просчитанных баров i=Bars-Counted_bars; // Индекс первого непосчитанного if(Counted_bars==0) i-=Period_Average_Sum+1; while(i>=0) { // Для MA_fast MA_0 = iMA(NULL,ma_tf,Period_MA_fast,0,ma_method,ma_price,i); MA_1 = iMA(NULL,ma_tf,Period_MA_fast,0,ma_method,ma_price,i+1); Speed_MA_fast[i] = ((MA_0 - MA_1)/(0.01*Max_MA_fast)); //Для MA_med MA_0 = iMA(NULL,ma_tf,Period_MA_med,0,ma_method,ma_price,i); MA_1 = iMA(NULL,ma_tf,Period_MA_med,0,ma_method,ma_price,i+1); Speed_MA_med[i] = ((MA_0 - MA_1)/(0.01*Max_MA_med)); //Для MA_slow MA_0 = iMA(NULL,ma_tf,Period_MA_slow,0,ma_method,ma_price,i); MA_1 = iMA(NULL,ma_tf,Period_MA_slow,0,ma_method,ma_price,i+1); Speed_MA_slow[i] = ((MA_0 - MA_1)/(0.01*Max_MA_slow)); // Для суммы быстрой и медленной МА Sum_Speed[i] = (Speed_MA_fast[i] + Speed_MA_med[i] + Speed_MA_slow[i])/3; // усредняем сумму double Tmp_Sum = 0; for(int n=0; n < Period_Average_Sum; n++) { Tmp_Sum = Tmp_Sum + Sum_Speed[i+n]; } Sum_Average[i] = Tmp_Sum/Period_Average_Sum; // Нулевая линия Nul_Line[i] = 0; i--; // Расчёт индекса следующего бара } color_txt = Color_Txt_Comment; ObjectCreate("Label", OBJ_LABEL, WindowFind("Speed_MA"), 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_MA_fast; ObjectCreate("Speed_MA_fast", OBJ_LABEL, WindowFind("Speed_MA"), 0, 0); ObjectSetText("Speed_MA_fast","MA"+(string)Period_MA_fast,7, "Verdana", color_txt); ObjectSet("Speed_MA_fast", OBJPROP_CORNER, 0); ObjectSet("Speed_MA_fast", OBJPROP_XDISTANCE, shift_txt); ObjectSet("Speed_MA_fast", OBJPROP_YDISTANCE, 20); if(Speed_MA_fast[0]>0)color_txt = Color_Txt_UP; if(Speed_MA_fast[0]<0)color_txt = Color_Txt_DOWN; X = shift_txt + 30; ObjectCreate("Speed_MA_fast_value", OBJ_LABEL, WindowFind("Speed_MA"), 0, 0); ObjectSetText("Speed_MA_fast_value"," = "+DoubleToStr(Speed_MA_fast[0],2),7, "Verdana", color_txt); ObjectSet("Speed_MA_fast_value", OBJPROP_CORNER, 0); ObjectSet("Speed_MA_fast_value", OBJPROP_XDISTANCE, X); ObjectSet("Speed_MA_fast_value", OBJPROP_YDISTANCE, 20); color_txt = Color_Txt_MA_med; ObjectCreate("Speed_MA_med", OBJ_LABEL, WindowFind("Speed_MA"), 0, 0); ObjectSetText("Speed_MA_med","MA"+(string)Period_MA_med,7, "Verdana", color_txt); ObjectSet("Speed_MA_med", OBJPROP_CORNER, 0); ObjectSet("Speed_MA_med", OBJPROP_XDISTANCE, shift_txt); ObjectSet("Speed_MA_med", OBJPROP_YDISTANCE, 35); if(Speed_MA_med[0]>0)color_txt = Color_Txt_UP; if(Speed_MA_med[0]<0)color_txt = Color_Txt_DOWN; X = shift_txt + 30; ObjectCreate("Speed_MA_med_value", OBJ_LABEL, WindowFind("Speed_MA"), 0, 0); ObjectSetText("Speed_MA_med_value"," = "+DoubleToStr(Speed_MA_med[0],2),7, "Verdana", color_txt); ObjectSet("Speed_MA_med_value", OBJPROP_CORNER, 0); ObjectSet("Speed_MA_med_value", OBJPROP_XDISTANCE, X); ObjectSet("Speed_MA_med_value", OBJPROP_YDISTANCE, 35); color_txt = Color_Txt_MA_slow; ObjectCreate("Speed_MA_slow", OBJ_LABEL, WindowFind("Speed_MA"), 0, 0); ObjectSetText("Speed_MA_slow","MA"+(string)Period_MA_slow,7, "Verdana", color_txt); ObjectSet("Speed_MA_slow", OBJPROP_CORNER, 0); ObjectSet("Speed_MA_slow", OBJPROP_XDISTANCE, shift_txt); ObjectSet("Speed_MA_slow", OBJPROP_YDISTANCE, 50); if(Speed_MA_slow[0]>0)color_txt = Color_Txt_UP; if(Speed_MA_slow[0]<0)color_txt = Color_Txt_DOWN; X = shift_txt + 30; ObjectCreate("Speed_MA_slow_value", OBJ_LABEL, WindowFind("Speed_MA"), 0, 0); ObjectSetText("Speed_MA_slow_value"," = "+DoubleToStr(Speed_MA_slow[0],2),7, "Verdana", color_txt); ObjectSet("Speed_MA_slow_value", OBJPROP_CORNER, 0); ObjectSet("Speed_MA_slow_value", OBJPROP_XDISTANCE, X); ObjectSet("Speed_MA_slow_value", OBJPROP_YDISTANCE, 50); color_txt = Color_Txt_Sum; // цвет названия соответствует цвету кривой ObjectCreate("Sum_Speed", OBJ_LABEL, WindowFind("Speed_MA"), 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"), 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"), 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"), 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_Sum", OBJ_LABEL, WindowFind("Speed_MA"), 0, 0); ObjectSetText("Period_Average_Sum","Period_Average",7, "Verdana", color_txt); ObjectSet("Period_Average_Sum", OBJPROP_CORNER, 0); ObjectSet("Period_Average_Sum", OBJPROP_XDISTANCE, shift_txt); ObjectSet("Period_Average_Sum", OBJPROP_YDISTANCE, 110); X = shift_txt + 40; ObjectCreate("Period_Average_Sum_value", OBJ_LABEL, WindowFind("Speed_MA"), 0, 0); ObjectSetText("Period_Average_Sum_value",DoubleToStr(Period_Average_Sum,0),7, "Verdana", color_txt); ObjectSet("Period_Average_Sum_value", OBJPROP_CORNER, 0); ObjectSet("Period_Average_Sum_value", OBJPROP_XDISTANCE, X); ObjectSet("Period_Average_Sum_value", OBJPROP_YDISTANCE, 125); //---- return(0); }