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

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

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

Добавлено: evge » 29 окт 2018, 13:14

Тема: Re: ZZe (ZigZag evge) - ЗизЗаг

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

HH и HL вообще не используются в коде, лишние.

Рисуются уровни.

При появлении сигнала уровень в направлении сигнала сдвигается до цены сигнала.

Поэтому выставить на него тейк не получится.

Поэтому меняю немного код самого индикатора, который будет отображать значения HL и LL по всей истории где рассчитан индикатор.

ZZe-HL-LL.png
ZZe-HL-LL.png (38.41 КБ) 32270 просмотров


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

function Initialize()
{
//ZZe - ZigZag evge
IndicatorName = "ZZe";
PriceStudy = true;   
AddInput("I", Inputs.Candle);
// Сигнал на "покупку" в момент определения локального миниумма
AddSeries("Buy", DrawAs.Custom, Color.Green);
// Сигнал на "продажу" в момент определения локального максимума
AddSeries("Sell", DrawAs.Custom, Color.Red);
// Зиззаг
AddSeries("Line", DrawAs.Line, Color.Blue);
AddSeries("LineLast", DrawAs.Line, Color.Gray);
// Уровни последних определенных экстремумов
AddLevel(0, Color.Green, LineStyles.Dot, 2, "Buy"); 
AddLevel(0, Color.Red, LineStyles.Dot, 2, "Sell"); 
AddSeries("HL", DrawAs.Line, Color.Green);
AddSeries("LL", DrawAs.Line, Color.Red);

// ATR
AddParameter("Period", 14);
// ATR*K
AddParameter("K", 3);
// Fractals
AddParameter("Bars", 10);   

// [H]igh - последний локальный максимум
AddGlobalVariable("H", Types.Double, 0.0);
// [L]ow - последний локальный минимум
AddGlobalVariable("L", Types.Double, 999999999);
// [D]irection - направление последнего сигнала
AddGlobalVariable("D", Types.Int, 0);
// [I]ndex [H]igh - индекс бара последнего [H]igh
AddGlobalVariable("IH", Types.Int, 0);
// [I]ndex [L]ow - индекс бара последнего [L]ow
AddGlobalVariable("IL", Types.Int, 0);
}

function Evaluate()
{

   // evge 22.11.2016 http://alfadirect4.ru

   var A = ATR(I, Period);

   var CH = I.High;
   var CL = I.Low;
   var CC = I.Close;

   if (CH[0] > CH[1] && CH[0] > H) { H = CH[0]; IH = CurrentIndex; }
   if (CL[0] < CL[1] && CL[0] < L) { L = CL[0]; IL = CurrentIndex; }

   if (CC[0] < H && (H - CC[0] >= A[0] * K || CurrentIndex - IH >= Bars) && D >= 0)
      {
      Sell = CH[0];
      Sell.DrawCircle();
      D = -1;
      L = CL[0];
      IL = CurrentIndex;
      Line[CurrentIndex - IH] = H;
      }

   else

   if (CC[0] > L && (CC[0] - L >= A[0] * K || CurrentIndex - IL >= Bars) && D <= 0)
      {
      Buy = CL[0];
      Buy.DrawCircle();
      D = 1;
      H = CH[0];
      IH = CurrentIndex;
      Line[CurrentIndex - IL] = L;
      }

Line.DrawLine();

HL = L;
LL = H;

if (CurrentIndex == MaxIndex)
{
   Levels[0].Level = L;
   Levels[1].Level = H;
   if (D != 0)
   {
      LineLast[CurrentIndex - IL] = L;
      LineLast[CurrentIndex - IH] = H;
      LineLast.DrawLine();
   }
}

}



Код стратегии (пример):

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

/**
ZZeBRS
**/

function Initialize()
{
   StrategyName = "ZZeBRS";
   AddParameter("Period", 14, "", 1);
   AddParameter("K", 3, "", 1);
   AddParameter("Bars", 10, "", 1);
   AddParameter("TP", 3, "в TP раз больше чем стоп (или меньше если <1)", 1);
   AddInput("Input1", Inputs.Candle, 1, true, "");
   LongLimit = 100;
   ShortLimit = -100;
   AddChartIndicator("MY.ZZe", new Dictionary <string, string>{{"Period", "Period"}, {"K", "K"}, {"Bars", "Bars"}});
}

function OnUpdate()
{

   var I = Input1;
   
   var Z = MY.ZZe(I, Period, K, Bars);
   
   if (Z["Buy"] > 0)
   {
      EnterLong();
      BreakingStop(Z["HL"][0], I.Close[0] + (I.Close[0] - Z["HL"][0]) * TP, SignalPriceType.Price);
   }

   if (Z["Sell"] > 0)
   {
      EnterShort();
      BreakingStop(Z["LL"][0], I.Close[0] - (Z["LL"][0] - I.Close[0]) * TP, SignalPriceType.Price);
   }
   

}


Здесь стоп известен, а тейк выставляется как разница между ценой (входа) и стопом умноженной на TP (параметр) от текущей цены (входа).