FOTON
Иван

 
Уровень 11

  Торгую в компаниях:


Группа "Стол заказов MQL"

Рейтинг 2146



РЕКОМЕНДУЮ



индикатор МА перидов

Приветствую!
Прошу создать индикатор на основе Moving Average с возможностью кнопочного переключения периодов.
Наглядный пример на скрине…
нажатие кнопки "+" это повышение периода, отображает цифру и соответственно выстраивается МА линия этого периода на графике.
нажатие кнопки "-" это понижение периода, отображает цифру и соответственно выстраивается МА линия этого периода на графике.
цифра между кнопками "+" и "-" указывает на текущий период Moving Average графика.
При переключении таймфрейма графика, период МА не меняется.
Изначальный период 1, по ценам Close.
Параметры: период, метод МА, применить к..., толщина и цвет линии.
Расположение кнопок: в правом нижнем углу графика, примерно как на скрине.
Спасибо.
  • +1
  • Просмотров: 1746
  • 4 июля 2023, 16:48
  • FOTON
Понравилcя материал? Не забудьте поставить плюс и поделиться в социальной сети!

Вступите в группу "Стол заказов MQL", чтобы следить за обновлениями
ПРИСОЕДИНИТЬСЯ К ГРУППЕ
присоединиться
  Предыдущая запись в группе
ИЩУ ПОРУЧИТЕЛЯ (ТОЧНО РАБОЧАЯ ТЕМА!)
Следующая запись в группе  
Советник МТ5 для торговли акциями
03 июля 2023
05 июля 2023

Брокер для ваших роботов, 15 лет на рынке

Комментарии (9)

+
0
на 5-е
avatar

  35  AM2 Сообщений: 16247 - Андрей

  • 4 июля 2023, 20:26
+
0
никогда подобные вещи не делал. вот то что удалось сделать быстро:


//+------------------------------------------------------------------+
//|                                                     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

double m[];

int map=2;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   SetIndexStyle(0,DRAW_LINE,0,4,Red);
   SetIndexBuffer(0,m);

   PutEdit("e",44,22);
   map=(int)ObjectGetString(0,"e",OBJPROP_TEXT);
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void PutEdit(string name,int x,int y)
  {
   ObjectCreate(0,name,OBJ_EDIT,0,0,0);
//--- установим координаты объекта
   ObjectSetInteger(0,name,OBJPROP_XDISTANCE,x);
   ObjectSetInteger(0,name,OBJPROP_YDISTANCE,y);
//--- установим размеры объекта
   ObjectSetInteger(0,name,OBJPROP_XSIZE,35);
   ObjectSetInteger(0,name,OBJPROP_YSIZE,20);
//--- установим текст
   ObjectSetString(0,name,OBJPROP_TEXT,string(map));
//--- установим шрифт текста
   ObjectSetString(0,name,OBJPROP_FONT,"Arial");
//--- установим размер шрифта
   ObjectSetInteger(0,name,OBJPROP_FONTSIZE,12);
//--- установим способ выравнивания текста в объекте
   ObjectSetInteger(0,name,OBJPROP_ALIGN,0);
//--- установим (true) или отменим (false) режим только для чтения
   ObjectSetInteger(0,name,OBJPROP_READONLY,0);
//--- установим угол графика, относительно которого будут определяться координаты объекта
   ObjectSetInteger(0,name,OBJPROP_CORNER,3);
//--- установим цвет текста
   ObjectSetInteger(0,name,OBJPROP_COLOR,Red);
//--- установим цвет фона
   ObjectSetInteger(0,name,OBJPROP_BGCOLOR,White);
//--- установим цвет границы
   ObjectSetInteger(0,name,OBJPROP_BORDER_COLOR,Blue);
//--- отобразим на переднем (false) или заднем (true) плане
   ObjectSetInteger(0,name,OBJPROP_BACK,1);
//--- включим (true) или отключим (false) режим перемещения метки мышью
   ObjectSetInteger(0,name,OBJPROP_SELECTABLE,0);
   ObjectSetInteger(0,name,OBJPROP_SELECTED,0);
//--- скроем (true) или отобразим (false) имя графического объекта в списке объектов
   ObjectSetInteger(0,name,OBJPROP_HIDDEN,0);
//--- установим приоритет на получение события нажатия мыши на графике
   ObjectSetInteger(0,name,OBJPROP_ZORDER,1);
  }
//+------------------------------------------------------------------+
//| 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,(int)ObjectGetString(0,"e",OBJPROP_TEXT),0,0,0,i);
     }
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+

avatar

  35  AM2 Сообщений: 16247 - Андрей

  • 5 июля 2023, 19:16
+
0
в этом варианте, введенное значение не слетает: www.opentraders.ru/downloads/3624/

avatar

  35  AM2 Сообщений: 16247 - Андрей

  • 5 июля 2023, 20:20
+
0
суть сей идеи в том, что бы быстро поменять период МА не прибегая к ручному воздействию...(постоянно приходиться открывать окно параметров МА что бы поменять период, а потом снова что бы вернуть обратно). Так, с помощью такой идеи индикатора, к примеру: нажатие мышью на кнопку "+" период МА меняется на 1-ну единицу в повышение, а нажатием на кнопку "-" период МА меняется на 1-ну единицу в уменьшение.
т.е. быстро поменять период МА не прибегая к ручному вводу параметра…
avatar

  11  FOTON Автор Сообщений: 683 - Иван

  • 5 июля 2023, 20:47
+
+1
суть сей идеи в том, что бы быстро поменять период МА не прибегая к ручному воздействию


у меня нет опыта работы с этим объектом, а значит это делать долго трудно нудно
avatar

  35  AM2 Сообщений: 16247 - Андрей

  • 5 июля 2023, 22:18
+
0
Как вариант:

<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:45
avatar

  14  verta81 Сообщений: 388

  • 5 июля 2023, 23:43
+
0
ну вот отлично,*good* ,… тока вот после удаления индюка на графике остаются его элементы… мона ето исправить?:)  спасибки
avatar

  11  FOTON Автор Сообщений: 683 - Иван

  • 6 июля 2023, 08:46
+
0

//+------------------------------------------------------------------+
//|                                                     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,"+");
   PutButton("Less",30,30,"-");
   PutLabel("Num",27,60,string(map));
   
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   Comment("");
   ObjectDelete("Num");
   ObjectDelete("More");
   ObjectDelete("Less");
  }
//+------------------------------------------------------------------+
//| 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);
  }
//+------------------------------------------------------------------+

avatar

  35  AM2 Сообщений: 16247 - Андрей

  • 6 июля 2023, 17:41
+
0
ок… работает
avatar

  11  FOTON Автор Сообщений: 683 - Иван

  • 7 июля 2023, 14:01

Зарегистрируйтесь или авторизуйтесь, чтобы оставить комментарий