Как нанести на младший таймфрейм цены закрытия в виде гор-ых уровней (HLC) предыдущего бара старших тайфреймов, например: D1,W1,M1?
Вот держите, удалил все лишнее из советника, оставил только отображение уровней. Переменная 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);
Упс, вот эти строки нужно вставить вместо, аналогичных но неправильных)))
Упс, вот эти строки нужно вставить вместо, аналогичных но неправильных)))
Это код MQL4 для MetaTrader 4. Ошибок компиляции не должно быть.
Приложенный файл нужно сохранить в каталог советников терминала (у меня вот так K:\******\MQL4\Experts). И скомпилировать в MetaEditor. Затем в терминале MetaTrader открыть нужный Вам график и прикрепить к нему советника с этим именем. В параметрах советника указать в минутах переменную TimeFrame, например для дневки это будет 1440.
Зачем-же такое делать советником? А если надо будет на один график нанести 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
Может вы знаете как бы еще сделать выбор таймфреймов в самом индикаторе, чтобы можно было выбрать какие уровни каких периудов выводить ?
Хотя так удобно получилось, вполне юзабельно !!!
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Например нанести на M15 цены закрытия предыдущего дня, недели, месяца? Это возможно реализовать? Как пример эта задача уже реализована на сервисе tradingview