Немного подправить индикатор

 

Добрый день Всем!

У меня есть индикатор iMaxMinTrends (он выложен в CodeBase) написанный по моей задумке Алексеем Лопатиным, который куда то пропал. Так вот в нём дневные и недельные уровни верхних и нижних цен перезапускаются нормально с открытием новой недели и дня и с изменением цен, а вот месячные уровни почему то перезапустились немного раньше, как сегодня не 2 октября в понедельник, а 29 сентября в пятницу. Про годовые уровни вообще молчу, их уровни вообще стоят с начала торговли валютой. Что нужно переделать в коде, чтобы верхние и нижние годовые уровни цен открывались в начале этого года, а не в прошлом и так же месячные уровни в начале месяца и изменялись с изменением уровней цен. Индикатор прикладываю.

Файлы:
 
Добрый день Всем!
Что то никто не проявил интерес, думаю надо развернуть код:
//+------------------------------------------------------------------+
//|                                                iMaxMinTrends.mq4 |
//|                                      A.Lopatin & V.Bocharov 2016 |
//|                                              diver.stv@gmail.com |
//+------------------------------------------------------------------+
#property copyright "A.Lopatin & V.Bocharov 2016"
#property link      "diver.stv@gmail.com"
#property version   "1.01"
#property strict
#property indicator_chart_window
#property indicator_buffers 8
#property indicator_plots   8
//--- plot DayHi
#property indicator_label1  "DayHi"
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrWhite
#property indicator_style1  STYLE_SOLID
#property indicator_width1  4
//--- plot DayLow
#property indicator_label2  "DayLow"
#property indicator_type2   DRAW_LINE
#property indicator_color2  clrWhite
#property indicator_style2  STYLE_SOLID
#property indicator_width2  4
//--- plot WeekHi
#property indicator_label3  "WeekHi"
#property indicator_type3   DRAW_LINE
#property indicator_color3  clrYellow
#property indicator_style3  STYLE_SOLID
#property indicator_width3  2
//--- plot WeekLow
#property indicator_label4  "WeekLow"
#property indicator_type4   DRAW_LINE
#property indicator_color4  clrYellow
#property indicator_style4  STYLE_SOLID
#property indicator_width4  2
//--- plot MonthHi
#property indicator_label5  "MonthHi"
#property indicator_type5   DRAW_LINE
#property indicator_color5  clrAqua
#property indicator_style5  STYLE_SOLID
#property indicator_width5  2
//--- plot MonthLow
#property indicator_label6  "MonthLow"
#property indicator_type6   DRAW_LINE
#property indicator_color6  clrAqua
#property indicator_style6  STYLE_SOLID
#property indicator_width6  2
//--- plot YearHi
#property indicator_label7  "YearHi"
#property indicator_type7   DRAW_LINE
#property indicator_color7  clrRed
#property indicator_style7  STYLE_SOLID
#property indicator_width7  2
//--- plot YearLow
#property indicator_label8  "YearLow"
#property indicator_type8   DRAW_LINE
#property indicator_color8  clrRed
#property indicator_style8  STYLE_SOLID
#property indicator_width8  2


struct ChartPoint 
{
   double price;
   datetime time;
   
   ChartPoint() : price(0.0), time(0) { };
   ChartPoint(const double y, const datetime x) : price(y), time(x) { };
   ChartPoint(const ChartPoint &r): price(r.price), time(r.time) {};
   void operator= (const ChartPoint &r) {  price = r.price; time = r.time; }; 
   ~ChartPoint() {};
   
   
};

/* --- Color and width settings for the trend lines --- */
input color MonthLinesColor   = clrAqua;
input int   MonthLinesWidth   = 1;
input color WeekLinesColor    = clrRed;
input int   WeekLinesWidth    = 1;
input color YearLinesColor    = clrYellow;
input int   YearLinesWidth    = 1;

//--- indicator buffers
double         DayHiBuffer[];
double         DayLowBuffer[];
double         WeekHiBuffer[];
double         WeekLowBuffer[];
double         MonthHiBuffer[];
double         MonthLowBuffer[];
double         YearHiBuffer[];
double         YearLowBuffer[];

// --- string names for the trend lines
const string up_week_line = "UpperWeekLine", lower_week_line = "LowerWeekLine", up_month_line = "UpperMonthLine", lower_month_line = "LowerMonthLine",
             up_year_line = "UpperYearLine", lower_year_line = "LowerYearLine";
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,DayHiBuffer);
   SetIndexBuffer(1,DayLowBuffer);
   SetIndexBuffer(2,WeekHiBuffer);
   SetIndexBuffer(3,WeekLowBuffer);
   SetIndexBuffer(4,MonthHiBuffer);
   SetIndexBuffer(5,MonthLowBuffer);
   SetIndexBuffer(6,YearHiBuffer);
   SetIndexBuffer(7,YearLowBuffer);
   
   SetIndexEmptyValue(0, 0.0);
   SetIndexEmptyValue(1, 0.0);
   SetIndexEmptyValue(2, 0.0);
   SetIndexEmptyValue(3, 0.0);
   SetIndexEmptyValue(4, 0.0);
   SetIndexEmptyValue(5, 0.0);
   SetIndexEmptyValue(6, 0.0);
   SetIndexEmptyValue(7, 0.0);
//---
   return(INIT_SUCCEEDED);
  }
  
void OnDeinit(const int reason)
{
   // --- Delete lines at deinitialization
   ObjectDelete(up_week_line);
   ObjectDelete(lower_week_line);
   ObjectDelete(up_month_line);
   ObjectDelete(lower_month_line);
   ObjectDelete(up_year_line);
   ObjectDelete(lower_year_line);
}
//+------------------------------------------------------------------+
//| 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[])
  {
   int i = 1, ti  = iTime(Symbol(),1440,0), index = iBarShift(Symbol(), 0, ti),
       up_bar1 = iHighest (Symbol(),0,MODE_HIGH, index,1), low_bar1 = iLowest  (Symbol(),0,MODE_LOW, index,1), up_bar2 = 0, low_bar2 = 0;
   double hi_price = High[up_bar1]; // get day high value
   double low_price = Low [low_bar1]; // get day low value
   
   // --- fill buffers 0.0
   ArrayInitialize(DayHiBuffer, 0.0);
   ArrayInitialize(DayLowBuffer, 0.0);
   ArrayInitialize(WeekHiBuffer, 0.0);
   ArrayInitialize(WeekLowBuffer, 0.0);
   ArrayInitialize(MonthHiBuffer, 0.0);
   ArrayInitialize(MonthLowBuffer, 0.0);
   ArrayInitialize(YearHiBuffer, 0.0);
   ArrayInitialize(YearLowBuffer, 0.0);
   
   // --- fill buffer day high/low values  from 1st closed bar to open time of a day
   for(i = 1;i < index;i++)
   {
      DayHiBuffer[i] = hi_price;
      DayLowBuffer[i] = low_price;
   }
   // --- get time, bar index  for a open time of a week and high/low price
   ti  = iTime(Symbol(),1440,1); index = iBarShift(Symbol(), 0, ti);
   up_bar2 = iHighest (Symbol(),0,MODE_HIGH, index,1); low_bar2 = iLowest(Symbol(),0,MODE_LOW, index,1);
   hi_price = High[up_bar2];
   low_price = Low [low_bar2];
    // --- fill buffer week high/low values  from 1st closed bar to open time of a week
   for(i = 1;i < index;i++)
   {
      WeekHiBuffer[i] = hi_price;
      WeekLowBuffer[i] = low_price;
   }
   // --- draw 2 lines from day to week for high/low
   if( up_bar1 > 0 && up_bar2 > 0 && up_bar1 != up_bar2 && PeriodSeconds() < 1440*60 )
      DrawLine(up_week_line, OBJ_TREND, Time[up_bar2], High[up_bar2], Time[up_bar1], High[up_bar1], WeekLinesColor, WeekLinesWidth);
   if( low_bar1 > 0 && low_bar2 > 0 && low_bar1 != low_bar2 && PeriodSeconds() < 1440*60 )
      DrawLine(lower_week_line, OBJ_TREND, Time[low_bar2], Low[low_bar2], Time[low_bar1], Low[low_bar1], WeekLinesColor, WeekLinesWidth);
      
   ti  = iTime(Symbol(),43200,0); index = iBarShift(Symbol(), 0, ti);
   up_bar1 = iHighest (Symbol(),0,MODE_HIGH, index,1); low_bar1 = iLowest  (Symbol(),0,MODE_LOW, index,1);
   hi_price = High[up_bar1];
   low_price = Low [low_bar1];
   
   for(i = 1;i < index;i++)
   {
      MonthHiBuffer[i] = hi_price;
      MonthLowBuffer[i] = low_price;
   }
   
   if( up_bar1 > 0 && up_bar2 > 0 && up_bar1 != up_bar2 && PeriodSeconds() < 10080*60 )
      DrawLine(up_month_line, OBJ_TREND, Time[up_bar1], High[up_bar1], Time[up_bar2], High[up_bar2], MonthLinesColor, MonthLinesWidth);
   if( low_bar1 > 0 && low_bar2 > 0 && low_bar1 != low_bar2 && PeriodSeconds() < 10080*60 )
      DrawLine(lower_month_line, OBJ_TREND, Time[low_bar1], Low[low_bar1], Time[low_bar2], Low[low_bar2], MonthLinesColor, MonthLinesWidth);
 
      
   ti  = iTime(Symbol(),518400,0); index = iBarShift(Symbol(), 0, ti);
   up_bar2 = iHighest (Symbol(),0,MODE_HIGH, index,1); low_bar2 = iLowest  (Symbol(),0,MODE_LOW, index,1);
   hi_price = High[up_bar2];
   low_price = Low [low_bar2];
   
   for(i = 1;i < index;i++)
   {
      YearHiBuffer[i] = hi_price;
      YearLowBuffer[i] = low_price;
   }
      
   if( up_bar1 > 0 && up_bar2 > 0 && up_bar1 != up_bar2 && PeriodSeconds() < 43200*60 )
      DrawLine(up_year_line, OBJ_TREND, Time[up_bar2], High[up_bar2], Time[up_bar1], High[up_bar1], YearLinesColor, YearLinesWidth);
   if( low_bar1 > 0 && low_bar2 > 0 && low_bar1 != low_bar2 && PeriodSeconds() < 43200*60 )
      DrawLine(lower_year_line, OBJ_TREND, Time[low_bar2], Low[low_bar2], Time[low_bar1], Low[low_bar1], YearLinesColor, YearLinesWidth);
   
   return(rates_total);
  }
//+------------------------------------------------------------------+

//+------------------------------------------------------------------+
//|               The function draws trend line                      |
//+------------------------------------------------------------------+

void DrawLine(string name,int type,datetime time1,double price1,datetime time2,double price2,color line_color,int line_width=1,int line_style=STYLE_SOLID)
{
    if(ObjectFind(name)==-1)
    {
      ObjectCreate(name,type,0,time1,price1,time2,price2);
      ObjectSet(name,OBJPROP_COLOR,line_color);
      ObjectSet(name,OBJPROP_WIDTH,line_width);
      ObjectSet(name,OBJPROP_STYLE,line_style);
    }
    else
    { 
      ObjectSet(name,OBJPROP_TIME1,time1);
      ObjectSet(name,OBJPROP_PRICE1,price1);
      ObjectSet(name,OBJPROP_TIME2,time2);
      ObjectSet(name,OBJPROP_PRICE2,price2);
      ObjectSet(name,OBJPROP_COLOR,line_color);
      ObjectSet(name,OBJPROP_STYLE,line_style);
      ObjectSet(name,OBJPROP_WIDTH,line_width);
    }
}
 
bar:

оке!

 

Сразу с ходу, в чем могла собака порыться))

   ti  = iTime(Symbol(),1440,0), 

   index = iBarShift(Symbol(), 0, ti), 

Бара с точным временем начала дня может не существовать, поэтому попадаем на предыдущий бар, а в понедельник, это пятница прошлой недели.
 
Эта тема закрывается! Прошу администрацию закрыть эту тему.
 

Вот эту строчку:

ti  = iTime(Symbol(),43200,0); index = iBarShift(Symbol(), 0, ti);

Заменить на:

ti  = iTime(Symbol(),43200,0); index = iBarShift(Symbol(), 0, ti);
if(iTime(Symbol(),43200,index)<ti)index--;

То есть добавит еще одну строку.

Причина обращения: