Уровни > Fractal – фрактал (экстремум)

Аватара пользователя
evge
Администратор
Сообщения: 1812
Зарегистрирован: 04 фев 2016, 09:46
Откуда: Млечный путь, планета Земля
Благодарил (а): 83 раза
Поблагодарили: 367 раз
Контактная информация:

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

Непрочитанное сообщение evge » 21 май 2018, 12:28

Т.к. 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 КБ) 43095 просмотров


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

MonteCristo
Сообщения: 35
Зарегистрирован: 16 май 2018, 19:52
Благодарил (а): 2 раза
Поблагодарили: 2 раза

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

Непрочитанное сообщение MonteCristo » 21 май 2018, 20:44

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

MonteCristo
Сообщения: 35
Зарегистрирован: 16 май 2018, 19:52
Благодарил (а): 2 раза
Поблагодарили: 2 раза

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

Непрочитанное сообщение MonteCristo » 21 май 2018, 20:45

Только наоборот LastH и LastL первоначальные значения.

Аватара пользователя
evge
Администратор
Сообщения: 1812
Зарегистрирован: 04 фев 2016, 09:46
Откуда: Млечный путь, планета Земля
Благодарил (а): 83 раза
Поблагодарили: 367 раз
Контактная информация:

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

Непрочитанное сообщение evge » 21 май 2018, 21:53

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

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

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

Аватара пользователя
evge
Администратор
Сообщения: 1812
Зарегистрирован: 04 фев 2016, 09:46
Откуда: Млечный путь, планета Земля
Благодарил (а): 83 раза
Поблагодарили: 367 раз
Контактная информация:

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

Непрочитанное сообщение evge » 21 май 2018, 22:18

В параллельной ветке форума подсмотрел у себя же, как я же делал по другому полтора года назад, в 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 КБ) 43058 просмотров

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


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

MonteCristo
Сообщения: 35
Зарегистрирован: 16 май 2018, 19:52
Благодарил (а): 2 раза
Поблагодарили: 2 раза

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

Непрочитанное сообщение MonteCristo » 22 май 2018, 00:10

Да, теперь понял, спасибо. Жаль, что именно так работает тестер. Надо бы развивать инструмент.

Аватара пользователя
evge
Администратор
Сообщения: 1812
Зарегистрирован: 04 фев 2016, 09:46
Откуда: Млечный путь, планета Земля
Благодарил (а): 83 раза
Поблагодарили: 367 раз
Контактная информация:

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

Непрочитанное сообщение evge » 22 май 2018, 14:22

Немного модифицированный фрактал.

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

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 байт) 2173 скачивания
никогда такого не было и вот опять

MonteCristo
Сообщения: 35
Зарегистрирован: 16 май 2018, 19:52
Благодарил (а): 2 раза
Поблагодарили: 2 раза

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

Непрочитанное сообщение MonteCristo » 29 май 2018, 22:49

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

/**
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();
   }

}


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

Аватара пользователя
evge
Администратор
Сообщения: 1812
Зарегистрирован: 04 фев 2016, 09:46
Откуда: Млечный путь, планета Земля
Благодарил (а): 83 раза
Поблагодарили: 367 раз
Контактная информация:

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

Непрочитанное сообщение evge » 30 май 2018, 07:13

Все верно, пример уже корректный, т.е. как я выше и писал [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 КБ) 42909 просмотров

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


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

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

My_Fractals-04.png
My_Fractals-04.png (40.87 КБ) 42906 просмотров
никогда такого не было и вот опять

MonteCristo
Сообщения: 35
Зарегистрирован: 16 май 2018, 19:52
Благодарил (а): 2 раза
Поблагодарили: 2 раза

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

Непрочитанное сообщение MonteCristo » 30 май 2018, 22:04

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


Вернуться в «Уровни»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 2 гостя