[HandlerName("TrailStop P1000R")] [HandlerCategory("vvPosClose")] public class TrailStopP1000r : IPosition2Double { [HandlerParameter(true, "1.5", Min = "0.1", Max = "0.6", Step = "0.05", Name = "StopLoss")] public double StopLoss { get; set; } [HandlerParameter(true, "0.5", Min = "0.1", Max = "0.6", Step = "0.05", Name = "TrailEnable")] public double TrailEnable { get; set; } [HandlerParameter(true, "0.5", Min = "0.1", Max = "0.6", Step = "0.05", Name = "TrailLoss")] public double TrailLoss { get; set; } //---- 2 параметра для второго уровня профита-трейллосса [HandlerParameter(true, "0", Min = "0", Max = "0.6", Step = "0.05", Name = "ProfitLimit")] public double ProfitLimit { get; set; } [HandlerParameter(true, "0", Min = "0", Max = "0.6", Step = "0.05", Name = "TrLoss2")] public double TrailLoss2 { get; set; } public static double GenTrailStopP1000r(IPosition _pos, int _barNum, double _StopLoss, double _TrailEnable, double _TrailLoss, double _ProfitLimit, double _TrailLoss2) { if (_pos == null) return 0; //---- текущий профит в %% var curProfit = _pos.OpenMFEPct(_barNum); //---- сразу делаю расчёт стопа, будто TrailEnable не включился double shift = (0 - _StopLoss) / 100; double stop = _pos.EntryPrice * (1 + (_pos.IsLong ? shift : -shift)); double entrystop = stop; //---- если профит больше TrailEnable if (curProfit > _TrailEnable) { //---- сначала проверяем на то, больше ли профит самого большого значения профита, //---- для выставления самого "тугого" трейллосса shift = curProfit > _ProfitLimit ? (curProfit - _TrailLoss2) / 100 : (curProfit - _TrailLoss) / 100; stop = _pos.EntryPrice * (1 + (_pos.IsLong ? shift : -shift)); } //---- проверяем, чтобы стоп был правильным (при трейле не уходил ниже\выше //---- начального стоплосса) stop = _pos.IsLong ? (Math.Max(stop, entrystop)) : (Math.Min(stop, entrystop)); var lastStop = _pos.GetStop(_barNum); if (lastStop == 0) { return stop; } return _pos.IsLong ? Math.Max(stop, lastStop) : Math.Min(stop, lastStop); } public double Execute(IPosition pos, int barNum) { return GenTrailStopP1000r(pos, barNum, StopLoss, TrailEnable, TrailLoss, ProfitLimit, TrailLoss2); } }