Мне кажется, все гораздо проще:
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 (и имеет бОльший индекс).
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Советник использует графические объекты в частности трендовую линию. Когда пытаюсь прогнать в тестере то не просходит ни одной сделки. Поискав на форуме нашел, что уже сталкивались с такой проблемой.
Ответ сервисдеск:
В данный момент тестерному агенту не передаётся никакой информации о графических объектах, которые должны быть на графике. Мы этот момент исправим, но немного погодя. Пока отложим.
В МТ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 даже сравнивать не счем.
Где может быть ошибка? Или может по другому нужно вычислять значение цены в зависимости от времени?