Стратегии и роботы > Как протестировать канал линейной регрессии??
Как протестировать канал линейной регрессии??
Как протестировать стратегию на пробой канала LR на исторических данных? Индикатор LinRegChannel строится "задним числом" только по последнему периоду ценового ряда, как получить данные в робот за прошлые периоды - непонятно. Кто-нибудь решал такую задачу? В доступной литературе и в инете я не находил сведений по тестированию стратегий на основе этого канала.
- evge
- Администратор
- Сообщения: 1813
- Зарегистрирован: 04 фев 2016, 09:46
- Откуда: Млечный путь, планета Земля
- Благодарил (а): 83 раза
- Поблагодарили: 369 раз
- Контактная информация:
Re: Как протестировать канал линейной регрессии??
Вот, изменил код, чтоб индикатор сохранял свои значения на истории. Чтобы можно было провести тестирование.
Если его вывести на график, то на каждой точке истории он рисует свое значение уже не в виде прямолинейного канала, а то значение которое было в тот момент истории.
Можете проверить:
Выведите неизмененный LinRegChannel и LinRegChannelST и сравните значения в разных точках истории, обязательно проверяя только на последней точке смещая график, т.к. LinRegChannel перерисует значения в истории.
В истории они совпадают, можно делать тесты на этом индикаторе.
Если его вывести на график, то на каждой точке истории он рисует свое значение уже не в виде прямолинейного канала, а то значение которое было в тот момент истории.
Можете проверить:
Выведите неизмененный LinRegChannel и LinRegChannelST и сравните значения в разных точках истории, обязательно проверяя только на последней точке смещая график, т.к. LinRegChannel перерисует значения в истории.
В истории они совпадают, можно делать тесты на этом индикаторе.
Код: Выделить всё
function Initialize()
{
IndicatorName = "LinRegChannelST";
PriceStudy = true;
AddInput("Input", Inputs.Price);
AddSeries("LineUp", DrawAs.Line, Color.Red);
AddSeries("LineDn", DrawAs.Line, Color.Red);
AddSeries("LineU2", DrawAs.Line, Color.Gray);
AddSeries("LineD2", DrawAs.Line, Color.Gray);
AddParameter("Period", 100, 1);
AddParameter("Delay", 5);
}
function Evaluate()
{
// AlfaDirect 2016. OX
// Канал линейной регрессии за период (Period) с запаздыванием (Delay)
// Отклоенение считается как максимальное разница цен и базовой регрессии, строится по ценам закрытия.
//if (CurrentIndex == MaxIndex)
{
double a1 = 0.0;
double a2 = 0.0;
double a3 = 0.0;
double a4 = 0.0;
if (CurrentIndex >= Period+Delay )
{
double N = Period;
for (var i = 0; i < N; i++)
{
a1 = a1 + i * Input[-(int)N + 1 + i -Delay];
a2 = a2 + i;
a3 = a3 + Input[-i -Delay];
a4 = a4 + i * i;
}
var alfa = (Period * a1 - a2 * a3) / (N * a4 - a2 * a2);
var beta = (a3 - alfa * a2) / N;
double Sigma1 = 0.0;
double Sigma2 = 0.0;
for (var i = 0; i < N; i++)
{
// Расчет отклонения 1
double a = ((alfa * (i) + beta) - Input[-Period+i+1 -Delay]);
if ( a > Sigma1 )
Sigma1 = a;
// Расчет отклонения 2
a = -((alfa * (i) + beta) - Input[-Period+i+1 -Delay]);
if ( a > Sigma2 )
Sigma2 = a;
}
//for (var i = 0; i < N+Delay; i++)
{
LineUp[0] = alfa * (N+Delay-1) + beta + Sigma1;
LineU2[0] = alfa * (N+Delay-1) + beta + Sigma2;
LineDn[0] = alfa * (N+Delay-1) + beta - Sigma1;
LineD2[0] = alfa * (N+Delay-1) + beta - Sigma2;
//LineUp[-Period+i+1 -Delay] = alfa * (i) + beta + Sigma1;
//LineU2[-Period+i+1 -Delay] = alfa * (i) + beta + Sigma2;
//LineDn[-Period+i+1 -Delay] = alfa * (i) + beta - Sigma1;
//LineD2[-Period+i+1 -Delay] = alfa * (i) + beta - Sigma2;
}
}
}
}
никогда такого не было и вот опять
Re: Как протестировать канал линейной регрессии??
Благодарю. Интересный индикатор получился, что-то типа лент Боллиджера, буду разбираться как он работает 

- evge
- Администратор
- Сообщения: 1813
- Зарегистрирован: 04 фев 2016, 09:46
- Откуда: Млечный путь, планета Земля
- Благодарил (а): 83 раза
- Поблагодарили: 369 раз
- Контактная информация:
Re: Как протестировать канал линейной регрессии??
Небольшое изменение. Надо закомментировать строку
вот так
выше код я поправил.
На результат это не повлияет, но существенно повлияет на скорость работы индикатора, в т.ч. при тестировании стратегий (если вызов неоднократный в стратегии).
Код: Выделить всё
for (var i = 0; i < N+Delay; i++)
вот так
Код: Выделить всё
//for (var i = 0; i < N+Delay; i++)
выше код я поправил.
На результат это не повлияет, но существенно повлияет на скорость работы индикатора, в т.ч. при тестировании стратегий (если вызов неоднократный в стратегии).
никогда такого не было и вот опять
Re: Как протестировать канал линейной регрессии??
Протестировал Сбер. на дневках. Простая реверсная пробойная ТС, не самый трендовый участок истории. Вполне сносно работает, получше Боллинджера, можно брать за основу и дальше дорабатывать

Вернуться в «Стратегии и роботы»
Кто сейчас на конференции
Сейчас этот форум просматривают: нет зарегистрированных пользователей и 8 гостей