Рисуются уровни.
При появлении сигнала уровень в направлении сигнала сдвигается до цены сигнала.
Поэтому выставить на него тейк не получится.
Поэтому меняю немного код самого индикатора, который будет отображать значения HL и LL по всей истории где рассчитан индикатор.
Код: Выделить всё
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 (параметр) от текущей цены (входа).