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);
                }
            }
        }
Example #2
0
        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);
        }
Example #3
0
        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));
            }
        }
Example #4
0
        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));
        }
Example #5
0
        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);
        }
Example #6
0
        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));
        }