public override void OnBar(ISymbol symbol, int index) { if (_fastMa.Data[index] > _slowMa.Data[index]) { Trade.CloseAllMarketOrders(TradeType.Sell); if (_fastMa.Data[index - 1] <= _slowMa.Data[index - 1] && !Trade.Orders.Any(iOrder => iOrder.OrderType == OrderType.Market && iOrder.TradeType == TradeType.Buy)) { var marketOrderParameters = new MarketOrderParameters(symbol) { Volume = Volume, TradeType = TradeType.Buy, }; Trade.Execute(marketOrderParameters); } } else if (_fastMa.Data[index] < _slowMa.Data[index]) { Trade.CloseAllMarketOrders(TradeType.Buy); if (_fastMa.Data[index - 1] >= _slowMa.Data[index - 1] && !Trade.Orders.Any(iOrder => iOrder.OrderType == OrderType.Market && iOrder.TradeType == TradeType.Sell)) { var marketOrderParameters = new MarketOrderParameters(symbol) { Volume = Volume, TradeType = TradeType.Sell, }; Trade.Execute(marketOrderParameters); } } }
public void ExecuteTest() { var orderParameters = new MarketOrderParameters(_symbol) { Volume = 1000, TradeType = TradeType.Buy, StopLossInTicks = 5, TakeProfitInTicks = 5, }; var result = _tradeEngine.Execute(orderParameters); Assert.IsTrue(result.IsSuccessful); }
private TradeResult ExecuteMarketOrder(MarketOrderParameters parameters) { var marginRequired = (parameters.Volume * parameters.Symbol.VolumeUnitValue) / Account.Leverage; if (marginRequired >= Account.FreeMargin) { return(new TradeResult(OrderErrorCode.NotEnoughMargin)); } else { var symbolPrice = parameters.Symbol.GetPrice(parameters.TradeType); var symbolSlippageInPrice = parameters.Symbol.Slippage * parameters.Symbol.TickSize; double entryPrice; if (parameters.TradeType == TradeType.Buy) { entryPrice = symbolPrice + symbolSlippageInPrice; } else { entryPrice = symbolPrice - symbolSlippageInPrice; } var order = new MarketOrder(entryPrice, parameters, Server.CurrentTime) { Commission = parameters.Symbol.Commission * 2, MarginUsed = marginRequired, }; if (parameters.StopLossInTicks.HasValue) { var stopLossInSymbolTicks = parameters.StopLossInTicks * parameters.Symbol.TickSize; order.StopLossPrice = order.TradeType == TradeType.Buy ? entryPrice - stopLossInSymbolTicks : entryPrice + stopLossInSymbolTicks; } if (parameters.TakeProfitInTicks.HasValue) { var takeProfitInSymbolTicks = parameters.TakeProfitInTicks * parameters.Symbol.TickSize; order.StopLossPrice = order.TradeType == TradeType.Buy ? entryPrice + takeProfitInSymbolTicks : entryPrice - takeProfitInSymbolTicks; } AddOrder(order); Account.ChangeMargin(marginRequired, Server.CurrentTime, string.Empty, AccountChangeType.Trading); return(new TradeResult(order)); } }
public void CloseMarketOrderTest() { var orderParameters = new MarketOrderParameters(_symbol) { Volume = 1000, TradeType = TradeType.Buy, StopLossInTicks = 5, TakeProfitInTicks = 5, }; var result = _tradeEngine.Execute(orderParameters); Assert.IsTrue(result.IsSuccessful); Assert.IsTrue(_tradeEngine.Orders.Contains(result.Order)); _tradeEngine.CloseMarketOrder(result.Order as MarketOrder); Assert.IsTrue(!_tradeEngine.Orders.Contains(result.Order)); }
protected virtual void TriggerPendingOrder(PendingOrder order) { if (_orders.Contains(order)) { _orders.Remove(order); } var marketOrderParameters = new MarketOrderParameters(order.Symbol) { Volume = order.Volume, TradeType = order.TradeType, StopLossInTicks = order.StopLossPrice.HasValue ? (double?)Math.Abs(order.TargetPrice - order.StopLossPrice.Value) : null, TakeProfitInTicks = order.TakeProfitPrice.HasValue ? (double?)Math.Abs(order.TargetPrice - order.TakeProfitPrice.Value) : null, Comment = order.Comment, }; var tradingEvent = new TradingEvent(Server.CurrentTime, TradingEventType.PendingOrderFilled, order, string.Empty); _journal.Add(tradingEvent); Execute(marketOrderParameters); }
public void UpdateSymbolOrdersTest() { (_symbol as OhlcSymbol).PublishBar(new Bar(DateTimeOffset.Now, 0.9, 1, 1, 0.95, 1000)); var orderParameters = new MarketOrderParameters(_symbol) { Volume = 1000, TradeType = TradeType.Buy, StopLossInTicks = 5, TakeProfitInTicks = 5, }; var result = _tradeEngine.Execute(orderParameters); Assert.IsTrue(result.IsSuccessful); Assert.IsTrue(_tradeEngine.Orders.Contains(result.Order)); (_symbol as OhlcSymbol).PublishBar(new Bar(DateTimeOffset.Now, 0.95, 1, 0.8, 0.87, 1000)); _tradeEngine.UpdateSymbolOrders(_symbol); Assert.IsTrue(!_tradeEngine.Orders.Contains(result.Order)); }