using System.Collections.Generic; using TSLab.Script; using TSLab.Script.Handlers; using TSLab.Script.Optimization; using TSLab.Script.Helpers; namespace TSLab.Samples { public class HiLoSample : IExternalScript { // Параметры оптимизации для длинных позиций задаются при помощи типа OptimProperty. public OptimProperty HighPeriod = new OptimProperty(20, 10, 100, 5); public OptimProperty LowPeriod = new OptimProperty(10, 10, 100, 5); // Параметры оптимизации для коротких позиций так же задаются при помощи типа OptimProperty. public OptimProperty Low2Period = new OptimProperty(20, 10, 100, 5); public OptimProperty High2Period = new OptimProperty(10, 10, 100, 5); public virtual void Execute(IContext ctx, ISecurity source) { // Вычисляем максимумы и минимумы. // Используем GetData для кеширования данных и ускорения оптимизация. // При неиспользовании кэша увеличивается объем обрабатываемых данных, что ведет к сильному замедлению оптимизации. // Следует учесть, что необходимо перечислить абсолютно все изменяемые переменные используемые в вычислениях. // Не соблюдение этого правила приведет к некорректной работе и результатам оптимизации. IList high = ctx.GetData("Highest", new[] { HighPeriod.ToString() }, delegate { return Series.Highest(source.HighPrices, HighPeriod); }); IList low = ctx.GetData("Lowest", new[] { LowPeriod.ToString() }, delegate { return Series.Lowest(source.HighPrices, LowPeriod); }); IList high2 = ctx.GetData("Highest", new[] { High2Period.ToString() }, delegate { return Series.Highest(source.HighPrices, High2Period); }); IList low2 = ctx.GetData("Lowest", new[] { Low2Period.ToString() }, delegate { return Series.Lowest(source.HighPrices, Low2Period); }); // Берем основную панель (Pane). IPane mainPane = ctx.First; // Отрисовка графиков. mainPane.AddList(string.Format("High({0}) [{1}]", HighPeriod, source.Symbol), high, ListStyles.LINE, 0x00ff00, LineStyles.SOLID, PaneSides.RIGHT); mainPane.AddList(string.Format("High2({0}) [{1}]", High2Period, source.Symbol), high2, ListStyles.LINE, 0x00ff00, LineStyles.DASH, PaneSides.RIGHT); mainPane.AddList(string.Format("Low({0}) [{1}]", LowPeriod, source.Symbol), low, ListStyles.LINE, 0xff0000, LineStyles.SOLID, PaneSides.RIGHT); mainPane.AddList(string.Format("Low2({0}) [{1}]", Low2Period, source.Symbol), low2, ListStyles.LINE, 0xff0000, LineStyles.DASH, PaneSides.RIGHT); // ================================================= // Торговля. int barsCount = source.Bars.Count; for (int i = 0; (i < barsCount); i++) { IPosition le = source.Positions.GetLastActiveForSignal("LE"); if (le == null) { // Если нет активных длинных позиций, выдаем условный ордер на создание новой позиции. source.Positions.BuyIfGreater(i + 1, 1, high[i], "LE"); } else { le.CloseAtStop(i + 1, low[i], "LX"); } IPosition se = source.Positions.GetLastActiveForSignal("SE"); if (se == null) { // Если нет активных коротких позиций, выдаем условный ордер на создание новой позиции. source.Positions.SellIfLess(i + 1, 1, low2[i], "SE"); } else { se.CloseAtStop(i + 1, high2[i], "SX"); } } } } }