Какой канал создали, то и получили. Посмотрите на график какой канал получается.
все работает отлично, в том числе и в тестере.
фишка заключается в том, что чтение значений линий этой функцией 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) { } //+------------------------------------------------------------------+
все работает отлично, в том числе и в тестере.
фишка заключается в том, что чтение значений линий этой функцией ObjectGetValueByTime на том же тике, на котором канал создается,
дает неправильные значения, но чтение на более поздних тиках дает правильный результат.
вот тестовая прога:
Денис, на тике, когда "канал создается", еще нет будущего тика, который сформировал бы вторую точку линии 1; ну а по одной точке линию рисовать - только мусор собирать от предыдущих рисований.
Какая вторая точка? Все параметры канала уже установлены, значит должно работать. Зачем притягивать всякие нелепые объяснения за уши? Явный баг.
В канале существует четвёртая точка, которую вы не устанавливаете. Вторая точка для второй линии канала. Эта точка рассчитывается только при отрисовке канала. Пока канал не отрисован, про вторую линию спрашивать бесполезно.
Существуют нюансы отрисовки в зависимости от масштаба, минимума и максимума графика. Поэтому эта четвёртая точка и рассчитывается только при отрисовке.
Почему-то Вы возбудились на этот "явный баг" спустя всего 10 лет от его появления.
В канале существует четвёртая точка, которую вы не устанавливаете. Вторая точка для второй линии канала. Эта точка рассчитывается только при отрисовке канала. Пока канал не отрисован, про вторую линию спрашивать бесполезно.
Существуют нюансы отрисовки в зависимости от масштаба, минимума и максимума графика. Поэтому эта четвёртая точка и рассчитывается только при отрисовке.
Почему-то Вы возбудились на этот "явный баг" спустя всего 10 лет от его появления.
Как не удивительно, и по этому вопросу объяснение, что это не баг, а фича.
"Вы возбудились" - под "Вы" кто подразумевается, я или все участники этой ветки?
В канале существует четвёртая точка, которую вы не устанавливаете. Вторая точка для второй линии канала. Эта точка рассчитывается только при отрисовке канала. Пока канал не отрисован, про вторую линию спрашивать бесполезно.
Существуют нюансы отрисовки в зависимости от масштаба, минимума и максимума графика. Поэтому эта четвёртая точка и рассчитывается только при отрисовке.
Почему-то Вы возбудились на этот "явный баг" спустя всего 10 лет от его появления.
да, логично, конечно.
а вот интересно, почему эта функция применима тоько для графических объектов определенного типа ?
почему, например, эта функция не применима к вилам андерсона, там три линии, мне приходится строить эти вилы с помощью
двух каналов, поскольку иначе никак не получается поиметь значения линий...
...
двух каналов, поскольку иначе никак не получается поиметь значения линий...
Иначе можно. Просто взять и рассчитать по координатам точек. Принцип построения вил можно понять посмотрев на них внимательно. Также и с каналом. Зная координаты трех точек канала можно рассчитать всё остальное не дожидаясь никакого тика.
И нужно иначе, чтобы эксперта можно было оптимизировать.
Иначе можно. Просто взять и рассчитать по координатам точек. Принцип построения вил можно понять посмотрев на них внимательно. Также и с каналом. Зная координаты трех точек канала можно рассчитать всё остальное не дожидаясь никакого тика.
И нужно иначе, чтобы эксперта можно было оптимизировать.
Дмитрий, просто - сделайте руками, все станет ясно.

- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Вот такой код для проверки:
1. рисуется канал OBJ_CHANNEL, через точки 1-2 проводится линия 0 , через точку 3 проводится линия 1 параллельно линии 0
2. с помощью этой функции вычисляются значения обоих линий в момент времени Time[1]
значение линии 0 правильное, для линии 1 получаем какую-то чепуху.
Программу для проверки прикрепляю...