время будущего бара на месячном чарте

 

При создании объекта (скажем, отрисовки цены закрытия) 

ObjectCreate(name, OBJ_TREND, 0, Time[i], Close[i], Time[i-1], Close[i])

когда Time [i-1] должен представлять собой следующий (т.е. еще не нарисованный бар), для определения этого самого "следующего" бара часто рекомендуется использовать:

time2 = Time[i]+Period()*60

К сожалению, использование такого определения "следующего" бара вызывает проблемы, вызванными "дырами" в дате. Для избежания таких проблем, я применяю (авторство не мое) такую функцию:

int per=Period()*60;
 datetime time2 = Time[i]+per;
 while(iBarShift(0, 0, time2, true)==-1 && time2<Time[0])
 time2 += per; // если "дыра" в дате

В этом случае, все выходные дни, все нерыночные часы пропускаются, трендовая линия замечательно доводится до следующего видимого бара.

Но...., обнаружена проблема: на МЕСЯЧНЫХ чартах, в месяцах, в которых 31 день не все объекты визуально видны. При этом, в свойствах нарисованных объектов, все эти объекты указываются......, но не все прорисовываются. В свойствах не прорисованных объектов указано,

напр., для июльского бара:

время (1) - 2010.07.01 00:00 время (2) - 2010.07.31 00:00 ......., в то время, как должно быть:

время (1) - 2010.07.01 00:00 время (2) - 2010.08.01 00:00 ..............

(в то же время, для месяцев имеющих 30 дней параметры отрисованных объектов такие: (напр., для апрельского бара:

время (1) - 2010.04.01 00:00 время (2) - 2010.05.01 00:00 .............. - поэтому отрисовывается все очень красиво....)

Т.о. получается, что все объекты как-бы рисуются, но рисуются неправильно (т.е. не дотягиваются до следующего бара, и поэтому, их не видно....)...

  Отсюда вопрос: как заставить, для месячных баров имеющих 31 дней, указывать в качестве time2  01 число следующего месяца, ибо только в этом случае, объекты становятся визуально видны......

 

 
я это дело обходил условием
ddXC=dXB-MathAbs(dXA-dXB)*VP_Kbc_x;
if (ddXC>=0)
   ObjectCreateTrend1("VP_TF1"+TimeToStr(Time[dXA],TIME_DATE)+TimeToStr(Time[dXA],TIME_MINUTES),
   OBJ_TRIANGLE,0,Time[dXA],dA,Time[dXB],dB,Time[ddXC],dB-MathAbs(dA-dB)*VP_Kbc_y,Red);
else
   ObjectCreateTrend1("VP_TF1"+TimeToStr(Time[dXA],TIME_DATE)+TimeToStr(Time[dXA],TIME_MINUTES),
   OBJ_TRIANGLE,0,Time[dXA],dA,Time[dXB],dB,Time[dXB]+NormalizeDouble(MathAbs(dXA-dXB)*VP_Kbc_x*Period()*60,0),dB-MathAbs(dA-dB)*VP_Kbc_y,Red);
выходные тоже как-то обходил сейчас уже не припомню где код, но там вроде просто прибавлял потерянное время выходных
 

Я уже писал, что форма

time2 = Time[i]+Period()*60

- не работает корректно! Может быть, в виде Time[dXB]+NormalizeDouble(MathAbs(dXA-dXB)*VP_Kbc_x*Period()*60,0 и получается все красиво, но в виде

 Time[i]+1*Period()*60,0 мне не удалось достичь такой красоты....

 
Azerus:

Я уже писал, что форма

- не работает корректно! Может быть, в виде Time[dXB]+NormalizeDouble(MathAbs(dXA-dXB)*VP_Kbc_x*Period()*60,0 и получается все красиво, но в виде

Time[i]+1*Period()*60,0 мне не удалось достичь такой красоты....

time2 = Time[i]+Period()*60

работает правильно если i=0

если значение i>0 и Time[i-1] попадает на выходные то лучше к значению Time[i]+Period()*60 прибавить время между последним баром пятницы и первым баром понедельника, по моему по другому не решить.

 

У меня решена проблема "дырки" между пятницей и понедельником.

 Я повторю: проблема  в том, что на месячном чарте, для месяцев, которые содержат 31 день, Время2 определяется как 31-е число текущего месяца (вместо того, что бы определятся как 01 число следующего месяца) - для месяцев которые содержат 30/29/28 дней подобной проблемы не существует (Время2 определяется 01 числом следующего месяца).

код time2 = Time[i]+Preiod()*60 подобной проблемы не решает. Если хотите убедиться в этом - не побрезгуйте повесить код на месячный чарт.......

#property indicator_chart_window

int init()
{  
   return(0);
}
//+------------------------------------------------------------------+
int deinit()
{
   ObjectsDeleteAll(0,OBJ_TREND);
   return(0);
}
//+------------------------------------------------------------------+
int start()
{
   int BarsWind=WindowFirstVisibleBar();
   string name;
   if (true) del(Symbol());

   for(int i=BarsWind; i>=0; i--)

   {

      {
         if (i==0) name=Symbol();
         else name=StringConcatenate(Symbol()," ",Time[i],TIME_DATE|TIME_MINUTES); 
            
      }
//--------------------------------------------------------------------------
      {
//----------------------------------------------------- блок решающий проблему "дыр"         
//         int per=Period()*60;
//         datetime _time=Time[i]+per;
//         while(iBarShift(0,0,_time,true)==-1 && _time<Time[0])
//           _time+=per;                          
//---------------------------------------------------------------------------------         
//         ObjectCreate(nameCandle, OBJ_TREND, 0,Time[i],Close[i],_time,Close[i]);
         
         ObjectCreate(nameCandle, OBJ_TREND, 0,Time[i],Close[i],Time[i]+Period()*60,Close[i]);
         ObjectSet   (nameCandle, OBJPROP_COLOR, Red);
         ObjectSet   (nameCandle, OBJPROP_STYLE, STYLE_SOLID);
         ObjectSet   (nameCandle, OBJPROP_BACK,  false);    
         ObjectSet   (nameCandle, OBJPROP_RAY,   false);
         ObjectSet   (nameCandle, OBJPROP_WIDTH, 2);
       
      }
   }
   return(0);
}

int del(string tekst)
{
   for(int n=ObjectsTotal()-1; n>=0; n--) 
     {
      string Obj_Name=ObjectName(n);
      if (StringFind(Obj_Name,tekst,0) != -1)
      {
         ObjectDelete(Obj_Name);
      }
   }
   return;
}
//+------------------------------------------------------------------+
Причина обращения: