//+------------------------------------------------------------------+ //| Custom Period Separators mt5.mq5 | //| Yuriy Tokman (YTG) | //| https://www.mql5.com/ru/users/satop/seller | //+------------------------------------------------------------------+ #property copyright "Yuriy Tokman (YTG)" #property link "https://www.mql5.com/ru/users/satop/seller" #property version "1.00" #property indicator_chart_window #property indicator_plots 0 input string Time_Separators = "09:15"; // время разделителя (ЧЧ:ММ) input color InpColor=clrRed; // Цвет линии input ENUM_LINE_STYLE InpStyle=STYLE_DASH; // Стиль линии input int InpWidth=1; // Толщина линии input bool InpBack=false; // Линия на заднем плане //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ int OnInit() { //--- indicator buffers mapping //--- return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ void OnDeinit(const int reason) { //--- GetDell(Time_Separators); //--- } //+------------------------------------------------------------------+ //| 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[]) { //--- ArraySetAsSeries(time,true);//индексация элементов массива будет производиться как в таймсериях. int limit=rates_total-prev_calculated; if(prev_calculated==0)limit--; else limit++; //---- for(int i=limit; i>=0; i--) { VLineCreate(0,Time_Separators+TimeToString(T_1440(i,time[i])),0,T_1440(i,time[i]),InpColor,InpStyle,InpWidth,InpBack,false,false); } //--- return value of prev_calculated for next call return(rates_total); } //+------------------------------------------------------------------+ //+------------------------------------------------------------------+ datetime T_1440 (int i =0, datetime _time =0) { datetime _t_1440 =0; datetime tD = iTime(Symbol(),PERIOD_D1,iBarShift(Symbol(),PERIOD_D1,_time)); _t_1440 = StringToTime(TimeToString(tD, TIME_DATE)+" "+Time_Separators); return(_t_1440); } //---- //---- //+------------------------------------------------------------------+ //| Создает вертикальную линию | //+------------------------------------------------------------------+ bool VLineCreate(const long chart_ID=0, // ID графика const string name="VLine", // имя линии const int sub_window=0, // номер подокна datetime time=0, // время линии const color clr=clrRed, // цвет линии const ENUM_LINE_STYLE style=STYLE_SOLID, // стиль линии const int width=1, // толщина линии const bool back=false, // на заднем плане const bool selection=true, // выделить для перемещений const bool hidden=true, // скрыт в списке объектов const long z_order=0) // приоритет на нажатие мышью { //--- если время линии не задано, то проводим ее через последний бар if(ObjectFind(chart_ID,name)>-1)ObjectDelete(chart_ID,name); //--- сбросим значение ошибки ResetLastError(); //--- создадим вертикальную линию if(!ObjectCreate(chart_ID,name,OBJ_VLINE,sub_window,time,0)) { Print(__FUNCTION__, ": не удалось создать вертикальную линию! Код ошибки = ",GetLastError()); return(false); } //--- установим цвет линии ObjectSetInteger(chart_ID,name,OBJPROP_COLOR,clr); //--- установим стиль отображения линии ObjectSetInteger(chart_ID,name,OBJPROP_STYLE,style); //--- установим толщину линии ObjectSetInteger(chart_ID,name,OBJPROP_WIDTH,width); //--- отобразим на переднем (false) или заднем (true) плане ObjectSetInteger(chart_ID,name,OBJPROP_BACK,back); //--- включим (true) или отключим (false) режим перемещения линии мышью //--- при создании графического объекта функцией ObjectCreate, по умолчанию объект //--- нельзя выделить и перемещать. Внутри же этого метода параметр selection //--- по умолчанию равен true, что позволяет выделять и перемещать этот объект ObjectSetInteger(chart_ID,name,OBJPROP_SELECTABLE,selection); ObjectSetInteger(chart_ID,name,OBJPROP_SELECTED,selection); //--- скроем (true) или отобразим (false) имя графического объекта в списке объектов ObjectSetInteger(chart_ID,name,OBJPROP_HIDDEN,hidden); //--- установим приоритет на получение события нажатия мыши на графике ObjectSetInteger(chart_ID,name,OBJPROP_ZORDER,z_order); //--- успешное выполнение return(true); } //---- void GetDell(string name="ytg.com.ua") { string vName; for(int i=ObjectsTotal(0,0)-1; i>=0;i--) { vName=ObjectName(0,i); if(StringFind(vName,name)!=-1) ObjectDelete(0,vName); } } //----