Пример #1
0
        private void OrderEventAction(TradingEvent e)
        {
            try {
                switch (e.Type)
                {
                case ExecType.ExecNew:
                    ProcessSend(e.Order);
                    break;

                case ExecType.ExecTrade:
                    ProcessTrade(e.Trade);
                    break;

                case ExecType.ExecCancelled:
                    ProcessCancel(e.Order);
                    break;

                case ExecType.ExecOrderStatus:
                    ProcessReturnOrder(e.OrderReturn);
                    break;
                }
            }
            catch (Exception ex) {
                _provider.OnProviderError(-1, ex.Message);
            }
        }
Пример #2
0
        public override void CancelPendingOrder(PendingOrder order)
        {
            if (_orders.Contains(order))
            {
                _orders.Remove(order);
            }

            var tradingEvent = new TradingEvent(Server.CurrentTime, TradingEventType.PendingOrderCanceled, order, string.Empty);

            _journal.Add(tradingEvent);
        }
Пример #3
0
        public override void CloseMarketOrder(MarketOrder order, CloseReason closeReason)
        {
            if (_orders.Contains(order))
            {
                _orders.Remove(order);
            }

            var exitPrice = order.TradeType == TradeType.Buy ? order.Symbol.GetPrice(TradeType.Sell) :
                            order.Symbol.GetPrice(TradeType.Buy);

            var barsPeriod = order.Symbol.Bars.Time.Where(iBarTime => iBarTime >= order.OpenTime).Count();

            var tradingEvent = new TradingEvent(Server.CurrentTime, TradingEventType.MarketOrderClosed, order, string.Empty);

            _journal.Add(tradingEvent);

            Account.ChangeMargin(-order.MarginUsed, Server.CurrentTime, string.Empty, AccountChangeType.Trading);

            Account.ChangeBalance(order.NetProfit, Server.CurrentTime, string.Empty, AccountChangeType.Trading);

            var tradeData = Trades.Select(iTrade => iTrade.Order.NetProfit);

            var sharpeRatio  = SharpeRatioCalculator.GetSharpeRatio(tradeData);
            var sortinoRatio = SortinoRatioCalculator.GetSortinoRatio(tradeData);

            var equityMaxDrawDown  = MaxDrawdownCalculator.GetMaxDrawdown(Account.EquityChanges);
            var balanceMaxDrawDown = MaxDrawdownCalculator.GetMaxDrawdown(Account.BalanceChanges);

            var id = _trades.Count + 1;

            var tradeParameters = new TradeParameters
            {
                Id                 = id,
                Order              = order,
                ExitTime           = Server.CurrentTime,
                ExitPrice          = exitPrice,
                Balance            = Account.CurrentBalance,
                Equity             = Account.Equity,
                BalanceMaxDrawDown = balanceMaxDrawDown,
                EquityMaxDrawDown  = equityMaxDrawDown,
                BarsPeriod         = barsPeriod,
                CloseReason        = closeReason,
                SharpeRatio        = sharpeRatio,
                SortinoRatio       = sortinoRatio
            };

            var trade = new Trade(tradeParameters);

            _trades.Add(trade);
        }
Пример #4
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);
        }
Пример #5
0
        protected void AddOrder(IOrder order)
        {
            _orders.Add(order);

            switch (order.OrderType)
            {
            case OrderType.Market:
                var tradingEvent = new TradingEvent(Server.CurrentTime, TradingEventType.MarketOrderExecuted, order, string.Empty);

                _journal.Add(tradingEvent);

                break;

            case OrderType.Limit:
            case OrderType.Stop:
                tradingEvent = new TradingEvent(Server.CurrentTime, TradingEventType.PendingOrderPlaced, order, string.Empty);

                _journal.Add(tradingEvent);

                break;
            }
        }