Приветствую!
Прошу создать индикатор на основе Moving Average с возможностью кнопочного переключения периодов.
Наглядный пример на скрине…
нажатие кнопки "+" это повышение периода, отображает цифру и соответственно выстраивается МА линия этого периода на графике.
нажатие кнопки "-" это понижение периода, отображает цифру и соответственно выстраивается МА линия этого периода на графике.
цифра между кнопками "+" и "-" указывает на текущий период Moving Average графика.
При переключении таймфрейма графика, период МА не меняется.
Изначальный период 1, по ценам Close.
Параметры: период, метод МА, применить к..., толщина и цвет линии.
Расположение кнопок: в правом нижнем углу графика, примерно как на скрине.
Спасибо.
Комментарии (9)
35 AM2 Сообщений: 16672 - Андрей
35 AM2 Сообщений: 16672 - Андрей
35 AM2 Сообщений: 16672 - Андрей
т.е. быстро поменять период МА не прибегая к ручному вводу параметра…
11 FOTON Автор Сообщений: 683 - Иван
у меня нет опыта работы с этим объектом, а значит это делать долго трудно нудно
35 AM2 Сообщений: 16672 - Андрей
<code> //+------------------------------------------------------------------+ //| MAPeriod.mq4 | //| Copyright 2023, AM2 | //| https://www.forexsystems.biz | //+------------------------------------------------------------------+ #property copyright "Copyright 2023, AM2" #property link "https://www.forexsystems.biz" #property version "1.00" #property strict #property indicator_chart_window #property indicator_buffers 1 input int period_ma = 2; input int width = 2; input color clr = clrRed; input ENUM_APPLIED_PRICE pr = 0; double m[]; int map=period_ma; //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ int OnInit() { //--- indicator buffers mapping SetIndexStyle(0,DRAW_LINE,0,width,clr); SetIndexBuffer(0,m); PutButton("More",30,90,"+"); PutLabel("Num",27,60,IntegerToString(map)); PutButton("Less",30,30,"-"); //--- return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ //| Custom indicator iteration function | //+------------------------------------------------------------------+ int OnCalculate(const int rates_total, const int prev_calculated, const datetime &time[], const double &open[], const double &high[], const double &low[], const double &close[], const long &tick_volume[], const long &volume[], const int &spread[]) { //--- for(int i=0; i<rates_total; i++) { m[i]=iMA(NULL,0,map,0,0,pr,i); } //--- return value of prev_calculated for next call return(rates_total); } //+------------------------------------------------------------------+ //+------------------------------------------------------------------+ //| ChartEvent function | //+------------------------------------------------------------------+ void OnChartEvent(const int id, const long &lparam, const double &dparam, const string &sparam) { if(id==CHARTEVENT_OBJECT_CLICK && sparam=="More") { map++; ObjectSetString(0,"Num",OBJPROP_TEXT,IntegerToString(map)); ObjectSetInteger(0,"More",OBJPROP_STATE,false); } if(id==CHARTEVENT_OBJECT_CLICK && sparam=="Less") { map--; ObjectSetString(0,"Num",OBJPROP_TEXT,IntegerToString(map)); ObjectSetInteger(0,"Less",OBJPROP_STATE,false); } } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ void PutButton(string name,int x,int y,string text) { ObjectDelete(0,name); ObjectCreate(0,name,OBJ_BUTTON,0,0,0); //--- установим координаты кнопки ObjectSetInteger(0,name,OBJPROP_XDISTANCE,x); ObjectSetInteger(0,name,OBJPROP_YDISTANCE,y); //--- установим размер кнопки ObjectSetInteger(0,name,OBJPROP_XSIZE,20); ObjectSetInteger(0,name,OBJPROP_YSIZE,20); //--- установим угол графика, относительно которого будут определяться координаты точки ObjectSetInteger(0,name,OBJPROP_CORNER,3); //--- установим текст ObjectSetString(0,name,OBJPROP_TEXT,text); //--- установим шрифт текста ObjectSetString(0,name,OBJPROP_FONT,"Arial"); //--- установим размер шрифта ObjectSetInteger(0,name,OBJPROP_FONTSIZE,12); //--- установим цвет текста ObjectSetInteger(0,name,OBJPROP_COLOR,Black); //--- установим цвет фона ObjectSetInteger(0,name,OBJPROP_BGCOLOR,White); //--- установим цвет границы ObjectSetInteger(0,name,OBJPROP_BORDER_COLOR,Blue); //--- переведем кнопку в заданное состояние ObjectSetInteger(0,name,OBJPROP_STATE,false); //--- скроем (true) или отобразим (false) имя графического объекта в списке объектов ObjectSetInteger(0,name,OBJPROP_HIDDEN,false); //--- установим приоритет на получение события нажатия мыши на графике ObjectSetInteger(0,name,OBJPROP_ZORDER,0); } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ void PutLabel(string nm,int x,int y,string text) { ObjectDelete(0,nm); //--- создадим текстовую метку ObjectCreate(0,nm,OBJ_LABEL,0,0,0); //--- установим координаты метки ObjectSetInteger(0,nm,OBJPROP_XDISTANCE,x); ObjectSetInteger(0,nm,OBJPROP_YDISTANCE,y); //--- установим угол графика, относительно которого будут определяться координаты точки ObjectSetInteger(0,nm,OBJPROP_CORNER,3); //--- установим текст ObjectSetString(0,nm,OBJPROP_TEXT,text); //--- установим шрифт текста ObjectSetString(0,nm,OBJPROP_FONT,"Arial"); //--- установим размер шрифта ObjectSetInteger(0,nm,OBJPROP_FONTSIZE,12); //--- установим цвет ObjectSetInteger(0,nm,OBJPROP_COLOR,clrYellow); //--- включим (true) или отключим (false) режим перемещения метки мышью ObjectSetInteger(0,nm,OBJPROP_SELECTABLE,false); ObjectSetInteger(0,nm,OBJPROP_SELECTED,false); } </code>Редактирован: 5 июля 2023, 23:4515 verta81 Сообщений: 489
11 FOTON Автор Сообщений: 683 - Иван
35 AM2 Сообщений: 16672 - Андрей
11 FOTON Автор Сообщений: 683 - Иван
Зарегистрируйтесь или авторизуйтесь, чтобы оставить комментарий