Как нанести на младший таймфрейм цены закрытия в виде гор-ых уровней (HLC) предыдущего бара старших тайфреймов, например: D1,W1,M1?

 

Например нанести на M15 цены закрытия предыдущего дня, недели, месяца? Это возможно реализовать? Как пример эта задача уже реализована на сервисе tradingview

 
Как максимум за час пишется индикатор и всё показывает.
 

Вот держите, удалил все лишнее из советника, оставил только отображение уровней. Переменная TimeFrame задает период графика, откуда тянутся уровни. Не идеально, но как работающий пример пойдет

#property copyright "Copyright 2016, x.ru."
#property link      "https://www..ru"
#property version   "1.00"
#property strict

input int      TimeFrame=60;

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   double Dmax,Dmin;
   static datetime ObjT=0;
   datetime TempT;
   Dmax=iHigh(Symbol(),0,1);
   Dmin=iLow(Symbol(),0,1);
   TempT=iTime(NULL,0,1);
   if(ObjT!=TempT && ObjT!=0)
      {ObjectDelete("LevelUp");
       ObjectDelete("LevelDown");}
   if(ObjT!=TempT)
      {
       ObjectCreate("LevelUp", OBJ_HLINE, 0, 0, Dmax);
       ObjectSet("LevelUp", OBJPROP_PRICE1, Dmax);
       ObjectSet("LevelUp", OBJPROP_COLOR, clrOrchid);
       ObjectSet("LevelUp", OBJPROP_STYLE, 2);
       ObjectSet("LevelUp", OBJPROP_WIDTH, 1);
       ObjectCreate("LevelDown", OBJ_HLINE, 0, 0, Dmin);
       ObjectSet("LevelDown", OBJPROP_PRICE1, Dmin);
       ObjectSet("LevelDown", OBJPROP_COLOR, clrOrchid);
       ObjectSet("LevelDown", OBJPROP_STYLE, 2);
       ObjectSet("LevelDown", OBJPROP_WIDTH, 1);
       WindowRedraw();
       ObjT=TempT;
      }
  }
 

Упс, вот эти строки нужно вставить вместо, аналогичных но неправильных)))

 

   Dmax=iHigh(Symbol(),TimeFrame,1);
   Dmin=iLow(Symbol(),TimeFrame,1);
 
Bakhytzhan Abzalbekov:

Упс, вот эти строки нужно вставить вместо, аналогичных но неправильных)))

 

А куда всё это вставлять? Я наживаю F4 появляется Metaeditor, а что дальше делать? У меня круглые глаза я вообще ничего понять не могу. Помогите пожалуйста. 
 
Bakhytzhan Abzalbekov:

Упс, вот эти строки нужно вставить вместо, аналогичных но неправильных)))

 

Выдает 17 ошибок компиляции.
 

Это код MQL4 для MetaTrader 4. Ошибок компиляции не должно быть.

Приложенный файл нужно сохранить в каталог советников терминала (у меня вот так K:\******\MQL4\Experts). И скомпилировать в MetaEditor. Затем в терминале MetaTrader открыть нужный Вам график и прикрепить к нему советника с этим именем. В параметрах советника указать в минутах переменную TimeFrame, например для дневки это будет 1440.

Файлы:
Level.mq4  2 kb
 
Svinauh:
Выдает 17 ошибок компиляции.

Откуда у вас ошибки ?

 

 

Файлы:
levels.mq4  2 kb
 

Зачем-же такое делать советником? А если надо будет на один график нанести 2-3 старших ТФ?

Вот индикатор.

/********************************************************************\
                                               LevelSeniorPeriod.mq4 |
                                            Copyright 2016, Viktorov |
                                                      v4forex@qip.ru |
\********************************************************************/
#property copyright "Copyright 2016, Viktorov"
#property link      "v4forex@qip.ru"
#property version   "1.00"
#property strict
#property indicator_chart_window
#property indicator_buffers 2
#property indicator_color1  clrGreen
#property indicator_color2  clrRed

string tfr(int p)
{
 switch(p)
  {
   case PERIOD_CURRENT: return("PERIOD_CURRENT");
   case PERIOD_M1: return("PERIOD_M1");
   case PERIOD_M15: return("PERIOD_M15");
   case PERIOD_M30: return("PERIOD_M30");
   case PERIOD_H1: return("PERIOD_H1");
   case PERIOD_H4: return("PERIOD_H4");
   case PERIOD_D1: return("PERIOD_D1");
   case PERIOD_W1: return("PERIOD_W1");
   case PERIOD_MN1: return("PERIOD_MN1");
  }
 return("PERIOD_CURRENT");
}

input ENUM_TIMEFRAMES period = PERIOD_D1;  // Выбери период
ENUM_TIMEFRAMES per;
double   levelHigh[];
double   levelLow[];
/**************Custom indicator initialization function**************/
int OnInit()
{
 per = period <= PERIOD_CURRENT ? PERIOD_CURRENT : period;
   SetIndexBuffer(0, levelHigh);
   SetIndexStyle(0, DRAW_ARROW);
   SetIndexArrow(0, 115);
   SetIndexLabel(0, tfr(per)+" High");
   SetIndexBuffer(1, levelLow);
   SetIndexStyle(1, DRAW_ARROW);
   SetIndexArrow(1, 115);
   SetIndexLabel(1, tfr(per)+" Low");
   IndicatorDigits(_Digits);
   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[])
{
 MqlRates arr0[1], arrT[1];
  int s = 0, copied, limit = prev_calculated == 0 ? rates_total-prev_calculated-2 : rates_total-prev_calculated;
   for(int i = limit; i >= 0; i--)
    {
     copied = CopyRates(_Symbol, PERIOD_CURRENT, i, 1, arrT);
      copied = CopyRates(_Symbol, per, arrT[0].time, 1, arr0);
       levelHigh[i] = arr0[0].high;
        levelLow[i] = arr0[0].low;
        
       if(levelHigh[i] != levelHigh[i+1] || levelLow[i] != levelLow[i+1])
        {
         s = int(arrT[0].time/PeriodSeconds() - arr0[0].time/PeriodSeconds());
          for(int j = s; j >= 0; j--)
           {
            copied = CopyRates(_Symbol, PERIOD_CURRENT, j, 0, arrT);
             copied = CopyRates(_Symbol, per, arrT[0].time, 1, arr0);
              levelHigh[j] = arr0[0].high;
             levelLow[j] = arr0[0].low;
           }
        }
    }

   return(rates_total);
}/*******************************************************************/


На этом скрине 2 индикатора PERIOD_H4 и PERIOD_D1



Файлы:
 

Может вы знаете как  бы еще сделать выбор таймфреймов в самом индикаторе, чтобы можно было выбрать какие уровни каких периудов выводить ?

Хотя так удобно получилось,  вполне юзабельно  !!!

 
Это в смысле "Мы не ищем простых, лёгких путей"?
Причина обращения: