/*================================================================================ * Стратегия: Two Oscilators * Платформа: TSLab версия 1.1.8.0 * Дата создания: 13.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.Oscilators { //================================================================================ public class Oscilators : IExternalScript { // используем переменные-флаги для сигналов public bool bBuy; // флаг сигнала открытия длинной позиции public bool bSell; public bool bShort; public bool bCover; public IPosition LongPos, ShortPos; //================================================================================ // Параметры оптимизации public OptimProperty PeriodParam = new OptimProperty(10, 2, 20, 1); public OptimProperty MAPeriodParam = new OptimProperty(5, 2, 20, 1); public OptimProperty MA1PeriodParam = new OptimProperty(13, 8, 21, 1); public OptimProperty MA2PeriodParam = new OptimProperty(26, 13, 34, 2); public OptimProperty MASPeriodParam = new OptimProperty(9, 5, 13, 1); //================================================================================ public virtual void Execute(IContext ctx, ISecurity source) { int StartBar; #region Variables int Period; // период расчета RSI int MAPeriod; // период сглаживания RSI int MA1Period; // период быстрой скользящей средней int MA2Period; // период медленной скользящей средней int MASPeriod; // период сигнальной скользящей средней double vRSI, vRSI1, vRSI2; double vMACD; double vMAS; #endregion //-------------------------------------------------------------------------------- #region Init vars #endregion //-------------------------------------------------------------------------------- #region Obtain parameters Period = PeriodParam; MAPeriod = MAPeriodParam; MA1Period = MA1PeriodParam; MA2Period = MA2PeriodParam; MASPeriod = MASPeriodParam; StartBar = Period; // серия значений RSI // кэширование с учетом параметра Period IList nRSI = ctx.GetData("RSI", new[] {Period.ToString()}, delegate { return Series.RSI(source.ClosePrices, Period); }); IList nRSA = ctx.GetData("RSA", new[] {Period.ToString()+MAPeriod.ToString()}, delegate { return Series.SMA(nRSI, MAPeriod); }); // серия значений MA1 IList nMA1 = ctx.GetData("MA1", new[] {MA1Period.ToString()}, delegate { return Series.SMA(source.ClosePrices, MA1Period); }); // серия значений MA2 IList nMA2 = ctx.GetData("MA2", new[] {MA2Period.ToString()}, delegate { return Series.SMA(source.ClosePrices, MA2Period); }); // серия значений MACD IList nMACD = ctx.GetData("MACD", new[] {MA1Period.ToString()+MA2Period.ToString()}, delegate { return Series.Sub(nMA1, nMA2); }); // серия значений MAS сигнальной линии IList nMAS = ctx.GetData("MAS", new[] {MA1Period.ToString()+MA2Period.ToString()+MASPeriod.ToString()}, delegate { return Series.SMA(Series.Sub(nMA1, nMA2), MASPeriod); }); #endregion //================================================================================ #region основной цикл - проход по барам int barsCount = source.Bars.Count; for (int bar = StartBar; bar < barsCount-1; bar++) { //-------------------------------------------------------------------------------- #region calculate values //Price = source.ClosePrices[bar]; vRSI = nRSI[bar]; vRSI1 = nRSI[bar-1]; vRSI2 = nRSI[bar-2]; vMACD = nMACD[bar]; vMAS = nMAS[bar]; #endregion //-------------------------------------------------------------------------------- #region data series #endregion //-------------------------------------------------------------------------------- #region generate signals // сброс значений сигналов bBuy = false; bSell = false; bShort = false; bCover = false; // установка сигналов по условиям if (vMACD > vMAS && vRSI1 < 30 && vRSI1 < vRSI && vRSI1 < vRSI2) { bBuy = true; } if (vMACD < vMAS && vRSI1 > 70 && vRSI1 > vRSI && vRSI1 > vRSI2) { bShort = true; } if (vRSI > 70) bSell = true; if (vRSI < 30) bCover = true; //bBuy = true; //bCover = true; //bShort = true; //bSell = true; #endregion //================================================================================ #region execute signals //-------------------------------------------------------------------------------- // выполнение сигналов для длинной позиции IPosition LongPos = source.Positions.GetLastActiveForSignal("LN"); if (LongPos == null) { // Если нет активной длинной позиции if (bBuy) { // Если есть сигнал Buy, // выдаем ордер на открыте новой длинной позиции. source.Positions.BuyAtMarket(bar+1, 1, "LN"); } } else { // Если есть активная длинная позиция if (bSell) { // Если есть сигнал Sell, // выдаем ордер на закрыте длинной позиции. LongPos.CloseAtMarket(bar+1, "LX"); } } //-------------------------------------------------------------------------------- // выполнение сигналов для короткой позиции IPosition ShortPos = source.Positions.GetLastActiveForSignal("SN"); if (ShortPos == null) { // Если нет активной короткой позиции if (bShort) { // Если есть сигнал Short // выдаем ордер на открыте новой короткой позиции. source.Positions.SellAtMarket(bar+1, 1, "SN"); } } else { // Если есть активная короткая позиция, if (bCover) { // Если есть сигнал Cover // выдаем ордер на закрыте короткой позиции. ShortPos.CloseAtMarket(bar+1, "SX"); } } #endregion } #endregion //================================================================================ #region прорисовка графиков // Берем основную панель (Pane) //IPane mainPane = ctx.First; // Создаем дополнительную панель для RSI. IPane RSIPane = ctx.CreatePane("RSI", 10, false, false); // Отрисовка графика RSI RSIPane.AddList(string.Format("RSI"), nRSI, ListStyles.LINE, 0x5050f0, LineStyles.SOLID, PaneSides.RIGHT); RSIPane.AddList(string.Format("SMA(RSI)"), nRSA, ListStyles.LINE, 0x5050a0, LineStyles.SOLID, PaneSides.RIGHT); // Создаем дополнительную панель для фильтра MACD. IPane MACDPane = ctx.CreatePane("MACD", 10, false, false); // Отрисовка графика фильтра MACDPane.AddList(string.Format("MACD"), nMACD, ListStyles.HISTOHRAM_FILL, 0xa07070, LineStyles.SOLID, PaneSides.RIGHT); MACDPane.AddList(string.Format("Signal"), nMAS, ListStyles.LINE, 0xa00000, LineStyles.SOLID, PaneSides.RIGHT); #endregion //-------------------------------------------------------------------------------- } } }