
1) ошибка перестает появляться если выполнить оптимизацию другой стратегии
2)переписал код. теперь ширина окна и шаг его перемещения настраиваются отдельно. Шаг может быть уже окна, тогда окно двигается подобно скользящему среднему
3) d1 вычисляется сам
Код: Выделить всё
/**
проверка оптимального параметра во времени
сигналы это экстремумы hma;
период N - период HMA;
day- количество интервалов для проверки
1) нажимаем кнопку оптимизировать
2) Задаем инструмент, тайм фрейм, даты интервала оптимизации входного инструмента
3) ширина окна - интервал на котором исследуется параметр
4) в настройке оптимизации задаем номера шагов мин = 1 /макс = интервал оптимизации в днях(можно с запасом) и размер шага. если размер шага == ширене окна, то окна не накладываются друг на друга
Algorithm = hma;
**/
function Initialize()
{
StrategyName = "My_Opt_hma_var_interval";
AddParameter("N", 10, "период HMA", 1);
//AddParameter("kl", -1, "", 1);
//AddParameter("kp", 1, "", 1);
AddParameter("day_in_w", 30, "дней в окне", 1);
AddParameter("step", 180,"количество шагов шаги", 1);
// AddParameter("d1", 727110.0, "(09.2019 = 24237 *начала = год*12+месяц", 1);
AddInput("Input1", Inputs.Candle, 20, true, "SNGS=МБ ЦК");
LongLimit = 1;
ShortLimit = -1;
AddChartIndicator("MY.HMA", new Dictionary <string, string>{{"P", "N"}});
AddGlobalVariable("d1", Types.Double, 0);
AddGlobalVariable("b", Types.Int, 0);
}
function OnUpdate()
{
if (b == 0) //первый запуск
{
b = 1;
//d1 = BarDate().Year * 12.0 + BarDate().Month;
d1 = ((BarDate().Year * 12.0 + BarDate().Month) * 30 + BarDate().Day);
}
if (( ( ( (BarDate().Year * 12.0 + BarDate().Month) * 30 + BarDate().Day)- d1) > ((step)) ) && ( ((BarDate().Year * 12.0 + BarDate().Month) * 30 + BarDate().Day- d1) <= (day_in_w+step)))
{
/// ПРАВИЛО 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) либо графики в окне оптимизации не подходят для поиска оптимального параметра, либо неудачно выбрано отображение (интуитивнохочется посмотреть на линии уровня или линии локальных максимумов пущенные вдоль одной из осей (форватеров, хребтов и т.п.)), либо оптимальный параметр случаен и безинерционен
ниже исследования изменения оптимального периода HMA с сентября по настоящее время для инструмента SNGS 20мин
ширина окна 30 дней, шаг 30 дней
ширина окна 30 дней, шаг 7 дней
ширина окна 30 дней, шаг 1 дннь
ширина окна 7 дней, шаг 1 дннь
не разобрался как прятать эти простыни под сполер
up: исправил
Код: Выделить всё
if (( ( ( (BarDate().Year * 12.0 + BarDate().Month) * 30 + BarDate().Day)- d1) >= ((step)) ) && ( ((BarDate().Year * 12.0 + BarDate().Month) * 30 + BarDate().Day- d1) <= (day_in_w+step)))
на
Код: Выделить всё
if (( ( ( (BarDate().Year * 12.0 + BarDate().Month) * 30 + BarDate().Day)- d1) > ((step)) ) && ( ((BarDate().Year * 12.0 + BarDate().Month) * 30 + BarDate().Day- d1) <= (day_in_w+step)))