/*================================================================================ * Стратегия: Tom Demark Camouflage pattern * Платформа: TSLab версия 1.1.8.0 * Дата создания: 21.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.TD_Camouflage { //================================================================================ public class System_TD_Camouflage : IExternalScript { // используем переменные-флаги для сигналов public bool bBuy; // флаг сигнала открытия длинной позиции public bool bSell; // флаг сигнала закрытия длинной позиции public bool bShort; // флаг сигнала открытия короткой позиции public bool bCover; // флаг сигнала закрытия короткой позиции public IPosition LongPos, ShortPos; //================================================================================ // Параметры оптимизации // параметра для длинных позиций public OptimProperty LongPeriodParam = new OptimProperty(8, 5, 50, 1); // параметра для коротких позиций public OptimProperty ShortPeriodParam = new OptimProperty(15, 5, 50, 1); //================================================================================ public virtual void Execute(IContext ctx, ISecurity source) { int StartBar = 0; #region Variables // для длинных позиций int LongPeriod; // период нахождения в позиции // для коротких позиций // период расчета int ShortPeriod; // период нахождения в позиции #endregion //-------------------------------------------------------------------------------- #region Obtain parameters LongPeriod = LongPeriodParam; ShortPeriod = ShortPeriodParam; StartBar = LongPeriod; if (ShortPeriod > StartBar) StartBar = ShortPeriod; #endregion //================================================================================ #region основной цикл - проход по барам int barsCount = source.Bars.Count; for (int bar = StartBar; bar < barsCount-1; bar++) { //-------------------------------------------------------------------------------- #region generate signals // сброс значений сигналов bBuy = false; bSell = false; bShort = false; bCover = false; // установка сигналов по условиям // для длинных позиций if (source.ClosePrices[bar] < source.ClosePrices[bar-1]) if (source.ClosePrices[bar] > source.OpenPrices[bar]) { bBuy = true; } LongPos = source.Positions.GetLastActiveForSignal("LN"); if (LongPos != null) { if ((bar - LongPos.EntryBarNum) >= LongPeriod) bSell = true; } // для коротких позиций if (source.ClosePrices[bar] > source.ClosePrices[bar-1]) if (source.ClosePrices[bar] < source.OpenPrices[bar]) { bShort = true; } ShortPos = source.Positions.GetLastActiveForSignal("SN"); if (ShortPos != null) { if ((bar - ShortPos.EntryBarNum) >= ShortPeriod) bCover = true; } #endregion //================================================================================ #region execute signals //-------------------------------------------------------------------------------- // выполнение сигналов для длинной позиции 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"); } } //-------------------------------------------------------------------------------- // выполнение сигналов для короткой позиции 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 //================================================================================ } } }