usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingTSLab.Script;usingTSLab.Script.Handlers;usingTSLab.Script.Helpers;usingTSLab.Script.Optimization;namespaceMyLib{publicclassBreakout:IExternalScript { // Параметры оптимизацииpublicOptimProperty HighPeriod =newOptimProperty(20,10,100,5);publicOptimProperty LowPeriod =newOptimProperty(20,10,100,5); // Метод обработки, запускается при пересчете скриптаpublicvirtualvoidExecute(IContext ctx,ISecurity sec) { // Вычисляем максимумы и минимумы // Используем GetData для кеширования данных и ускорения оптимизацииvar high =ctx.GetData("Highest",new[] { HighPeriod.ToString() }, () =>Series.Highest(sec.GetHighPrices(ctx), HighPeriod));var low =ctx.GetData("Lowest",new[] { LowPeriod.ToString() }, () =>Series.Lowest(sec.GetLowPrices(ctx), LowPeriod)); // Если последняя свеча до конца не сформировалась, ее не нужно использовать в цикле торговлиvar barsCount =sec.Bars.Count;if (!ctx.IsLastBarUsed) { barsCount--; } // Торговляfor (int i =ctx.TradeFromBar; i < barsCount; i++) { // Получаем активные позицииvar posLong =sec.Positions.GetLastActiveForSignal("LE", i);var posShort =sec.Positions.GetLastActiveForSignal("SE", i);if (posLong ==null) { // Если нет активной длинной позиции, выдаем условный ордер на создание новой позицииsec.Positions.BuyIfGreater(i +1,1,high[i],"LE"); }else { // Если есть длинная позиция, то ставим стопposLong.CloseAtStop(i +1,low[i],"LX"); }if (posShort ==null) { // Если нет активной короткой позиции, выдаем условный ордер на создание новой позицииsec.Positions.SellIfLess(i +1,1,low[i],"SE"); }else { // Если есть короткая позиция, то ставим стопposShort.CloseAtStop(i +1,high[i],"SX"); } } // Если идет процесс оптимизации, то графики рисовать не нужно, это замедляет работуif (ctx.IsOptimization) {return; } // Отрисовка графиковctx.First.AddList(string.Format("High({0})", HighPeriod), high,ListStyles.LINE,ScriptColors.Green,LineStyles.SOLID,PaneSides.RIGHT);ctx.First.AddList(string.Format("Low({0})", LowPeriod), low,ListStyles.LINE,ScriptColors.Red,LineStyles.SOLID,PaneSides.RIGHT); } }}