using StockSharp.Quik; namespace SampleHistoryTesting { using System.Linq; using System.Collections.Generic; using Ecng.Common; using Ecng.Xaml; using StockSharp.Algo; using StockSharp.Algo.Candles; using StockSharp.Algo.Indicators; using StockSharp.Algo.Indicators.Trend; using StockSharp.Algo.Strategies; using StockSharp.Algo.Strategies.Quoting; using StockSharp.Logging; using StockSharp.BusinessEntities; using StockSharp.Messages; using StockSharp.Xaml.Charting; class SmaStrategy : Strategy { private readonly Chart _chart; private readonly ChartCandleElement _candlesElem; private readonly ChartTradeElement _tradesElem; private readonly ChartIndicatorElement _shortElem; private readonly ChartIndicatorElement _longElem; private readonly List _myTrades = new List(); private readonly CandleSeries _series; private bool _isShortLessThenLong; private Order _lastBuyStopOrder; private Order _lastSellStopOrder; public SmaStrategy(Chart chart, ChartCandleElement candlesElem, ChartTradeElement tradesElem, ChartIndicatorElement shortElem, ChartIndicatorElement longElem, CandleSeries series) { _chart = chart; _candlesElem = candlesElem; _tradesElem = tradesElem; _shortElem = shortElem; _longElem = longElem; _series = series; LongSma = (SimpleMovingAverage)longElem.Indicator; ShortSma = (SimpleMovingAverage)shortElem.Indicator; } public SimpleMovingAverage LongSma { get; private set; } public SimpleMovingAverage ShortSma { get; private set; } protected override void OnStarted() { _series .WhenCandlesFinished() .Do(ProcessCandle) .Apply(this); this .WhenNewMyTrades() .Do(trades => _myTrades.AddRange(trades)) .Apply(this); // запоминаем текущее положение относительно друг друга _isShortLessThenLong = ShortSma.GetCurrentValue() < LongSma.GetCurrentValue(); base.OnStarted(); } protected override void OnPositionsChanged(IEnumerable positions) { foreach (var position in positions) { if (position.Security == Security) { } } base.OnPositionsChanged(positions); } protected override void OnNewMyTrades(IEnumerable trades) { foreach (var trade in trades) { if (trade.Order.Security == Security) { } } base.OnNewMyTrades(trades); } private void ProcessCandle(Candle candle) { // если наша стратегия в процессе остановки if (ProcessState == ProcessStates.Stopping) { // отменяем активные заявки CancelActiveOrders(); return; } this.AddInfoLog("Новая свеча {0}: {1};{2};{3};{4}; объем {5}".Put(candle.OpenTime, candle.OpenPrice, candle.HighPrice, candle.LowPrice, candle.ClosePrice, candle.TotalVolume)); // снимаем ранее выставленные стопы, если они не были исполнены if (_lastBuyStopOrder != null) if (_lastBuyStopOrder.State == OrderStates.Active || _lastBuyStopOrder.State == OrderStates.Pending) CancelOrder(_lastBuyStopOrder); if (_lastSellStopOrder != null) if (_lastSellStopOrder.State == OrderStates.Active || _lastSellStopOrder.State == OrderStates.Pending) CancelOrder(_lastSellStopOrder); // добавляем стоп по candle.HighPrice var buyStop = new Order { Connector = Connector, Type = OrderTypes.Conditional, Portfolio = Portfolio, Security = Security, Direction = Sides.Buy, Price = Security.MaxPrice, Volume = Volume, Condition = new QuikOrderCondition { Type = QuikOrderConditionTypes.StopLimit, StopPrice = candle.HighPrice, } }; RegisterOrder(buyStop); _lastBuyStopOrder = buyStop; // добавляем стоп по candle.LowPrice var sellStop = new Order { Connector = Connector, Type = OrderTypes.Conditional, Portfolio = Portfolio, Security = Security, Direction = Sides.Sell, Price = Security.MaxPrice, Volume = Volume, Condition = new QuikOrderCondition { Type = QuikOrderConditionTypes.StopLimit, StopPrice = candle.LowPrice, } }; RegisterOrder(sellStop); _lastSellStopOrder = sellStop; var trade = _myTrades.FirstOrDefault(); _myTrades.Clear(); var dict = new Dictionary { { _candlesElem, candle }, { _tradesElem, trade } }; _chart.GuiAsync(() => _chart.ProcessValues(candle.OpenTime, dict)); } } }