ObjectValueByTime() не возвращает значение линии тренда, такое же, как на графике

 

Привет, я нарисовал линию тренда на графике, и я фиксирую значение линии тренда, используя функцию ObjectValueByTime().

Но значение на диаграмме отличается от значения, заданного ObjectValueByTime().

Я думал, что моя пользовательская функция не работает. Но я получаю одно и то же значение из пользовательской функции и из ObjectValueByTime().

Моя пользовательская функция:

double            ObjectGetValueByTime_Local(const  datetime left_bar_time, const  double left_price, const  datetime right_bar_time, const  double right_price, const  datetime time_want_to_know_price, ENUM_TIMEFRAMES period)
  {
   int left_bar   = iBarShift(Symbol(), period, left_bar_time),
       right_bar  = iBarShift(Symbol(), period, right_bar_time),
       shift      = iBarShift(Symbol(), period, time_want_to_know_price);

   if(left_bar == -1 || right_bar == -1 || shift == -1)
      return 0;

   return right_bar == left_bar? left_price: double(NormalizeDouble((right_price-left_price) / (right_bar-left_bar) * (shift-left_bar) + left_price, Digits()));
  }

Снимок напечатанных значений:

Пожалуйста, помогите мне с этим. Как я могу получить значение, которое находится на графике в моей программе, а не какие-то странные значения.

 

Функция объявлена как double, а возвращает bool:

return right_bar == left_bar? left_price: double(NormalizeDouble((right_price-left_price) / (right_bar-left_bar) * (shift-left_bar) + left_price, Digits()));

Да и скобки бы неплохо поставить. Думаю (не проверял), правильнее было бы вот так:

if (right_bar == left_bar)
   return 0.0;

double fKCoef = (right_price - left_price) / (right_bar - left_bar);
double fBCoef = right_price - fKCoef * right_bar;

return NormalizeDouble(fKCoef * shift + fBCoef, Digits());
 
Ihor Herasko # :

Функция объявлена как double, а возвращает bool:

Да и скобки бы неплохо поставить. Думаю (не проверял), правильнее было бы вот так:

Спасибо за ответ. Но, как вы можете видеть на изображении, я получаю не логическое значение, а двойное значение, точно такое же, как значение, возвращаемое функцией ObjectGetValueByTime().

И даже зная, что я пробовал ваше решение, но оно не сработало.

 
Я вижу, что график нормализует значение с диапазоном цены графика. Может ли кто-нибудь сказать мне, какой метод нормализации используется, потому что метод нормализации MIN MAX неверен?
 
jaffer wilson #:
Я вижу, что график нормализует значение с диапазоном цены графика. Может ли кто-нибудь сказать мне, какой метод нормализации используется, потому что метод нормализации MIN MAX неверен?

Дело не в методе нормализации, а в методе построения прямой. Бар - это довольно большой массив информации, а прямая строится по двум конкретным точкам. Постройте сами Y=AX+B. 

 
А еще, можете почитать документацию и добавить имя объекта. Будет счастье. 
 
Ihor Herasko #:

Функция объявлена как double, а возвращает bool:

Да и скобки бы неплохо поставить. Думаю (не проверял), правильнее было бы вот так:

Игорь, вы посмотрели не всю строку и поспешили с выводами. Там условный оператор ?:

 
Alexey Viktorov #:

Игорь, вы посмотрели не всю строку и поспешили с выводами. Там условный оператор ?:

Алексей, Вы посмотрели не весь ответ. Условный оператор там ничего не решает.

 
jaffer wilson #:

Спасибо за ответ. Но, как вы можете видеть на изображении, я получаю не логическое значение, а двойное значение, точно такое же, как значение, возвращаемое функцией ObjectGetValueByTime().

Там какая-то хитрая конструкуция получается. С одной стороны приводите к double, а с другой стороны - оператор сравнения, подразумевающий bool, который все равно потом приводится к double.

И даже зная, что я пробовал ваше решение, но оно не сработало.

А можете представить воспроизводимый пример того, как не сработало? Иначе так еще можно очень долго гадать, что там не получается. В принципе то вопрос простой - уравнение прямой. 

 
jaffer wilson:

Привет, я нарисовал линию тренда на графике, и я фиксирую значение линии тренда, используя функцию ObjectValueByTime().

Но значение на диаграмме отличается от значения, заданного ObjectValueByTime().

Я думал, что моя пользовательская функция не работает. Но я получаю одно и то же значение из пользовательской функции и из ObjectValueByTime().

Моя пользовательская функция:

Снимок напечатанных значений:

Пожалуйста, помогите мне с этим. Как я могу получить значение, которое находится на графике в моей программе, а не какие-то странные значения.

Под курсором мышки вы видите не цену трендовой линии, а цену курсора в текущий момент. Вывод: Функция возвращает истинное значение. И не важно как это значение нормализуется.

 
Ihor Herasko #:

Алексей, Вы посмотрели не весь ответ. Условный оператор там ничего не решает.

Ну как не решает? Вы выделили знак == но это не значение возвращаемое функцией, а всего-лишь условие по которому будет возвращено одно из значений. И то что дальше не имеет значения. Ваш пример всего-лишь другое решение.

Документация по MQL5: Основы языка / Операторы / Условный оператор ?:
Документация по MQL5: Основы языка / Операторы / Условный оператор ?:
  • www.mql5.com
Условный оператор ?: - Операторы - Основы языка - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
Причина обращения: