Возникла идея проверки дрейфа оптимальной настройки во времени. Чтот-то типа оконного анализа и вывода результатов в одном окне оптимизатора.
Например проверка периода HMA (https://alfadirect4.ru/viewtopic.php?f=16&t=13&p=3151&hilit=hull#p15) на инструменте SNGS.
недостатки - возможна проверка только одного параметра робота
достоинства
- видна степень случайности успеха и достижения робота в границах сразу нескольких интервалов:)
- инерционность исслелуемого параметра или целесообразность его подстройки по предыущему периоду и т.п.
Код: Выделить всё
/**
проверка оптимального параметра во времени
сигналы это экстремумы hma;
период N - период HMA;
month - количество интервалов для проверки
d1 дата начала интервала проверки = месяц + год * 12
1) нажимаем кнопку оптимизировать
2) Задаем инструмент, тайм фрейм, даты интервала оптимизации входного инструмента
3) по началу интервала рассчитываем d1 = месяц + год * 12
4) в последнем окне указываем d1 и исследуемые параметры
Algorithm = hma;
**/
function Initialize()
{
StrategyName = "My_hma_interval";
AddParameter("N", 10, "период HMA", 1);
AddParameter("month", 12, "Интервал, проверки месяцев", 1);
AddParameter("d1", 24337, "(09.2019 -> 24237 = 2019 * 12 + 9", 1);
AddInput("Input1", Inputs.Candle, 20, true, "SNGS=МБ ЦК");
LongLimit = 1;
ShortLimit = -1;
AddChartIndicator("MY.HMA", new Dictionary <string, string>{{"P", "N"}});
}
function OnUpdate()
{
if (((BarDate().Year * 12 + BarDate().Month- d1) > (month-1)) && ((BarDate().Year * 12 + BarDate().Month-d1) <= month))
{
/// ПРАВИЛО 1
if ( (CurrentPosition() == 0) && (MY.HMA(Input1.Close, N).GetValue("HMA", 0) > MY.HMA(Input1.Close, N).GetValue("HMA", 1)) )
{
EnterLong();
}
/// ПРАВИЛО 2
if ( (CurrentPosition() == 0) && (MY.HMA(Input1.Close, N).GetValue("HMA", 0) < MY.HMA(Input1.Close, N).GetValue("HMA", 1)) )
{
EnterShort();
}
/// ПРАВИЛО 3
if ( (CurrentPosition() < 0) && (MY.HMA(Input1.Close, N).GetValue("HMA", 0) > MY.HMA(Input1.Close, N).GetValue("HMA", 1)) )
{
EnterLong();
}
/// ПРАВИЛО 4
if ( (CurrentPosition() > 0) && (MY.HMA(Input1.Close, N).GetValue("HMA", 0) < MY.HMA(Input1.Close, N).GetValue("HMA", 1)) )
{
EnterShort();
}
}
else
{
if (CurrentPosition() != 0) ClosePosition();
}
}
вроде работает
но есть проблема. через раз появляется сообщение
Вопросы:
1) как купировать ошибку?
2) может у кого то возникнут идеи как универсализировать эту штуку для всех роботов
3) более удобной настройки интервалов, напр автоматическое определение d1