Возникла идея проверки дрейфа оптимальной настройки во времени. Чтот-то типа оконного анализа и вывода результатов в одном окне оптимизатора.
Например проверка периода 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
 
  Допустим, что шумность грааля - следствие шума самого ряда, и чтоб это проверить можно попробывать уменьшить этот шум сглаживанием с коротким периодом, а его результат скормить оптимизатору.
 Допустим, что шумность грааля - следствие шума самого ряда, и чтоб это проверить можно попробывать уменьшить этот шум сглаживанием с коротким периодом, а его результат скормить оптимизатору. с др стороны, цена - это лишь одна из проекций многомерного процесса, а в этом случае может быть вполне случайна как и колебание тени от двухзвенного маятника.... но
 с др стороны, цена - это лишь одна из проекций многомерного процесса, а в этом случае может быть вполне случайна как и колебание тени от двухзвенного маятника.... но
 пока это все программировал представил форму линии у которой на каждом шаге меняется период усреднения. Осознав бессмысленность всего, завершил начатоее. Получив результат испытал радость от точности предсказаний
 пока это все программировал представил форму линии у которой на каждом шаге меняется период усреднения. Осознав бессмысленность всего, завершил начатоее. Получив результат испытал радость от точности предсказаний 