mihhail777
Михаил

 
Уровень 10


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

Рейтинг 2146



РЕКОМЕНДУЮ



Прошу написать индикатор- grid для МТ4.

Прошу написать индикатор- grid для МТ4.

Суть индикатора, чтобы он рисовал сетку (наподобие индикатора круглых чисел), но!

В индикаторе было 2 настройки:
1. в ручную выставлять размер сетки true/false
2. чтобы он сам автоматически рисовал сетку, на основе среднего дневного диапазона за определенное кол-во дней разделенного на коэффициент (кол-во дней и диапазон выставляется в ручную) true/false
Точка отсчета сетки – также выставляется в настройке индикатора.
Также нужно автоматическое обновление, если задействован режим 2(сетка на основании дневного диапазона).

Заранее спасибо

Картинка для примера режим один, диапазон 55

  • +3
  • Просмотров: 4869
  • 28 сентября 2016, 21:40
  • mihhail777
Понравилcя материал? Не забудьте поставить плюс и поделиться в социальной сети!

Вступите в группу "Стол заказов MQL", чтобы следить за обновлениями
ПРИСОЕДИНИТЬСЯ К ГРУППЕ
присоединиться
Следующая запись в группе  
Скрипт
27 сентября 2016
29 сентября 2016

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

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

+
0
Посмотрю завтра.
avatar

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

  • 28 сентября 2016, 21:47
+
0
Круглый индикатор от какой цены считает?
Формулу расчета для пункта 2 опишите подробнее?
avatar

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

  • 28 сентября 2016, 22:10
+
0
От цены откладывает заданное количество линий на указанном расстоянии или по волатильности предыдущих дней.




//+------------------------------------------------------------------+
//|                                                         Grid.mq4 |
//|                                              Copyright 2016, AM2 |
//|                                      http://www.forexsystems.biz |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, AM2."
#property link      "http://www.forexsystems.biz"
#property version   "1.00"
#property strict
#property indicator_chart_window

input int Step=55;         // шаг между линиями
input int Count=5;         // число линий
input int Days=3;          // дней для расчета
input int Koef=4;          // делитель волатильности
input bool D=false;        // флаг расчета по дням
input color ColorSup=Red;  // цвет сопротивления
input color ColorRes=Blue; // цвет поддержки

bool Put=true;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping

//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   Comment("");
   ObjectsDeleteAll(0,0,OBJ_HLINE);
  }
//+------------------------------------------------------------------+
//| Горизонтальная линия                                             |
//+------------------------------------------------------------------+
void PutHLine(string name,double p,color clr)
  {
   ObjectDelete(0,name);
   ObjectCreate(0,name,OBJ_HLINE,0,0,p);
//--- установим цвет линии
   ObjectSetInteger(0,name,OBJPROP_COLOR,clr);
//--- установим толщину линии
   ObjectSetInteger(0,name,OBJPROP_WIDTH,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[])
  {
//---
   double delta=0,pr1=0,pr2=0;
   for(int i=1;i<=Days;i++)
     {
      delta=((iHigh(NULL,PERIOD_D1,i)-iLow(NULL,PERIOD_D1,i))/Days/Koef)/Point;
     }

   if(Put)
     {
      for(int i=1;i<=Count;i++)
        {
         if(D)
           {
            pr1=NormalizeDouble(Bid+delta*Point*i,Digits);
            PutHLine("Supp Line: "+(string)pr1,pr1,ColorSup);
            pr2=NormalizeDouble(Bid-delta*Point*i,Digits);
            PutHLine("Res Line: "+(string)pr2,pr2,ColorRes);
            Put=false;
           }

         if(D==false)
           {
            pr1=NormalizeDouble(Bid+Step*Point*i,Digits);
            PutHLine("Supp Line: "+(string)pr1,pr1,ColorSup);
            pr2=NormalizeDouble(Bid-Step*Point*i,Digits);
            PutHLine("Res Line: "+(string)pr2,pr2,ColorRes);
            Put=false;
           }
        }
     }
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+

avatar

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

  • 29 сентября 2016, 06:37
+
0
Средний дневной диапазон – это среднее арифметическое за какое-то количество дней. Например, если мы хотим узнать средний диапазон за прошлую неделю, то нужно взять значение каждого дня. Это 114 пунктов за понедельник, 96 пунктов за вторник, 53 — за среду, 67-за четверг и 68- за пятницу. Сложить их, затем поделить на общее количество дней. То есть, на 5.

В итоге средний дневной диапазон будет равен 80 пунктам. Кол-во дней должно настраиваться в индикаторе

avatar

  10  mihhail777 Автор Сообщений: 159 - Михаил

  • 29 сентября 2016, 07:29
+
0
Превосходно, вроде бы все ок — кроме одного: не хватает точки отсчета. Он сразу выстраивает сетку, когда кидаешь на график — от текущей котировки, настраивать точку отсчета.
avatar

  10  mihhail777 Автор Сообщений: 159 - Михаил

  • 29 сентября 2016, 10:33
+
0
Вечером добавлю точку отсчета во входящие переменные.
avatar

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

  • 29 сентября 2016, 12:45
+
0
avatar

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

  • 29 сентября 2016, 18:51
+
0
приветствую

первая часть работает все как и было задумано вот скрин:


а вот со второй частью не все так хорошо, не правильно он считает, вот картинка


можно поправить?
avatar

  10  mihhail777 Автор Сообщений: 159 - Михаил

  • 2 октября 2016, 13:58
+
0
Исправил расчет. Сейчас у меня дельта 555 за 5 дней с коэффициентом 1. Расчет идет по формуле:


   for(int i=1;i<=Days;i++)
     {
      delta+=(iHigh(NULL,PERIOD_D1,i)-iLow(NULL,PERIOD_D1,i));
     }
   delta=(delta/Days/Koef)/Point;


т.е. хай-лоу за 5 предыдущих дней.




//+------------------------------------------------------------------+
//|                                                         Grid.mq4 |
//|                                              Copyright 2016, AM2 |
//|                                      http://www.forexsystems.biz |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, AM2."
#property link      "http://www.forexsystems.biz"
#property version   "1.00"
#property strict
#property indicator_chart_window

input int Step=55;         // шаг между линиями
input int Count=5;         // число линий
input int Days=5;          // дней для расчета
input int Koef=1;          // делитель волатильности
input bool D=false;        // флаг расчета по дням
input color ColorSup=Red;  // цвет сопротивления
input color ColorRes=Blue; // цвет поддержки
input double Price=1.124;  // точка отсчета

bool Put=true;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
   ObjectsDeleteAll(0,0,OBJ_HLINE);
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   Comment("");
   ObjectsDeleteAll(0,0,OBJ_HLINE);
  }
//+------------------------------------------------------------------+
//| Горизонтальная линия                                             |
//+------------------------------------------------------------------+
void PutHLine(string name,double p,color clr)
  {
   ObjectDelete(0,name);
   ObjectCreate(0,name,OBJ_HLINE,0,0,p);
//--- установим цвет линии
   ObjectSetInteger(0,name,OBJPROP_COLOR,clr);
//--- установим толщину линии
   ObjectSetInteger(0,name,OBJPROP_WIDTH,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[])
  {
//---
   double delta=0,pr1=0,pr2=0;
   for(int i=1;i<=Days;i++)
     {
      delta+=(iHigh(NULL,PERIOD_D1,i)-iLow(NULL,PERIOD_D1,i));
     }
   delta=(delta/Days/Koef)/Point;
   
   if(Put)
     {
      for(int i=1;i<=Count;i++)
        {
         if(D)
           {
            pr1=NormalizeDouble(Price+delta*Point*i,Digits);
            PutHLine("Supp Line: "+(string)pr1,pr1,ColorSup);
            pr2=NormalizeDouble(Price-delta*Point*i,Digits);
            PutHLine("Res Line: "+(string)pr2,pr2,ColorRes);
            Put=false;
           }

         if(D==false)
           {
            pr1=NormalizeDouble(Price+Step*Point*i,Digits);
            PutHLine("Supp Line: "+(string)pr1,pr1,ColorSup);
            pr2=NormalizeDouble(Price-Step*Point*i,Digits);
            PutHLine("Res Line: "+(string)pr2,pr2,ColorRes);
            Put=false;
           }
        }
     }

   Comment("\n Delta: ",NormalizeDouble(delta,0));
   
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+

avatar

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

  • 2 октября 2016, 14:29
+
0
Блеск! все ок… если не трудно, чтобы прорисовывалась бы еще линия точка отсчета — другим цветом, а так класс! при копировании, у меня в место русских букв — иероглефы, не могли бы Вы положить в файлы. Когда от туда качаешь — все ок.
avatar

  10  mihhail777 Автор Сообщений: 159 - Михаил

  • 2 октября 2016, 15:01
+
0
avatar

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

  • 2 октября 2016, 15:25
+
0
супер! благодарю.
avatar

  10  mihhail777 Автор Сообщений: 159 - Михаил

  • 2 октября 2016, 15:57
+
0
чудо творение пошло уже в мир forexsystemsru.com/1189578-post4549.html… даже на реальном рынке еще не проверили…
Редактирован: 2 октября 2016, 22:07
avatar

  10  mihhail777 Автор Сообщений: 159 - Михаил

  • 2 октября 2016, 22:06
+
0
Андрей, возник вопрос, а он берет в расчет так же воскресенье? Если да — то это мое упущение, что я не написал сразу исключение этого дня из расчета.
avatar

  10  mihhail777 Автор Сообщений: 159 - Михаил

  • 3 октября 2016, 09:11
+
0
Андрей, можно поправить немного — чтобы он не брал в расчет воскресенье?
avatar

  10  mihhail777 Автор Сообщений: 159 - Михаил

  • 5 октября 2016, 09:11
+
0
Добрый день. Помогите в написании индикатора, который автоматически рисует уровни, равные ATR/2 за определённый период в днях: например 21 день, 30, 100 и т.д. ATR настраивается. Линии рисуются в обе стороны вверх и вниз от цены закрытия прошедшего дня. Линии рисуются от начала текущего дня и только в текущем дне. При наступлении следующего дня, уровни прошлого дня удаляются. Стили линий настраиваются.
avatar

  0  slava230160 Сообщений: 2

  • 9 сентября 2019, 14:27

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