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; } }
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); }