public void AddTrade(LiveTrade trade) { if (!Trades.Exists(x => x.TradeId == trade.TradeId)) { Trades.Add(trade); } }
private void RemoveAndAddToDatabase(LiveTrade liveTrade, ExecutionMessage message, MyDBContext dbContext) { DeleteRange(dbContext.LiveTrade.Where( x => x.AccountID == message.AccountID), dbContext); Add(liveTrade, dbContext); SaveChanges(dbContext); }
public void CancelTrades(LiveTrade trade, LiveTrade stopTrade) { PendingApprovalCodes.RemoveAll(x => x == trade.ApprovalCode); if (stopTrade != null) { PendingApprovalCodes.RemoveAll(x => x == stopTrade.ApprovalCode); } }
private LiveTrade OrderToTrade(LiveOrder order) { var ret = new LiveTrade( order.Security, order.OrderDirection, order.OrderType, order.OrderSize, order.LimitPrice); return(ret); }
public void AddOrUpdateLiveTrade(LiveTrade liveTrade) { using (var dbContext = new MyDBContext()) { var foundLiveTrade = dbContext.LiveTrade.SingleOrDefault(x => x.AccountID == liveTrade.AccountID); if (foundLiveTrade == null) { dbContext.LiveTrade.Add(liveTrade); } else { dbContext.UpdateEntryValues(foundLiveTrade, liveTrade); } dbContext.SaveChanges(); } }
public bool ExecuteTrades(LiveTrade trade, LiveTrade stopTrade) { if (!PendingApprovalCodes.Contains(trade.ApprovalCode) || (stopTrade != null && !PendingApprovalCodes.Contains(stopTrade.ApprovalCode))) { Log(new LogMessage("Trade Mgr", $"ERROR: Trades not approved: {trade} and {stopTrade}", LogMessageType.TradingError)); return(false); } ActiveAccount.Portfolio.AddTrade(trade); if (stopTrade != null) { ActiveAccount.Portfolio.AddTrade(stopTrade); } TradingProvider.SubmitTrades(trade, stopTrade); CancelTrades(trade, stopTrade); return(true); }
public LiveTradeEventArgs(LiveTrade trade) { Trade = trade ?? throw new ArgumentNullException(nameof(trade)); }
public async Task <IActionResult> Put(int id, [FromBody] LiveTrade value) { throw new NotImplementedException(); }
protected void OnTradeStatusUpdate(LiveTrade trade) { TradeStatusUpdate?.Invoke(this, new LiveTradeEventArgs(trade)); }
private void ProcessNewExecutionMessage(string commissionMessageExecutionId) { using (var dbContext = new MyDBContext()) { var liveTradesList = GetAll <LiveTrade>(dbContext).ToList(); var executionMessage = SingleOrDefault <ExecutionMessage>(x => x.ExecutionId == commissionMessageExecutionId, dbContext); accountIdAndSymbolForOrdersEqualFunc = x => x.AccountID == executionMessage.AccountID && x.InstrumentID == executionMessage.InstrumentID; if (executionMessage != null) { var liveTrade = new LiveTrade { UpdateTime = DateTime.Now }; var item = liveTradesList.LastOrDefault(accountIdAndSymbolForOrdersEqualFunc); if (item == null) { executionMessage.Map(liveTrade); Add(liveTrade, dbContext); SaveChanges(dbContext); } else if (ItIsSameSideTrade(executionMessage, liveTradesList)) { var newFillPrice = (item.AveragePrice * item.Quantity + executionMessage.Price * executionMessage.Quantity) / (item.Quantity + executionMessage.Quantity); var newQuantity = item.Quantity + executionMessage.Quantity; executionMessage.Map(liveTrade); liveTrade.Quantity = newQuantity; liveTrade.AveragePrice = newFillPrice; RemoveAndAddToDatabase(liveTrade, executionMessage, dbContext); } else //different side trade { if (executionMessage.Quantity > item.Quantity) { var newFillPrice = (item.AveragePrice * item.Quantity - executionMessage.Price * executionMessage.Quantity) / (item.Quantity - executionMessage.Quantity); var newQuantity = executionMessage.Quantity - item.Quantity; executionMessage.Map(liveTrade); liveTrade.AveragePrice = newFillPrice; liveTrade.Quantity = newQuantity; RemoveAndAddToDatabase(liveTrade, executionMessage, dbContext); } else { DeleteRange(dbContext.LiveTrade.Where( x => x.AccountID == executionMessage.AccountID), dbContext); SaveChanges(dbContext); } } } else if (!triedAgain) //wait and try again { Thread.Sleep(1000); triedAgain = true; ProcessNewExecutionMessage(commissionMessageExecutionId); } } }