Возникла идея проверки дрейфа оптимальной настройки во времени. Чтот-то типа оконного анализа и вывода результатов в одном окне оптимизатора.
Например проверка периода 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
 Изображения (1057)
 Изображения (1057) Архивы (82)
 Архивы (82) Текстовые файлы (9)
 Текстовые файлы (9) Документы (7)
 Документы (7) Скрипты Альфа-Директ 4 (30)
 Скрипты Альфа-Директ 4 (30)