Страница 2 из 4

Re: Fractal – фрактал (экстремум)

Добавлено: 21 май 2018, 12:28
evge
Т.к. H и L заполняются не на каждом баре, а имеют вид сигнала заполняя значение на только на определенных барах, то прочитать их по индексу не получится, т.к. в предыдущем баре может значение быть не заданным.

Хотя конечно можно получить последние установленные значения серий H и L, используя недокументированную функцию GetLastValues("Ряд", количество)

Код: Выделить всё

   var F = MY.Fractal(Input1, 5);
   var FH = F.GetLastValues("H", 1);
   var FL = F.GetLastValues("L", 1);


Значения будут в FH[0].Y и FL[0].Y

А теперь про тестирование.

Вот пример тестирования стратегии на индикаторах рисующих задним числом фракталы (создано в конструкторе)

Код: Выделить всё

/**

Hash code B908FE68F613BDEC0878137E6D7E1880
**/
function Initialize()
{
   StrategyName = "FractalTest";
   AddParameter("P1", 0, "", 1);
   AddInput("Input1", Inputs.Candle, 5, true, "SRM8=ФОРТС");
   LongLimit = 44;
   ShortLimit = -44;
   AddChartIndicator("MY.Fractal", new Dictionary <string, double>{{"Period", 5}});
}

function OnUpdate()
{
   /// ПРАВИЛО 1
   if ( (MY.Fractal(Input1, 5).GetValue("H", 0) > 0) )
   {
      EnterShort();
   }

   /// ПРАВИЛО 2
   if ( (MY.Fractal(Input1, 5).GetValue("L", 0) > 0) )
   {
      EnterLong();
   }

}


А вот какой результат по итогам тестирования:
FractalTest-01.png
FractalTest-01.png (44.98 КБ) 30546 просмотров


Как и писал выше тестирование будет жестоко обманывать :) давая войти по сигналам из будущего (прошлого, смотря как посмотреть)

Re: Fractal – фрактал (экстремум)

Добавлено: 21 май 2018, 20:44
MonteCristo
Я все равно понять не могу. Откуда там прошлое или будущее. Вот для простоты возьмем фракталы с периодом 1, т.е. по одной свечке от экстремума. Теперь пошагово. Первая свечка LastH = -1, LastL = 1000000000. Вторая свечка, ничего не изменилось. Третья свечка так же. На четвертой свечке мы можем проанализировать три последние свечи и видим, что в серии H, появилось значение, например 100, а цена закрытия 4 свечи 102. Имеем пробитие фрактала вверх -> сигнал к покупке. Если цена 98, то сигнала нет и мы просто в LastH пишем значение 100. Почему так нельзя? Где тут будущее?

Re: Fractal – фрактал (экстремум)

Добавлено: 21 май 2018, 20:45
MonteCristo
Только наоборот LastH и LastL первоначальные значения.

Re: Fractal – фрактал (экстремум)

Добавлено: 21 май 2018, 21:53
evge
Так работает тестирование в АД4.
Если индикатор будет рисовать не на текущем [0] баре, а в историю, как это делает индикатор Fractal в истории H[period], L[period], т.е. на period барах назад от текущего.

Тестирование увидит фрактал на том баре где отрисовал его индикатор, который на самом деле не был бы в реальной жизни определен именно на этом баре, а был бы определен через period баров.

Результат тестирования, с использованием таких индикаторов, я привёл выше.

Re: Fractal – фрактал (экстремум)

Добавлено: 21 май 2018, 22:18
evge
В параллельной ветке форума подсмотрел у себя же, как я же делал по другому полтора года назад, в 2016 г.

Ниже код примера, как протестировать стратегию использующую индикатор Fractal.

Здесь нужно обратить внимание на то какое смещение указано в GetValue(..., Period),

т.е. вызывая индикатор фрактала с некоторым периодом мы этот же период используем как смещение для анализа, если использовать текущий бар со смещением 0, то это будет заглядыванием в будущее!

Код: Выделить всё

function Initialize()
{
   StrategyName = "FractalTest";
   AddParameter("Period", 5, "", 1);
   AddInput("Input1", Inputs.Candle, 5, true, "SRM8=ФОРТС");
   LongLimit = 44;
   ShortLimit = -44;
   AddChartIndicator("MY.Fractal", new Dictionary <string, string>{{"Period", "Period"}});
}

function OnUpdate()
{
   /// ПРАВИЛО 1
   if ( (MY.Fractal(Input1, Period).GetValue("H", (int)Period) > 0) )
   {
      EnterShort();
   }

   /// ПРАВИЛО 2
   if ( (MY.Fractal(Input1, Period).GetValue("L", (int)Period) > 0) )
   {
      EnterLong();
   }

}


Вот результат уже похож на правду

FractalTest-02.png
FractalTest-02.png (38.46 КБ) 30509 просмотров

FractalTest-03.png
FractalTest-03.png (37.04 КБ) 30509 просмотров


теперь мы видим, что позиции открываются после реального обнаружения фрактала, на том баре где фракталы были обнаружены реально.

Re: Fractal – фрактал (экстремум)

Добавлено: 22 май 2018, 00:10
MonteCristo
Да, теперь понял, спасибо. Жаль, что именно так работает тестер. Надо бы развивать инструмент.

Re: Fractal – фрактал (экстремум)

Добавлено: 22 май 2018, 14:22
evge
Немного модифицированный фрактал.

Можно задать количество баров для поиска экстремума слева и справа по отдельности.

Period1 - бары слева
Period2 - бары справа

Код: Выделить всё

function Initialize()
{
    IndicatorName = "Fractal2";
    AddInput("Input", Inputs.Candle);
    AddParameter("Period1", 15);
    AddParameter("Period2", 5);
    PriceStudy = true;
    AddSeries("H", DrawAs.Custom, Color.Coral);
    AddSeries("L", DrawAs.Custom, Color.LightGreen);
}

function Evaluate()
{

   // evge 22.05.2018 http://alfadirect4.ru

    if (CurrentIndex > Period1 + Period2)
    {
        var xH = true;
        var xL = true;
        var HPoint = Input.High[-Period2];
        var LPoint = Input.Low[-Period2];
        for (var i = 0; i < Math.Max(Period1, Period2); i++)
        {
           if (i < Period1)
           {
              if (Input.High[Period2 + i + 1] > HPoint) xH = false;
              if (Input.Low[Period2 + i + 1] < LPoint) xL = false;
           }
           if (i < Period2)
           {
              if (Input.High[i] > HPoint) xH = false;
              if (Input.Low[i] < LPoint) xL = false;
           }
        }
        if (xH) H[Period2] = HPoint;
        if (xL) L[Period2] = LPoint;
        H.DrawArrowDown();
        L.DrawArrowUp();
    }
}


Скачать индикатор

Fractal2.zip
(908 байт) 1400 скачиваний

Re: Fractal – фрактал (экстремум)

Добавлено: 29 май 2018, 22:49
MonteCristo

Код: Выделить всё

/**
Algorithm = ТРЕНД;
**/

function Initialize()
{
   StrategyName = "My_Fractals";
   AddInput("Input1", Inputs.Candle, 60, true, "SBER=МБ ЦК");
   AddParameter("Period", 2, "Порядок фрактала");
   LongLimit = 1;
   ShortLimit = -1;
   AddChartIndicator("MY.Fractal", new Dictionary <string, string>{{"Period", "Period"}});
   AddGlobalVariable("last_high_fractal", Types.Double, 10000000000.0);
   AddGlobalVariable("last_low_fractal", Types.Double, -1.0);
}

function OnUpdate()
{
   var fractal = MY.Fractal(Input1, Period);
   var h = fractal["H"];
   var l = fractal["L"];
   if(!Double.IsNaN(h[Period])) last_high_fractal = h[Period];
   if(!Double.IsNaN(l[Period])) last_low_fractal = l[Period];   
      
   /// ПРАВИЛО 1
   if ( Input1.High[0] > last_high_fractal )
   {
      EnterLong();
   }

   /// ПРАВИЛО 2
   if ( Input1.Low[0] < last_low_fractal )
   {
      CloseLong();
   }

}


Евгений, вот собственно то, о чем я Вас спрашивал. Не вижу где тут заглядывание в будущее. Сделки открываются после пробития фрактала последнего.

Re: Fractal – фрактал (экстремум)

Добавлено: 30 май 2018, 07:13
evge
Все верно, пример уже корректный, т.е. как я выше и писал [0] или [Period] - имеет значение!
Как и в моем примере последнем, где нет заглядывания в будущее и использовано [Period].

Заглядыванием в будущее будет, если

Код: Выделить всё

   if(!Double.IsNaN(h[Period])) last_high_fractal = h[Period];
   if(!Double.IsNaN(l[Period])) last_low_fractal = l[Period];   


было бы

Код: Выделить всё

   if(!Double.IsNaN(h[Period])) last_high_fractal = h[0];
   if(!Double.IsNaN(l[Period])) last_low_fractal = l[0];   


в таком варианте конечно работать не будет, но если запустить на нём контртренд тогда будет обманывать.

Например так:

Код: Выделить всё

/**
Algorithm = ТРЕНД;
**/

function Initialize()
{
   StrategyName = "My_Fractals";
   AddInput("Input1", Inputs.Candle, 60, true, "SBER=МБ ЦК");
   AddParameter("Period", 2, "Порядок фрактала");
   LongLimit = 1;
   ShortLimit = -1;
   AddChartIndicator("MY.Fractal", new Dictionary <string, string>{{"Period", "Period"}});
   AddGlobalVariable("last_high_fractal", Types.Double, 10000000000.0);
   AddGlobalVariable("last_low_fractal", Types.Double, -1.0);
}

function OnUpdate()
{
   var fractal = MY.Fractal(Input1, Period);
   var h = fractal["H"];
   var l = fractal["L"];
     
   /// это максимум
   if ( h[0] > 0 )
   {
      EnterShort();
   }

   /// это минимум
   if ( l[0] > 0 )
   {
      EnterLong();
   }

}


и получим следующее:

My_Fractals-01.png
My_Fractals-01.png (35.96 КБ) 30360 просмотров

My_Fractals-02.png
My_Fractals-02.png (35.85 КБ) 30358 просмотров


Должно быть, если заменить [0] на [Period], вот так

My_Fractals-03.png
My_Fractals-03.png (47.89 КБ) 30357 просмотров

My_Fractals-04.png
My_Fractals-04.png (40.87 КБ) 30357 просмотров

Re: Fractal – фрактал (экстремум)

Добавлено: 30 май 2018, 22:04
MonteCristo
Ну да, всё правильно. Решение должно приниматься только после того, как от экстремума пройдет Period баров и фрактал сформируется, а не на самом баре с экстремумом. У меня проблема была с тем как прочитать значение Period баров назад, теперь я знаю, спасибо.