using System; using TSLab.DataSource; using TSLab.Script; using TSLab.Script.Handlers; using TSLab.Script.Helpers; using TSLab.Script.Optimization; namespace MySystem0 { public class MySystem0 : IExternalScript { public OptimProperty CompressInterval = new OptimProperty(7, 1, 1440, 1); public OptimProperty Period1 = new OptimProperty(9, 1, 24, 1); public OptimProperty Period2 = new OptimProperty(56, 24, 96, 4); public OptimProperty TrailEnable = new OptimProperty(0.5, 0.1, 2, 0.1); public OptimProperty TrailLoss = new OptimProperty(1, 0.1, 2, 0.1); public OptimProperty StopLoss = new OptimProperty(1, 0.1, 2, 0.1); readonly TrailStop _trail = new TrailStop(); public virtual void Execute(IContext context, ISecurity security) { //var days = security.CompressTo(new Interval(1, DataIntervals.DAYS)); //var days = security.CompressTo(CompressInterval); var days = security.CompressTo(new Interval(CompressInterval, security.IntervalBase)); if (days == null || days.Bars.Count <= 1) return; //var oneDay = new TimeSpan(1, 0, 0, 0); TimeSpan oneDay; switch (security.IntervalBase) { case DataIntervals.DAYS: oneDay = new TimeSpan(CompressInterval, 0, 0, 0); break; case DataIntervals.MINUTE: oneDay = new TimeSpan(0, 0, CompressInterval, 0); break; case DataIntervals.SECONDS: case DataIntervals.TICK: default: oneDay = new TimeSpan(0, 0, 0, CompressInterval); break; } _trail.StopLoss = StopLoss; _trail.TrailEnable = TrailEnable; _trail.TrailLoss = TrailLoss; var ma1 = context.GetData("SMA", new[] { Period1.ToString() }, () => Series.SMA(days.ClosePrices, Period1)); var ma2 = context.GetData("SMA", new[] { Period2.ToString() }, () => Series.SMA(days.ClosePrices, Period2)); int maSign = 0; int iDay = 1; int barsCount = security.Bars.Count; for (int i = context.TradeFromBar; i < barsCount; i++) { var bar = security.Bars[i]; var dayBar = days.Bars[iDay]; if (bar.Date < dayBar.Date) continue; while (bar.Date >= dayBar.Date + oneDay) dayBar = days.Bars[++iDay]; // Your system here bool signal; int s = Math.Sign(ma1[iDay-1] - ma2[iDay-1]); if (s != 0 && maSign != s) { maSign = s; signal = true; } else signal = false; IPosition position = security.Positions.GetLastActiveForSignal("E"); if (position != null) position.CloseAtStop(i + 1, _trail.Execute(position, i), "X"); else if (signal) if (maSign > 0) security.Positions.BuyAtMarket(i + 1, 1, "E"); else security.Positions.SellAtMarket(i + 1, 1, "E"); } if (context.IsOptimization) return; // Visual IPane mainPane = context.First; ma1 = days.Decompress(ma1, DecompressMethodWithDef.Method3); ma2 = days.Decompress(ma2, DecompressMethodWithDef.Method3); mainPane.AddList("sma." + Period1, ma1, ListStyles.LINE_WO_ZERO, 0x00aa00, LineStyles.SOLID, PaneSides.RIGHT); mainPane.AddList("sma." + Period2, ma2, ListStyles.LINE_WO_ZERO, 0xaa0000, LineStyles.SOLID, PaneSides.RIGHT); mainPane.UpdatePrecision(PaneSides.RIGHT, security.Decimals); } } }