Страница 1 из 1

Пример использования индикатора Fractal

Добавлено: 16 дек 2016, 13:32
evge
Пример постановки стоп заявки на уровне последнего минимума по индикатору Fractal

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

/**TestFractalStop
Developed by evge;**/

function Initialize()
{
   StrategyName = "TestFractalStop";
   AddParameter("Period", 5, "", 1);
   AddParameter("Take", 1, "", 1);
   AddInput("Input1", Inputs.Candle, 5, true, "SBER=МБ ЦК");
   LongLimit = 100;
   ShortLimit = 100;

   AddGlobalVariable("L", Types.Double, 0.0);
}

function OnUpdate()
{
   var F = MY.Fractal(Input1, Period)["L"];

   if (!Double.IsNaN(F[Period])) L = F[Period];
   
   if ( (Input1.Close[1] < Input1.Close[0]) && CurrentPosition() == 0 )
   {
      EnterLong();
      if (L != 0) StopLoss(L, SignalPriceType.Price);
   }

   if (CurrentPLper() >= Take && CurrentPosition() > 0) CloseLong();
}


Скачать код

TestFractalStop.ads
(670 байт) 2072 скачивания


Пример работы

TestFractalStop-01.png
TestFractalStop-01.png (36.86 КБ) 19851 просмотр

Re: Пример использования индикатора Fractal

Добавлено: 21 май 2018, 21:05
ilya0610
А можете показать, как ставить стоп-лосс на максимум, когда открываешь шорт, в этом же коде
И для чего нужен параметр Take?

Re: Пример использования индикатора Fractal

Добавлено: 21 май 2018, 21:17
ilya0610
И как в конечном итоге это объединить с индикаторов HeikenAshi

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

/**

**/

function Initialize()
{
   StrategyName = "HeikenAshi_withfractal";
   AddParameter("Bars_Blue", 3, "", 1);
   AddParameter("Bars_Magenta", 2, "", 1);
   //AddParameter("delta_short", 2, "", 1);
   //AddParameter("delta_long", 2, "", 1);
   AddParameter("Period", 5, "", 1);
   AddInput("Input1", Inputs.Candle, 1, true, "");
   LongLimit = 10;
   ShortLimit = -10;
   AddChartIndicator("MY.HeikenAshi", new Dictionary <string, double>{});
   
   AddGlobalVariable("L", Types.Double, 0.0);
   
   AddGlobalVariable("H", Types.Double, 0.0);
}

function OnUpdate()
{

   var Hei = MY.HeikenAshi(Input1);
   
   var F = MY.Fractal(Input1, Period)["L"];
   var F2 = MY.Fractal(Input1, Period)["H"];
   
   var HO = Hei["Open"];
   var HC = Hei["Close"];
   int x = 0, y = 0;
   bool isLong = true, isShort = true;
   
   if (!Double.IsNaN(F[Period])) L = F[Period];
   if (!Double.IsNaN(F2[Period])) H = F2[Period];
   
   while( x != Bars_Blue)
   {
      if (HO[x] > HC[x]) isLong = false;
      if (!isLong) break;
      x++; 
   }
    while( y != Bars_Magenta)
   {
      if (HO[y] < HC[y]) isShort = false;
      if (!isShort) break;
      y++; 
   }
   if ( isLong )
   {
      EnterLong();
     if(L!=0) StopLoss(L, SignalPriceType.Price);
   }

   if ( isShort )
   {
      EnterShort();
      if(H!=0) StopLoss(H, SignalPriceType.Price);
   }
}



Re: Пример использования индикатора Fractal

Добавлено: 22 май 2018, 08:46
evge
ilya0610 писал(а):А можете показать, как ставить стоп-лосс на максимум, когда открываешь шорт, в этом же коде


тоже самое, только смотрим в серию "H" индикатора Fractal, а открываем позицию EnterShort(). Стоп ставим по уровню фрактала из глоб. переменной "H", куда ранее сохранили фрактал.

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

/**TestFractalStop
Developed by evge;**/

function Initialize()
{
   StrategyName = "TestFractalStop";
   AddParameter("Period", 5, "", 1);
   AddParameter("Take", 1, "", 1);
   AddInput("Input1", Inputs.Candle, 5, true, "SBER=МБ ЦК");
   LongLimit = 100;
   ShortLimit = 100;

   AddGlobalVariable("H", Types.Double, 0.0);
}

function OnUpdate()
{
   var F = MY.Fractal(Input1, Period)["H"];

   if (!Double.IsNaN(F[Period])) H = F[Period];
   
   if ( (Input1.Close[1] > Input1.Close[0]) && CurrentPosition() == 0 )
   {
      EnterShort();
      if (H != 0) StopLoss(H, SignalPriceType.Price);
   }

   if (CurrentPLper() >= Take) CloseShort();
}


ilya0610 писал(а):И для чего нужен параметр Take?


Для фиксации прибыли. Задается в данном примере в %.
Условие закрытия позиции в последней строке приведенного выше кода:

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

   if (CurrentPLper() >= Take) CloseShort();


Из документации:

CurrentPLper() – возвращает изменение цены в процентах относительно учетной цены по открытой позиции в процентах.

Re: Пример использования индикатора Fractal

Добавлено: 22 май 2018, 08:58
evge
ilya0610 писал(а):И как в конечном итоге это объединить с индикаторов HeikenAshi


Будут ситуации, когда индикатор HeikenAshi будет показывать сигнал на вход по стратегии, а фрактал ещё не определен из ближайшего и он будет, например, при открытии EnterLong() сам стоп по L будет выше чем вход в позицию.

Re: Пример использования индикатора Fractal

Добавлено: 22 май 2018, 09:16
evge
Как пример для установки стопов на уровнях H, L, который не претендует на рабочий вариант стратегии.

Условие для isLong:

Если текущая цена выше L, то открываем Long + Stop на уровне L. Если цена ниже или равна L проверяем текущую позицию, если шорт, то закрываем его.

И для противоположной позиции isShort всё наоборот.

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

/**

**/

function Initialize()
{
   StrategyName = "HeikenAshi_withfractal";
   AddParameter("Bars_Blue", 3, "", 1);
   AddParameter("Bars_Magenta", 2, "", 1);
   //AddParameter("delta_short", 2, "", 1);
   //AddParameter("delta_long", 2, "", 1);
   AddParameter("Period", 5, "", 1);
   AddInput("Input1", Inputs.Candle, 1, true, "");
   LongLimit = 10;
   ShortLimit = -10;
   AddChartIndicator("MY.HeikenAshi", new Dictionary <string, double>{});
   
   AddGlobalVariable("L", Types.Double, 0.0);
   
   AddGlobalVariable("H", Types.Double, 0.0);
}

function OnUpdate()
{

   var Hei = MY.HeikenAshi(Input1);
   
   var F = MY.Fractal(Input1, Period);
   
   var HO = Hei["Open"];
   var HC = Hei["Close"];
   int x = 0, y = 0;
   bool isLong = true, isShort = true;
   
   if (!Double.IsNaN(F["L"][Period])) L = F["L"][Period];
   if (!Double.IsNaN(F["H"][Period])) H = F["H"][Period];
   
   while( x != Bars_Blue)
   {
      if (HO[x] > HC[x]) isLong = false;
      if (!isLong) break;
      x++; 
   }
    while( y != Bars_Magenta)
   {
      if (HO[y] < HC[y]) isShort = false;
      if (!isShort) break;
      y++; 
   }
   if ( isLong )
   {
       if (L != 0)
       {
         if (Input1.Close[0] > L)
            {
          EnterLong();
          StopLoss(L, SignalPriceType.Price);
            } else
            if (CurrentPosition() < 0) CloseShort();
       }
   }

   if ( isShort )
   {
       if (H != 0)
       {
         if (Input1.Close[0] < H)
            {
          EnterShort();
          StopLoss(H, SignalPriceType.Price);
            } else
            if (CurrentPosition() > 0) CloseLong();
       }
   }
}

Re: Пример использования индикатора Fractal

Добавлено: 23 май 2018, 22:08
Tyler_Durden
Дело за малым - отучить АД ждать закрытия бара.