Ejemplo n.º 1
0
        public void PlaceOrder(OrderParams order, AccountInfo account)
        {
            if (account == null || string.IsNullOrEmpty(order.UserID) || string.IsNullOrEmpty(order.Symbol))
            {
                return;
            }

            if (order.OrderType != OrderType.Market && order.Price <= 0M)
            {
                return;
            }

            switch (_signal.State)
            {
            case SignalState.Running:
                string origin = null;
                if (_signal.StrategyParameters != null && _signal.StrategyParameters.StrategyID > 0)
                {
                    origin = _signal.StrategyParameters.StrategyID + "/" + _signal.ShortName;
                }

                _connector.PlaceOrder(new Order(order.UserID, order.Symbol)
                {
                    Quantity    = order.Quantity,
                    SignalID    = order.SignalId,
                    OrderType   = order.OrderType,
                    OrderSide   = order.OrderSide,
                    ServerSide  = order.ServerSide,
                    Price       = order.Price,
                    SLOffset    = order.SLOffset,
                    TPOffset    = order.TPOffset,
                    TimeInForce = order.TimeInForce,
                    Origin      = origin,
                    BrokerName  = account.BrokerName,
                    AccountId   = account.ID
                }, account, _username);
                break;

            case SignalState.RunningSimulated:
                _signal.Alert($"PLACE ORDER: {order}, {_signal.Name} signal "
                              + $"(broker: {account.BrokerName}, account: {account.UserName})");
                break;
            }
        }
Ejemplo n.º 2
0
        public static void Execute(List <TradeSignal> signals, SignalBase signalBase, ExecuteTradesParam execTradeParam)
        {
            decimal actualPrice  = 0;
            decimal priceOffset  = 0;
            var     tradeSignals = signals;
            var     stopLoss     = execTradeParam.SL;
            var     takeProfit   = execTradeParam.TP;

            foreach (var _account in signalBase.BrokerAccounts)
            {
                //check if the account can trade this symbol...
                if (execTradeParam.DataFeed.AvailableDataFeeds.Contains(_account.DataFeedName))
                {
                    foreach (var item in tradeSignals)
                    {   // trade only if the symbol has correct trade slot and it was not the first iteration (first iteration can)
                        if (execTradeParam.TradeableSymbols.Contains(item.Instrument.Symbol) && execTradeParam.EvalCount > 1)
                        {
                            if (execTradeParam.OrderType == TradeType.Limit || execTradeParam.OrderType == TradeType.Stop)
                            {
                                Tick tick = null;
                                try
                                {
                                    tick = execTradeParam.DataFeed.GetLastTick(_account.DataFeedName, item.Instrument.Symbol);
                                }
                                catch (Exception e)
                                {
                                    signalBase.Alert($"Failed to retrieve tick for {item.Instrument}: {e.Message}");
                                }

                                if (tick != null)
                                {
                                    if (item.Side == Side.Buy && tick.Ask > 0)
                                    {
                                        actualPrice = tick.Ask;
                                        if (execTradeParam.OrderType == TradeType.Limit)
                                        {
                                            priceOffset = execTradeParam.BuyPriceOffset / -100000;
                                        }
                                        if (execTradeParam.OrderType == TradeType.Stop)
                                        {
                                            priceOffset = execTradeParam.BuyPriceOffset / 100000;
                                        }
                                    }

                                    else if (item.Side == Side.Sell && tick.Bid > 0)
                                    {
                                        actualPrice = tick.Bid;
                                        if (execTradeParam.OrderType == TradeType.Limit)
                                        {
                                            priceOffset = execTradeParam.SellPriceOffset / 100000;
                                        }
                                        if (execTradeParam.OrderType == TradeType.Stop)
                                        {
                                            priceOffset = execTradeParam.SellPriceOffset / -100000;
                                        }
                                    }
                                }
                            }

                            if (execTradeParam.HideSL == true)
                            {
                                stopLoss = null;
                            }
                            if (execTradeParam.HideTP == true)
                            {
                                takeProfit = null;
                            }

                            signalBase.PlaceOrder(new OrderParams(DateTime.UtcNow.Ticks.ToString(), item.Instrument.Symbol)
                            {
                                TimeInForce    = execTradeParam.TIF,
                                SLOffset       = stopLoss,
                                TPOffset       = takeProfit,
                                Quantity       = execTradeParam.OrderQuantity,
                                OrderSide      = item.Side,
                                OrderType      = execTradeParam.OrderType,
                                DataServerSide = execTradeParam.HideOrder,
                                Price          = actualPrice + priceOffset,
                            }, _account);
                            signalBase.Alert($"Trade: {execTradeParam.OrderType}, {item.Instrument.Symbol}, {item.Side}, {execTradeParam.OrderQuantity}, {execTradeParam.TP}, {execTradeParam.SL}");
                        }
                    }
                }
            }
        }
        public static List <TradeSignal> BacktestPriceSegmentProcessor(SignalBase signalBase, Dictionary <Selection, IEnumerable <Bar> > marketData,
                                                                       Auxiliaries.ExecuteTradesParam tradeParams,
                                                                       PriceConstants btBarSegment, Func <Dictionary <Selection, IEnumerable <Bar> >, List <TradeSignal> > detectSignals,
                                                                       Dictionary <Selection, IEnumerable <Bar> > trigInstrData = null,
                                                                       IEnumerable <Tick> queuedTicks = null)
        {
            var modMarketData = marketData.ToDictionary(k => k.Key, v => v.Value.Select(b => new Bar(b)).ToList().AsEnumerable());
            var origLast      = marketData.Last().Value.Last();
            var modLast       = modMarketData.Last().Value.Last();

            List <TradeSignal> trades = null;

            switch (btBarSegment)
            {
            case PriceConstants.OPEN:
                modLast.HighAsk  = origLast.OpenAsk;
                modLast.HighBid  = origLast.OpenBid;
                modLast.LowAsk   = origLast.OpenAsk;
                modLast.LowBid   = origLast.OpenBid;
                modLast.CloseAsk = origLast.OpenAsk;
                modLast.CloseBid = origLast.OpenBid;
                modLast.HighAsk  = origLast.OpenAsk;

                trigInstrData = modMarketData;
                trades        = detectSignals(modMarketData);
                break;

            case PriceConstants.HIGH:
                modLast.LowAsk   = origLast.HighAsk;
                modLast.LowBid   = origLast.HighBid;
                modLast.CloseAsk = origLast.HighAsk;
                modLast.CloseBid = origLast.HighBid;
                trigInstrData    = modMarketData;
                trades           = detectSignals(modMarketData);
                break;

            case PriceConstants.LOW:
                modLast.CloseAsk = origLast.LowAsk;
                modLast.CloseBid = origLast.LowBid;
                trigInstrData    = modMarketData;
                trades           = detectSignals(modMarketData);
                break;

            case PriceConstants.CLOSE:
                trigInstrData = modMarketData;
                trades        = detectSignals(modMarketData);
                break;

            case PriceConstants.OHLC:
                signalBase.Alert($"origin openAsk: {origLast.OpenAsk}");
                signalBase.Alert($"origin openBid: {origLast.OpenBid}");
                signalBase.Alert($"origin mean: {origLast.MeanOpen}");
                signalBase.Alert($"origin highAsk: {origLast.HighAsk}");
                signalBase.Alert($"origin highBid: {origLast.HighBid}");
                signalBase.Alert($"origin mean: {origLast.MeanHigh}");
                signalBase.Alert($"origin lowAsk: {origLast.LowAsk}");
                signalBase.Alert($"origin lowBid: {origLast.LowBid}");
                signalBase.Alert($"origin mean: {origLast.MeanLow}");
                signalBase.Alert($"origin closeAsk: {origLast.CloseAsk}");
                signalBase.Alert($"origin closeBid: {origLast.CloseBid}");
                signalBase.Alert($"origin mean: {origLast.MeanClose}");
                modLast.HighAsk  = origLast.OpenAsk;
                modLast.HighBid  = origLast.OpenBid;
                modLast.LowAsk   = origLast.OpenAsk;
                modLast.LowBid   = origLast.OpenBid;
                modLast.CloseAsk = origLast.OpenAsk;
                modLast.CloseBid = origLast.OpenBid;
                trigInstrData    = modMarketData;
                signalBase.Alert($"mod openAsk: {modLast.OpenAsk}");
                signalBase.Alert($"mod openBid: {modLast.OpenBid}");
                signalBase.Alert($"mod mean: {modLast.MeanOpen}");
                signalBase.Alert($"mod highAsk: {modLast.HighAsk}");
                signalBase.Alert($"mod highBid: {modLast.HighBid}");
                signalBase.Alert($"mod mean: {modLast.MeanHigh}");
                signalBase.Alert($"mod lowAsk: {modLast.LowAsk}");
                signalBase.Alert($"mod lowBid: {modLast.LowBid}");
                signalBase.Alert($"mod mean: {modLast.MeanLow}");
                signalBase.Alert($"mod closeAsk: {modLast.CloseAsk}");
                signalBase.Alert($"mod closeBid: {modLast.CloseBid}");
                signalBase.Alert($"mod mean: {modLast.MeanClose}");
                var trades1 = detectSignals(modMarketData);
                trades = trades1;

                //signalBase.Alert($"origin openAsk: {origLast.OpenAsk}");
                //signalBase.Alert($"origin openBid: {origLast.OpenBid}");
                //signalBase.Alert($"origin mean: {origLast.MeanOpen}");
                //signalBase.Alert($"origin highAsk: {origLast.HighAsk}");
                //signalBase.Alert($"origin highBid: {origLast.HighBid}");
                //signalBase.Alert($"origin mean: {origLast.MeanHigh}");
                //signalBase.Alert($"origin lowAsk: {origLast.LowAsk}");
                //signalBase.Alert($"origin lowBid: {origLast.LowBid}");
                //signalBase.Alert($"origin mean: {origLast.MeanLow}");
                //signalBase.Alert($"origin closeAsk: {origLast.CloseAsk}");
                //signalBase.Alert($"origin closeBid: {origLast.CloseBid}");
                //signalBase.Alert($"origin mean: {origLast.MeanClose}");
                modLast.HighAsk  = origLast.HighAsk;
                modLast.HighBid  = origLast.HighBid;
                modLast.LowAsk   = origLast.HighAsk;
                modLast.LowBid   = origLast.HighBid;
                modLast.CloseAsk = origLast.HighAsk;
                modLast.CloseBid = origLast.HighBid;
                trigInstrData    = modMarketData;
                //signalBase.Alert($"mod openAsk: {modLast.OpenAsk}");
                //signalBase.Alert($"mod openBid: {modLast.OpenBid}");
                //signalBase.Alert($"mod mean: {modLast.MeanOpen}");
                //signalBase.Alert($"mod highAsk: {modLast.HighAsk}");
                //signalBase.Alert($"mod highBid: {modLast.HighBid}");
                //signalBase.Alert($"mod mean: {modLast.MeanHigh}");
                //signalBase.Alert($"mod lowAsk: {modLast.LowAsk}");
                //signalBase.Alert($"mod lowBid: {modLast.LowBid}");
                //signalBase.Alert($"mod mean: {modLast.MeanLow}");
                //signalBase.Alert($"mod closeAsk: {modLast.CloseAsk}");
                //signalBase.Alert($"mod closeBid: {modLast.CloseBid}");
                //signalBase.Alert($"mod mean: {modLast.MeanClose}");
                var trades2 = detectSignals(modMarketData);
                trades.AddRange(trades2);

                //signalBase.Alert($"origin openAsk: {origLast.OpenAsk}");
                //signalBase.Alert($"origin openBid: {origLast.OpenBid}");
                //signalBase.Alert($"origin mean: {origLast.MeanOpen}");
                //signalBase.Alert($"origin highAsk: {origLast.HighAsk}");
                //signalBase.Alert($"origin highBid: {origLast.HighBid}");
                //signalBase.Alert($"origin mean: {origLast.MeanHigh}");
                //signalBase.Alert($"origin lowAsk: {origLast.LowAsk}");
                //signalBase.Alert($"origin lowBid: {origLast.LowBid}");
                //signalBase.Alert($"origin mean: {origLast.MeanLow}");
                //signalBase.Alert($"origin closeAsk: {origLast.CloseAsk}");
                //signalBase.Alert($"origin closeBid: {origLast.CloseBid}");
                //signalBase.Alert($"origin mean: {origLast.MeanClose}");
                modLast.LowAsk   = origLast.LowAsk;
                modLast.LowBid   = origLast.LowBid;
                modLast.CloseAsk = origLast.LowAsk;
                modLast.CloseBid = origLast.LowBid;
                trigInstrData    = modMarketData;
                //signalBase.Alert($"mod openAsk: {modLast.OpenAsk}");
                //signalBase.Alert($"mod openBid: {modLast.OpenBid}");
                //signalBase.Alert($"mod mean: {modLast.MeanOpen}");
                //signalBase.Alert($"mod highAsk: {modLast.HighAsk}");
                //signalBase.Alert($"mod highBid: {modLast.HighBid}");
                //signalBase.Alert($"mod mean: {modLast.MeanHigh}");
                //signalBase.Alert($"mod lowAsk: {modLast.LowAsk}");
                //signalBase.Alert($"mod lowBid: {modLast.LowBid}");
                //signalBase.Alert($"mod mean: {modLast.MeanLow}");
                //signalBase.Alert($"mod closeAsk: {modLast.CloseAsk}");
                //signalBase.Alert($"mod closeBid: {modLast.CloseBid}");
                //signalBase.Alert($"mod mean: {modLast.MeanClose}");
                var trades3 = detectSignals(modMarketData);
                trades.AddRange(trades3);

                modLast.CloseAsk = origLast.CloseAsk;
                modLast.CloseBid = origLast.CloseBid;
                modMarketData    = marketData;
                trigInstrData    = modMarketData;
                signalBase.Alert($"origin openAsk: {origLast.OpenAsk}");
                signalBase.Alert($"origin openBid: {origLast.OpenBid}");
                signalBase.Alert($"origin mean: {origLast.MeanOpen}");
                signalBase.Alert($"origin highAsk: {origLast.HighAsk}");
                signalBase.Alert($"origin highBid: {origLast.HighBid}");
                signalBase.Alert($"origin mean: {origLast.MeanHigh}");
                signalBase.Alert($"origin lowAsk: {origLast.LowAsk}");
                signalBase.Alert($"origin lowBid: {origLast.LowBid}");
                signalBase.Alert($"origin mean: {origLast.MeanLow}");
                signalBase.Alert($"origin closeAsk: {origLast.CloseAsk}");
                signalBase.Alert($"origin closeBid: {origLast.CloseBid}");
                signalBase.Alert($"origin mean: {origLast.MeanClose}");

                signalBase.Alert($"mod openAsk: {modLast.OpenAsk}");
                signalBase.Alert($"mod openBid: {modLast.OpenBid}");
                signalBase.Alert($"mod mean: {modLast.MeanOpen}");
                signalBase.Alert($"mod highAsk: {modLast.HighAsk}");
                signalBase.Alert($"mod highBid: {modLast.HighBid}");
                signalBase.Alert($"mod mean: {modLast.MeanHigh}");
                signalBase.Alert($"mod lowAsk: {modLast.LowAsk}");
                signalBase.Alert($"mod lowBid: {modLast.LowBid}");
                signalBase.Alert($"mod mean: {modLast.MeanLow}");
                signalBase.Alert($"mod closeAsk: {modLast.CloseAsk}");
                signalBase.Alert($"mod closeBid: {modLast.CloseBid}");
                signalBase.Alert($"mod mean: {modLast.MeanClose}");
                var trades4 = detectSignals(modMarketData);

                trades.AddRange(trades4);
                break;

            case PriceConstants.OLHC:
                modLast.HighAsk  = origLast.OpenAsk;
                modLast.HighBid  = origLast.OpenBid;
                modLast.LowAsk   = origLast.OpenAsk;
                modLast.LowBid   = origLast.OpenBid;
                modLast.CloseAsk = origLast.OpenAsk;
                modLast.CloseBid = origLast.OpenBid;
                trigInstrData    = modMarketData;
                trades1          = detectSignals(modMarketData);
                trades           = trades1;

                modLast.HighAsk  = origLast.LowAsk;
                modLast.HighBid  = origLast.LowBid;
                modLast.CloseAsk = origLast.LowAsk;
                modLast.CloseBid = origLast.LowBid;
                trigInstrData    = modMarketData;
                trades3          = detectSignals(modMarketData);
                trades.AddRange(trades3);

                modLast.CloseAsk = origLast.HighAsk;
                modLast.CloseBid = origLast.HighBid;
                trigInstrData    = modMarketData;
                trades2          = detectSignals(modMarketData);
                trades.AddRange(trades2);

                trigInstrData = modMarketData;
                trades4       = detectSignals(modMarketData);
                trades.AddRange(trades4);
                break;
            }

            return(trades);
        }