Каталог файлов форума

Список вложений в сообщениях, оставленных на этой конференции.

Все файлы форума: 1270

Добавлено: Prohar » 15 фев 2020, 19:08

Тема: Скользящая (непрерывная, автоматическая) оптимизация

Текст сообщения:

Здравствуйте!
Возникла идея проверки дрейфа оптимальной настройки во времени. Чтот-то типа оконного анализа и вывода результатов в одном окне оптимизатора.
Например проверка периода 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();
}
}


вроде работает
Безымянный.png
Безымянный.png (3.29 КБ) 27751 просмотр


но есть проблема. через раз появляется сообщение
Безымянный1.png


Вопросы:
1) как купировать ошибку?
2) может у кого то возникнут идеи как универсализировать эту штуку для всех роботов
3) более удобной настройки интервалов, напр автоматическое определение d1