private async Task UpdateTrades() { List <Trade> newTrades = new List <Trade>(); if (Trades.Count == 0) { Trades.Add(new Trade { Status = TradeStatus.Empty }); } foreach (var trade in Trades.Where(t => t.Status != TradeStatus.Completed)) { var newTrade = await UpdateTrade(trade); if (newTrade != Trade.Empty) { newTrades.Add(newTrade); } } if (newTrades.Count > 0) { Trades.AddRange(newTrades); } var canceledTrades = Trades.Where(t => t.Status == TradeStatus.Canceled).ToList(); foreach (var canceledTrade in canceledTrades) { Trades.Remove(canceledTrade); } }
/// <summary>Display the trades grid context menu</summary> private void ShowContextMenu(DataGridView_.HitTestInfo hit, Trade trade, Order order) { var cmenu = new ContextMenuStrip(); if (trade != null) { var opt = cmenu.Items.Add2(new ToolStripMenuItem("Delete Trade")); opt.Enabled = !Bit.AnySet(trade.State, Trade.EState.PendingOrder | Trade.EState.ActivePosition); opt.ToolTipText = Bit.AnySet(trade.State, Trade.EState.PendingOrder | Trade.EState.ActivePosition) ? "Cannot delete trades with active or pending orders" : string.Empty; opt.Click += (s, a) => { Orders.RemoveAll(trade.Orders); Trades.Remove(trade); }; } if (order != null) { var opt = cmenu.Items.Add2(new ToolStripMenuItem("Delete Order")); opt.Enabled = !Bit.AnySet(order.State, Trade.EState.PendingOrder | Trade.EState.ActivePosition); opt.ToolTipText = Bit.AnySet(order.State, Trade.EState.PendingOrder | Trade.EState.ActivePosition) ? "Cannot delete trades with active or pending orders" : string.Empty; opt.Click += (s, a) => { Orders.Remove(order); }; } cmenu.Items.TidySeparators(); cmenu.Show(m_grid, hit.GridPoint); }
public void RemoveTrade() { DataConnection.RemoveTrade(SelectedTrade.Id); _unfilteredTrades.Remove(SelectedTrade); Trades.Remove(SelectedTrade); PropertyChanged.Raise(this, nameof(Trades)); UpdateDateRange(); }
/// <summary> /// Clears the state items associated with an inactive thrust. /// </summary> /// <param name="chart">The chart containing the thrust pattern to be purged.</param> /// <param name="thrust">The inactive thrust pattern to be purged.</param> /// <returns></returns> protected virtual async Task PurgeThrust(Chart chart, Thrust thrust) { // kill and save the signal MCE.Signal signal = await SubscriptionCaller.Instance().GetSignalAsync(thrust.SignalID); signal.Active = false; await SubscriptionCaller.Instance().UpdateSignalAsync(signal); // clear the chart chart.Patterns.RemoveAll(p => p.Type == MACC.Constants.SignalType.Thrust); Orders.Remove(Orders.FirstOrDefault(o => ((MarketMinerOrder)o).SignalID == signal.SignalID)); Trades.Remove(Trades.FirstOrDefault(t => ((MarketMinerTrade)t).SignalID == signal.SignalID)); }
public Task SaveTradeAsync(Trade trade) { var items = Trades.Where(x => x.Id == trade.Id).ToList(); if (items.Count > 0) { foreach (var item in items) { Trades.Remove(item); } Trades.Add(trade); } else { Trades.Add(trade); } return(Task.FromResult(true)); }
public void RemoveTrade(Trade tradeDetails) { Trades.Remove(tradeDetails); _brokerAccountUpdatedSubject.OnNext(new BrokerAccountUpdated(this)); }
/// <summary> /// Processes the Spark update event provided in the EventFeedArgs and updates security properties based on the event type /// </summary> /// <param name="sender">Event sender</param> /// <param name="eventFeedArgs">Event feed args</param> internal void EventReceived(object sender, EventFeedArgs eventFeedArgs) { //Process event Spark.Event eventItem = eventFeedArgs.Event; switch (eventItem.Type) { //Depth update case Spark.EVENT_NEW_DEPTH: case Spark.EVENT_AMEND_DEPTH: case Spark.EVENT_DELETE_DEPTH: //Check if exchange order book exists and create if it doesn't LimitOrderBook orderBook; if (!OrderBooks.TryGetValue(eventFeedArgs.Exchange, out orderBook)) { orderBook = new LimitOrderBook(eventFeedArgs.Symbol, eventFeedArgs.Exchange); OrderBooks.Add(eventFeedArgs.Exchange, orderBook); } //Submit update to appropriate exchange order book orderBook.SubmitEvent(eventItem); if (OnDepthUpdate != null) { OnDepthUpdate(this, new GenericEventArgs <LimitOrderBook>(eventFeedArgs.TimeStamp, orderBook)); } break; //Trade update case Spark.EVENT_TRADE: //Create and store trade record Trade trade = eventItem.ToTrade(eventFeedArgs.Symbol, eventFeedArgs.Exchange, eventFeedArgs.TimeStamp); Trades.Add(trade); if (OnTradeUpdate != null) { OnTradeUpdate(this, new GenericEventArgs <Trade>(eventFeedArgs.TimeStamp, trade)); } break; //Trade cancel case Spark.EVENT_CANCEL_TRADE: //Find original trade in trade record and delete Trade cancelledTrade = eventItem.ToTrade(eventFeedArgs.TimeStamp); Trade originalTrade = Trades.Find(x => (x.TimeStamp == cancelledTrade.TimeStamp && x.Price == cancelledTrade.Price && x.Volume == cancelledTrade.Volume)); if (originalTrade != null) { Trades.Remove(originalTrade); } break; //Market state update case Spark.EVENT_STATE_CHANGE: State = ApiFunctions.ConvertToMarketState(eventItem.State); if (OnMarketStateUpdate != null) { OnMarketStateUpdate(this, new GenericEventArgs <MarketState>(eventFeedArgs.TimeStamp, State)); } break; //Market quote update (change to best market bid-ask prices) case Spark.EVENT_QUOTE: if (OnQuoteUpdate != null) { LimitOrderBook depth = OrderBooks[eventFeedArgs.Exchange]; MarketQuote quote = new MarketQuote(eventFeedArgs.Symbol, eventFeedArgs.Exchange, depth.BidPrice, depth.AskPrice, eventFeedArgs.TimeStamp); OnQuoteUpdate(this, new GenericEventArgs <MarketQuote>(eventFeedArgs.TimeStamp, quote)); } break; //IAP (Indicative Auction Price) Update case Spark.EVENT_AUCTION_PRICE: break; default: //Console.WriteLine(eventItem.ToOutputString()); break; } }