using System; using System.Collections.Generic; using TSLab.Script; using TSLab.Script.Handlers; using TSLab.Script.Optimization; using TSLab.Script.Helpers; using MyCustomHandlers.Indicators; namespace ExeCute_rts_complex { public class RTS_Complex : IExternalScript { bool bBuy, bSell, bShort, bCover; IPosition LongPos, ShortPos; MFI mfi = new MFI(); Divergence div = new Divergence(); public OptimProperty XTParam = new OptimProperty(0, 0, 100, 1); public OptimProperty LMFIPeriodParam = new OptimProperty(24, 2, 100, 1); public OptimProperty LDivPctParam = new OptimProperty(.0, .0, 100.0, .1); public OptimProperty SMFIPeriodParam = new OptimProperty(24, 2, 100, 1); public OptimProperty SDivPctParam = new OptimProperty(.0, .0, 100.0, .1); public virtual void Execute(IContext ctx,ISecurity source) { int startBar = 0; #region Variables int XT; int LMFIPeriod; double LDivPct; int SMFIPeriod; double SDivPct; #endregion #region Obtain params XT = XTParam; LMFIPeriod = LMFIPeriodParam; mfi.Period = LMFIPeriod; mfi.Context = ctx; LDivPct = LDivPctParam; div.PercentDiv = LDivPct; div.Context = ctx; IList nLMFI = ctx.GetData("LMFI", new[] { LMFIPeriod.ToString() }, delegate { return mfi.Execute(source); }); IList nLDiv = ctx.GetData("LDiv", new[] { LDivPct.ToString() }, delegate { return div.Execute(source, nLMFI); }); SMFIPeriod = SMFIPeriodParam; mfi.Period = SMFIPeriod; SDivPct = SDivPctParam; div.PercentDiv = SDivPct; IList nSMFI = ctx.GetData("SMFI", new[] { SMFIPeriod.ToString() }, delegate { return mfi.Execute(source); }); IList nSDiv = ctx.GetData("SDiv", new[] { SDivPct.ToString() }, delegate { return div.Execute(source, nSMFI); }); startBar = LMFIPeriod; if (startBar < SMFIPeriod) startBar = SMFIPeriod; #endregion #region Main cycle for (int bar = startBar; bar < source.Bars.Count - 1; bar++) { #region Generate signals bBuy = bSell = bShort = bCover = false; LongPos = source.Positions.GetLastActiveForSignal("LN"); ShortPos = source.Positions.GetLastActiveForSignal("SN"); //Входа if (nLDiv[bar] < 0.0) bBuy = true; if (nSDiv[bar] > 0.0) bShort = true; //Выхода if (LongPos != null) { if (bar >= LongPos.EntryBarNum + XT) bSell = true; } if (ShortPos != null) { if (bar >= ShortPos.EntryBarNum + XT) bCover = true; } #endregion #region Execute signals if (LongPos == null) { if (bBuy) source.Positions.BuyAtMarket(bar + 1, 1, "LN"); } else { if (bSell) LongPos.CloseAtMarket(bar, "LX"); } if (ShortPos == null) { //if (bShort) // source.Positions.SellAtMarket(bar + 1, 1, "SN"); } else { if (bCover) ShortPos.CloseAtMarket(bar, "SX"); } #endregion } #endregion #region Charts IPane MFIPane = ctx.CreatePane("MFI", 20.0, false, false); MFIPane.AddList("MFI", nLMFI, ListStyles.LINE, 0xD5713F, LineStyles.SOLID, PaneSides.RIGHT); MFIPane.AddList("k", new ConstGen() { Value = 50.0 }.Execute(ctx), ListStyles.LINE, 0x00ff00, LineStyles.SOLID, PaneSides.RIGHT); IPane DivPane = ctx.CreatePane("Div", 20.0, false, false); DivPane.AddList("Div", nLDiv, ListStyles.HISTOHRAM, 0xF4C430, LineStyles.SOLID, PaneSides.RIGHT); #endregion } } }