Как вычислить значение трендовой линии?

 

Советник использует графические объекты в частности трендовую линию. Когда пытаюсь прогнать в тестере то не просходит ни одной сделки. Поискав на форуме нашел, что уже сталкивались с такой проблемой.


Ответ сервисдеск:
В данный момент тестерному агенту не передаётся никакой информации о графических объектах, которые должны быть на графике. Мы этот момент исправим, но немного погодя. Пока отложим.

В МТ4 сталкивался с такой проблемой, в тестере работает советник, а при оптимизации не производити ни одной сделки. В прошлом пытался вычислять значения линии, но что то не получилось и забросил. Сейчас вернулся к этому вопросу и попытался еще раз. Вот что вышло:

Трендовая линия, она должна задаваться уравнением прямой проходящей через две точки так как стандартная функция в МТ4

ObjectCreate("LineSupport", OBJ_TREND, 0, gBufDownDate[gDown - 2], gBufDownPrice[gDown - 2], gBufDownDate[gDown - 1], gBufDownPrice[gDown - 1])

строится по двум точкам.

Общее уравнение проходящее через две точки
(y-y1)/(y2-y1)=(x-x1)/(x2-x1)
преобразовав получаю
(y1-y2)x+(x2-x1)y+(x1y2-x2y1)=0
Ax+By+C=0
y=-1*Ax/B-C/B
в эксперте устанавливаю коэффициенты (x время, y цена)

void SetKoeff(datetime pX1, double pY1, datetime pX2, double pY2)
 {

  Exp_A = pY1-pY2;
  Exp_B = pX2 - pX1;
  Exp_C = pX1*pY2-pX2*pY1;
 }

и получаю цену в зависимости от времени


double ObjectGetValueByTimeMy()
 {
  double Result;
  datetime nTime;
  if (Exp_B !=0)
   {
    nTime = TimeCurrent();
    Result = -1 * ( (Exp_A*nTime) / Exp_B) - Exp_C/Exp_B;
    Result = NormalizeDouble(Result, Digits);
   }
  else
   {
    Result = 0;
   }
  return(Result);
 }

и вот это моя функция ObjectGetValueByTimeMy() может вернуть значение
1) значение равное стандартной функции ObjectGetValueByTime
2) значение отличающееся на пару пунктов
3) значение отличающееся на 100 пунктов (символ 4-ре знака)
Тестировал на МТ4 так как на МТ5 даже сравнивать не счем.
Где может быть ошибка? Или может по другому нужно вычислять значение цены в зависимости от времени?

Документация по MQL5: Графические объекты / ObjectGetValueByTime
Документация по MQL5: Графические объекты / ObjectGetValueByTime
  • www.mql5.com
Графические объекты / ObjectGetValueByTime - Документация по MQL5
 

Мне кажется, все гораздо проще:

value_barN = value_bar1 + (index_bar1 - index_barN) * (value_bar2 - value_bar1) / (index_bar1 - index_bar2);


Т.е. для нахождения значения линии на баре N надо:

  • посчитать, на сколько меняется линия за один бар:
    (value_bar2 - value_bar1) / (index_bar1 - index_bar2)
  • найти смещение бара N относительно первого бара линии:
    (index_bar1 - index_barN)
  • и прибавить произведение 1 и 2 к значению линии в точке 1.

Писал когда-то для 4-ки, работало точно.

PS: Индексация тоже четверочная, т.е. bar1 левее bar2 (и имеет бОльший индекс).

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