ObjectGetValueByTime(...) - эта функция работает неправильно...

 

Вот такой код для проверки:

1. рисуется канал OBJ_CHANNEL, через точки 1-2 проводится линия 0 , через точку 3 проводится линия 1 параллельно линии 0

2. с помощью этой функции вычисляются значения обоих линий в момент времени Time[1]

   

double d_line_0_12 = ObjectGetValueByTime(0,"Channel",Time[1],0);                                        

double d_line_1_33 = ObjectGetValueByTime(0,"Channel",Time[1],1); 

 

значение линии 0 правильное, для линии 1 получаем какую-то чепуху.

Программу для проверки прикрепляю... 

Файлы:
test.mq4  4 kb
 
Какой канал создали, то и получили. Посмотрите на график какой канал получается.
 
Integer:
Какой канал создали, то и получили. Посмотрите на график какой канал получается.

все работает отлично, в том числе и в тестере.

фишка заключается в том, что чтение  значений линий этой функцией  ObjectGetValueByTime  на том же тике, на котором канал создается, 

дает неправильные значения, но чтение  на более поздних тиках  дает правильный результат.

вот тестовая прога:

 

//+------------------------------------------------------------------+
//|                                                         Test.mq4 |
//|                        Copyright 2015, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2015, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
//+------------------------------------------------------------------+
struct k_Point
{
   datetime dt_Time;
   double   d_Price;
};
//+------------------------------------------------------------------+
struct k_Channel
{
   string   sw_Name;
   datetime dt_ChanID;
   k_Point  kLine_0_Points[2];
   k_Point  kLine_1_Point;
};
//+------------------------------------------------------------------+
k_Channel gkChan;
datetime gdt_ChanID;
//+------------------------------------------------------------------+

int OnInit()
{
   gkChan.sw_Name   = "Channel";
   gkChan.dt_ChanID = 0;
   
   gkChan.kLine_0_Points[0].dt_Time = Time[5];
   gkChan.kLine_0_Points[0].d_Price = Low[5];
   gkChan.kLine_0_Points[1].dt_Time = Time[1];
   gkChan.kLine_0_Points[1].d_Price = High[1];
   
   gkChan.kLine_1_Point.dt_Time = Time[5];
   gkChan.kLine_1_Point.d_Price = High[5];
   
   EventSetTimer(60);
      
   return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
   ObjectDelete(gkChan.sw_Name);
   EventKillTimer();
}      
//+------------------------------------------------------------------+
void OnTick()
{
   gdt_ChanID = Time[1];
   if (gkChan.dt_ChanID != gdt_ChanID)
   {
      ObjectDelete(gkChan.sw_Name);
      
      gkChan.dt_ChanID = gdt_ChanID;
      gkChan.kLine_0_Points[0].dt_Time = Time[5];
      gkChan.kLine_0_Points[0].d_Price = Low[5];
      gkChan.kLine_0_Points[1].dt_Time = Time[1];
      gkChan.kLine_0_Points[1].d_Price = High[1];
   
      gkChan.kLine_1_Point.dt_Time = Time[5];
      gkChan.kLine_1_Point.d_Price = High[5];
      ObjectCreate(gkChan.sw_Name,OBJ_CHANNEL,0,gkChan.kLine_0_Points[0].dt_Time,
                                                gkChan.kLine_0_Points[0].d_Price,
                                                gkChan.kLine_0_Points[1].dt_Time,
                                                gkChan.kLine_0_Points[1].d_Price, 
                                                gkChan.kLine_1_Point.dt_Time,
                                                gkChan.kLine_1_Point.d_Price);
      return;                                                
   }
   double d_line_0 = ObjectGetValueByTime(0,gkChan.sw_Name,Time[1],0);                                        
   double d_line_1 = ObjectGetValueByTime(0,gkChan.sw_Name,Time[1],1); 
   
   Print(" d_line_0=",d_line_0);                                      
   Print(" d_line_1=",d_line_1);                                      
}
//+------------------------------------------------------------------+
void OnTimer()
{
   
}
//+------------------------------------------------------------------+
void OnChartEvent(const int id,
                  const long &lparam,
                  const double &dparam,
                  const string &sparam)
{
   
}
//+------------------------------------------------------------------+

 
DenisSergeev:

все работает отлично, в том числе и в тестере.

фишка заключается в том, что чтение  значений линий этой функцией  ObjectGetValueByTime  на том же тике, на котором канал создается, 

дает неправильные значения, но чтение  на более поздних тиках  дает правильный результат.

вот тестовая прога:

 


Денис, на тике, когда "канал создается", еще нет будущего тика, который сформировал бы вторую точку линии 1; ну а по одной точке линию рисовать - только мусор собирать от предыдущих рисований.  
 
tara:
Денис, на тике, когда "канал создается", еще нет будущего тика, который сформировал бы вторую точку линии 1; ну а по одной точке линию рисовать - только мусор собирать от предыдущих рисований.  
Какая вторая точка? Все параметры канала уже установлены, значит должно работать. Зачем притягивать всякие нелепые объяснения за уши? Явный баг. 
 
Integer:
Какая вторая точка? Все параметры канала уже установлены, значит должно работать. Зачем притягивать всякие нелепые объяснения за уши? Явный баг. 

В канале существует четвёртая точка, которую вы не устанавливаете. Вторая точка для второй линии канала. Эта точка рассчитывается только при отрисовке канала. Пока канал не отрисован, про вторую линию спрашивать бесполезно.

Существуют нюансы отрисовки в зависимости от масштаба, минимума и максимума графика. Поэтому эта четвёртая точка и рассчитывается только при отрисовке.

Почему-то Вы возбудились на этот "явный баг" спустя всего 10 лет от его появления.

 
stringo:

В канале существует четвёртая точка, которую вы не устанавливаете. Вторая точка для второй линии канала. Эта точка рассчитывается только при отрисовке канала. Пока канал не отрисован, про вторую линию спрашивать бесполезно.

Существуют нюансы отрисовки в зависимости от масштаба, минимума и максимума графика. Поэтому эта четвёртая точка и рассчитывается только при отрисовке.

Почему-то Вы возбудились на этот "явный баг" спустя всего 10 лет от его появления.

Как не удивительно, и по этому вопросу объяснение, что это не баг, а фича.

"Вы возбудились" - под "Вы" кто подразумевается, я или все участники этой ветки?

 
stringo:

В канале существует четвёртая точка, которую вы не устанавливаете. Вторая точка для второй линии канала. Эта точка рассчитывается только при отрисовке канала. Пока канал не отрисован, про вторую линию спрашивать бесполезно.

Существуют нюансы отрисовки в зависимости от масштаба, минимума и максимума графика. Поэтому эта четвёртая точка и рассчитывается только при отрисовке.

Почему-то Вы возбудились на этот "явный баг" спустя всего 10 лет от его появления.

да, логично, конечно.

а вот интересно, почему эта функция применима тоько для графических объектов определенного типа ?

почему, например, эта функция не применима к вилам андерсона, там три линии, мне приходится строить эти вилы с помощью

двух каналов, поскольку иначе никак не получается поиметь значения линий... 

 
DenisSergeev:

...

двух каналов, поскольку иначе никак не получается поиметь значения линий... 

Иначе можно. Просто взять и рассчитать по координатам точек. Принцип построения вил можно понять посмотрев на них внимательно.  Также и с каналом. Зная координаты трех точек канала можно рассчитать всё остальное не дожидаясь никакого тика.

И нужно иначе, чтобы эксперта можно было оптимизировать.

 
Integer:

Иначе можно. Просто взять и рассчитать по координатам точек. Принцип построения вил можно понять посмотрев на них внимательно.  Также и с каналом. Зная координаты трех точек канала можно рассчитать всё остальное не дожидаясь никакого тика.

И нужно иначе, чтобы эксперта можно было оптимизировать.


Дмитрий, просто - сделайте руками, все станет ясно. 
 
tara:
Дмитрий, просто - сделайте руками, все станет ясно. 
С чего ты взял что мне не ясно? Сделай, чтобы стало ясно тебе. 
Причина обращения: