/*================================================================================ * Стратегия: Low Volatility breakout * Платформа: TSLab версия 1.1.8.0 * Дата создания: 14.07.2010 * Реализовано: Laber *================================================================================*/ using System; using System.Collections.Generic; using TSLab.Script; using TSLab.Script.Handlers; using TSLab.Script.Optimization; using TSLab.Script.Helpers; namespace TSLab.LowVolatility { //================================================================================ public class LowVolatility : IExternalScript { // используем переменные-флаги для сигналов public IPosition LongPos, ShortPos; //================================================================================ // Параметры оптимизации // параметра для длинных позиций public OptimProperty LongNPeriodParam = new OptimProperty(8, 2, 20, 1); public OptimProperty LongNKoefParam = new OptimProperty(0.01, 0.005, 0.5, 0.005); public OptimProperty LongXKoefParam = new OptimProperty(8, 1, 20, 0.5); // параметра для коротких позиций public OptimProperty ShortNPeriodParam = new OptimProperty(8, 2, 20, 1); public OptimProperty ShortNKoefParam = new OptimProperty(0.015, 0.005, 0.05, 0.005); public OptimProperty ShortXKoefParam = new OptimProperty(5, 1, 20, 0.5); //================================================================================ public virtual void Execute(IContext ctx, ISecurity source) { int StartBar = 0; #region Variables // для длинных позиций // период расчета диапазона волатильности int LongNPeriod; // для открытия позиции // коэффициент отклонения для цены сигнала double LongNKoef; // для открытия позиции double LongXKoef; // для закрытия позиции // для коротких позиций // период расчета диапазона волатильности int ShortNPeriod; // для открытия позиции // коэффициент отклонения для цены сигнала double ShortNKoef; // для открытия позиции double ShortXKoef; // для закрытия позиции double BuyPrice, LongStopPrice, LongTargetPrice; double ShortPrice, ShortStopPrice, ShortTargetPrice; #endregion //-------------------------------------------------------------------------------- #region Obtain parameters LongNPeriod = LongNPeriodParam; LongNKoef = LongNKoefParam; LongXKoef = LongXKoefParam; ShortNPeriod = ShortNPeriodParam; ShortNKoef = ShortNKoefParam; ShortXKoef = ShortXKoefParam; StartBar = LongNPeriod; if (ShortNPeriod > StartBar) StartBar = ShortNPeriod; // Вычисляем диапазоны волатильности. // Используем GetData для кеширования данных и ускорения оптимизации. // серия значений диапазонов IList nVol = ctx.GetData("Volatility", new[] {"1"}, delegate { return Series.Sub( source.HighPrices, source.LowPrices); }); // для длинных позиций // серия значений минимальных диапазонов IList nLongMinVol = ctx.GetData("LongMinVol", new[] {LongNPeriod.ToString()}, delegate { return Series.Lowest( nVol, LongNPeriod); }); // для коротких позиций // серия значений минимальных диапазонов IList nShortMinVol = ctx.GetData("ShortMinVol", new[] {ShortNPeriod.ToString()}, delegate { return Series.Lowest( nVol, ShortNPeriod); }); #endregion //================================================================================ #region основной цикл - проход по барам int barsCount = source.Bars.Count; for (int bar = StartBar; bar < barsCount-1; bar++) { //-------------------------------------------------------------------------------- #region generate signals // сброс значений сигналов BuyPrice = 0; LongStopPrice = 0; LongTargetPrice = 0; ShortPrice = 0; ShortStopPrice = 0; ShortTargetPrice = 0; // установка сигналов по условиям // для длинных позиций if (nVol[bar] < nLongMinVol[bar-1]) { BuyPrice = source.HighPrices[bar] * (1 + LongNKoef); } LongPos = source.Positions.GetLastActiveForSignal("LN"); if (LongPos != null) { LongStopPrice = LongPos.EntryPrice - nVol[bar]; LongTargetPrice = LongPos.EntryPrice + nVol[bar] * LongXKoef; } // для коротких позиций if (nVol[bar] < nLongMinVol[bar-1]) { ShortPrice = source.LowPrices[bar] * (1 - ShortNKoef); } ShortPos = source.Positions.GetLastActiveForSignal("SN"); if (ShortPos != null) { ShortStopPrice = ShortPos.EntryPrice + nVol[bar]; ShortTargetPrice = ShortPos.EntryPrice - nVol[bar] * ShortXKoef; } #endregion //================================================================================ #region execute signals //-------------------------------------------------------------------------------- // выполнение сигналов для длинной позиции LongPos = source.Positions.GetLastActiveForSignal("LN"); if (LongPos == null) { // Если нет активной длинной позиции if (BuyPrice > 0) { // Если есть сигнал StopBuy, // выдаем условный ордер на открыте новой длинной позиции. source.Positions.BuyIfGreater(bar+1, 1, BuyPrice, "LN"); } LongPos = source.Positions.GetLastActiveForSignal("LN"); } else { // Если есть активная длинная позиция LongPos.CloseAtStop(bar+1, LongStopPrice, "LX"); if (LongPos.IsActive) { LongPos.CloseAtProfit(bar+1, LongTargetPrice, "LX"); } } //-------------------------------------------------------------------------------- // выполнение сигналов для короткой позиции ShortPos = source.Positions.GetLastActiveForSignal("SN"); if (ShortPos == null) { // Если нет активной короткой позиции if (ShortPrice > 0) { // Если есть сигнал StopShort // выдаем условный ордер на открыте новой короткой позиции. source.Positions.SellIfLess(bar+1, 1, ShortPrice, "SN"); } ShortPos = source.Positions.GetLastActiveForSignal("SN"); } else { // Если есть активная короткая позиция, ShortPos.CloseAtStop(bar+1, ShortStopPrice, "SX"); if (ShortPos.IsActive) { ShortPos.CloseAtProfit(bar+1, ShortTargetPrice, "SX"); } } #endregion } #endregion //================================================================================ #region прорисовка графиков // Берем основную панель (Pane) //IPane mainPane = ctx.First; // Создаем дополнительную панель для диапазона волатильности IPane VolPane = ctx.CreatePane("Volatility", 10, false, false); // Отрисовка графика Volatility VolPane.AddList(string.Format("Volatility"), nVol, ListStyles.LINE, 0x000070, LineStyles.SOLID, PaneSides.RIGHT); // Отрисовка графика Long Minimum Volatility VolPane.AddList(string.Format("LongMinVol"), nLongMinVol, ListStyles.LINE, 0x007070, LineStyles.SOLID, PaneSides.RIGHT); // Отрисовка графика Short Minimum Volatility VolPane.AddList(string.Format("ShortMinVol"), nShortMinVol, ListStyles.LINE, 0x700070, LineStyles.SOLID, PaneSides.RIGHT); #endregion //-------------------------------------------------------------------------------- } } }