public void AddToOrderBook(OrderLeg orderLeg) { _exchangeBook.NotifyOrderAdded(orderLeg); WatchOrder watchOrder = new WatchOrder(orderLeg); AddOrderToWatchList(watchOrder); }
public void AddOrderToExchange(OrderLeg orderLegRecord) { string TokenPairKey; string Token1Id; string Token2Id; OrderBook orderBook; TokenPairKey = orderLegRecord.Token1Id + "-" + orderLegRecord.Token2Id; Token1Id = orderLegRecord.Token1Id; Token2Id = orderLegRecord.Token2Id; // If the order book exists for the asset pair, then just add the order into the order book if (ExchangeTokenPairBook.TryGetValue(TokenPairKey, out orderBook) == true) { // Order book exists, so add the order to the order book orderBook.AddToOrderBook(orderLegRecord); } // If no order book exists for the asset pair, then create a new order book, add the order, and add the order book to the exchange asset pair list else { Console.WriteLine("Order Book created for Token Pair {0}-{1} with Key {2}", Token1Id, Token2Id, TokenPairKey); orderBook = new OrderBook(this, TokenPairKey, Token1Id, Token2Id, rateServiceClient); //// Link the order to the rate feed updates. //TokenPairRecord.bidRateChanged += orderBook.TokenPairBidRateChanged; //TokenPairRecord.askRateChanged += orderBook.TokenPairAskRateChanged; orderBook.AddToOrderBook(orderLegRecord); ExchangeTokenPairBook.Add(TokenPairKey, orderBook); } }
public WatchOrder(OrderLeg orderLeg) { _orderPrice = orderLeg.OrderPrice; orderLegRecord = orderLeg; if (orderLegRecord.Order != null) { ClientId = orderLegRecord.Order.ClientId; } }
private OrderConfirmation PlaceSpreadOrder(string token, enumOrderType orderType, decimal?price, decimal?stop, int refid) { Order order = InitOrder(); order.UnderlyingSymbol = "AA"; OrderLeg leg = new OrderLeg() { AssetType = enumAssetType.Equity, Symbol = "AA", Action = enumOrderAction.Sell, SpreadRatio = 100, PositionEffect = enumPositionEffect.Close }; order.Legs.Add(leg); leg = new OrderLeg() { AssetType = enumAssetType.Option, Symbol = "AA 180817C50000", Action = enumOrderAction.Buy, SpreadRatio = 1, PositionEffect = enumPositionEffect.Close }; order.Legs.Add(leg); leg = new OrderLeg() { AssetType = enumAssetType.Option, Symbol = "AA 180817P48000", Action = enumOrderAction.Sell, SpreadRatio = 1, PositionEffect = enumPositionEffect.Close }; order.Legs.Add(leg); order.ClientRefId = refid; order.OrderClass = enumOrderClass.Multileg; order.Quantity = 1; //this is spread quantity order.DebitCredit = enumDebitCredit.Debit; order.OrderType = orderType; order.Price = price; order.Stop = stop; order.AllOrNone = false; order.Duration = enumOrderDuration.Day; var confirm = PlaceNewOrder(token, order); return(confirm); }
public void NotifyOrderLegMatched(OrderLeg orderLegRecord, OrderFilledData orderFilledDataRecord) { orderFilledDataRecord.TransactionId = orderFilledCount++; OrderData orderData; ClientFilledOrder clientFilledOrderRecord; ClientOrder clientOrderRecord; Console.WriteLine("Order Matched: Order Id {0} , Client {1} Transaction Id {2} Token Pair {3}-{4} type {5} Amount filled {6} at Price {7}", orderLegRecord.OrderLegId, orderLegRecord.Order.ClientId, orderFilledDataRecord.TransactionId, orderLegRecord.Token1Id, orderLegRecord.Token2Id, orderLegRecord.OrderLegType.ToString(), orderFilledDataRecord.Token1Amount, orderFilledDataRecord.PriceFilled); // Update Position addFilledOrderToPosition(orderLegRecord, orderFilledDataRecord); lock (ClientOrderLock) { // This should always be true if (ClientOrders.TryGetValue(orderLegRecord.Order.ClientId, out clientOrderRecord) == true) { if (clientOrderRecord.ClientOrders.TryGetValue(orderLegRecord.OrderLegId, out orderData) == true) { orderData.OrderFillStatus = OrderLegFillStatusEnum.Partial; orderData.Token1AmountFilled += orderFilledDataRecord.Token1Amount; UpdateBlockChain(orderLegRecord, orderFilledDataRecord); lock (ClientFilledOrderLock) { if (ClientFilledOrders.TryGetValue(orderLegRecord.Order.ClientId, out clientFilledOrderRecord) == false) { clientFilledOrderRecord = new ClientFilledOrder(orderLegRecord.Order.ClientId); clientFilledOrderRecord.ClientTransactions.TryAdd(orderFilledDataRecord.TransactionId, orderFilledDataRecord); ClientFilledOrders.TryAdd(orderLegRecord.Order.ClientId, clientFilledOrderRecord); } else { clientFilledOrderRecord.ClientTransactions.TryAdd(orderFilledDataRecord.TransactionId, orderFilledDataRecord); } } } else { throw new Exception(String.Format("Error: Unable to locate client order {0} in NotifyOrderLegMatched", orderLegRecord.OrderLegId)); } } else { throw new Exception(String.Format("Error: Unable to locate client orders for clientId {0}", orderLegRecord.Order.ClientId)); } } }
public OrderLegDTO(OrderLeg leg) { this.OrderLegID = leg.OrderLegID; this.OrderID = leg.OrderID; this.BuyerUserID = leg.BuyerUserID; this.CommoditySellID = leg.CommoditySellID; this.CommodityBuyID = leg.CommodityBuyID; this.SellQuantity = leg.SellQuantity; this.BuyQuantity = leg.BuyQuantity; this.CommissionCommodityID = leg.CommissionCommodityID; this.Commission = leg.Commission; }
public void NotifyOrderLegFilled(OrderLeg orderLegRecord) { OrderData orderData; ClientOrder clientOrderRecord; ClientHistoricalOrder clientHistoricalOrderRecord; lock (ClientOrderLock) { try { if (ClientOrders.TryGetValue(orderLegRecord.Order.ClientId, out clientOrderRecord) == true) { if (clientOrderRecord.ClientOrders.TryGetValue(orderLegRecord.OrderLegId, out orderData) == true) { orderData.OrderFillStatus = OrderLegFillStatusEnum.Full; orderData.OrderStatus = OrderStatusEnum.Filled; lock (ClientHistoricalOrderLock) { if (ClientHistoricalOrders.TryGetValue(orderLegRecord.Order.ClientId, out clientHistoricalOrderRecord) == false) { clientHistoricalOrderRecord = new ClientHistoricalOrder(orderLegRecord.Order.ClientId); ClientHistoricalOrders.TryAdd(orderLegRecord.Order.ClientId, clientHistoricalOrderRecord); } clientHistoricalOrderRecord.ClientHistoricalOrders.TryAdd(orderLegRecord.OrderLegId, orderData); } clientOrderRecord.ClientOrders.TryRemove(orderLegRecord.OrderLegId, out orderData); } else { //throw new Exception(String.Format("Error: Unable to locate client order id {0}", orderLegRecord.OrderLegId)); Console.WriteLine("Error: Unable to locate client order id {0}", orderLegRecord.OrderLegId); } } else { //throw new Exception(String.Format("Error: Unable to locate client orders for {0}", orderLegRecord.Order.ClientId)); Console.WriteLine("Error: Unable to locate client orders for client", orderLegRecord.Order.ClientId); } } catch (Exception ex) { Console.WriteLine("Filed to update position for client {0} error {1}", orderLegRecord.Order.ClientId, ex.Message); } } Console.WriteLine("Order Filled: Order Id {0}, Client {1} Status Change to Filled", orderLegRecord.OrderLegId, orderLegRecord.Order.ClientId); }
public void NotifyOrderLegAdded(OrderLeg orderLegRecord) { OrderData orderData = new OrderData(); ClientOrder clientOrderRecord; orderLegRecord.CopyPropertiesTo(orderData); // The OrderId and OrderLegId will be created by the database orderData.OrderId = orderLegRecord.OrderId; orderData.OrderLegId = orderLegRecord.OrderLegId; orderData.BuySellType = orderLegRecord.BuySellType; orderData.OrderStatus = OrderStatusEnum.Active; orderData.OrderFillStatus = OrderLegFillStatusEnum.None; orderData.OrderPrice = orderLegRecord.OrderPrice; orderData.OrderPriceTerms = orderLegRecord.OrderPriceTerms; orderData.OrderType = (orderLegRecord.OrderLegType == OrderLegTypeEnum.Market ? OrderTypeEnum.Market : OrderTypeEnum.Limit); orderData.Token1Id = orderLegRecord.Token1Id; orderData.Token1Amount = orderLegRecord.Token1Amount; orderData.Token1AmountFilled = orderLegRecord.Token1AmountFilled; orderData.Token2Id = orderLegRecord.Token2Id; orderData.Token2Amount = orderLegRecord.Token2Amount; orderData.ClientAccountId = 0; orderData.ClientId = orderLegRecord.Order.ClientId; lock (ClientOrderLock) { if (ClientOrders.TryGetValue(orderData.ClientId, out clientOrderRecord) == false) { clientOrderRecord = new ClientOrder(orderData.ClientId); ClientOrders.TryAdd(orderData.ClientId, clientOrderRecord); } clientOrderRecord.ClientOrders.TryAdd(orderData.OrderId, orderData); } Console.WriteLine("Order Added: Order Id {0}, Client {1} Token Pair {2}-{3} type {4} at Price {5}", orderLegRecord.OrderLegId, orderLegRecord.Order.ClientId, orderLegRecord.Token1Id, orderLegRecord.Token2Id, orderLegRecord.OrderLegType.ToString(), orderLegRecord.OrderPrice); }
internal OrderConfirmation PlaceSimpleOrder(string token, string symbol, string underlying, enumAssetType assetType, enumPositionEffect positionEffect, enumOrderAction action, enumOrderType orderType, decimal?price, decimal?stop, int referenceId) { Order order = InitOrder(); order.UnderlyingSymbol = underlying; if (AccountId > 0) { order.AccountId = AccountId; // THIS FIELD IS OPTIONAL. ONLY REQUIRED IF YOU HAVE MORE THAN ONE ACCOUNT } if (SubaccountId.HasValue && SubaccountId.Value > 0) { order.SubaccountId = SubaccountId.Value; // THIS FIELD IS OPTIONAL. ONLY REQUIRED IF YOU HAVE MORE THAN ONE SUBACCOUNT } OrderLeg leg = new OrderLeg() { AssetType = assetType, Symbol = symbol, Action = action, PositionEffect = positionEffect }; order.Legs.Add(leg); order.ClientRefId = referenceId; order.OrderClass = enumOrderClass.Single; order.Quantity = 10; order.OrderType = orderType; order.Price = price; order.Stop = stop; order.AllOrNone = false; order.Duration = enumOrderDuration.Day; return(PlaceNewOrder(token, order)); }
private static string CreateOrderBodyString(Order order) { Instrument instrument = new Instrument(order.Symbol, AssetType.OPTION, OptionSymbolUtils.StandardDateFormat); OrderLeg orderLeg = new OrderLeg(order.Instruction, order.Quantity, instrument); List <OrderLeg> orderLegCollection = new List <OrderLeg>(); orderLegCollection.Add(orderLeg); string?priceStr = null; if (order.OrderType == OrderType.LIMIT) { double doublePrice = Math.Round(order.Limit, 2); priceStr = doublePrice.ToString(); } OrderBody orderBody = new OrderBody( "NONE", order.OrderType, "NORMAL", priceStr, order.CancelTime == null ? "DAY" : "GOOD_TILL_CANCEL", "SINGLE", orderLegCollection); string orderBodyStr = JsonConvert.SerializeObject(orderBody, new JsonSerializerSettings { DefaultValueHandling = DefaultValueHandling.Ignore, ContractResolver = new DefaultContractResolver { NamingStrategy = new CamelCaseNamingStrategy() } }); Log.Information("TDAm Order: {@Order}, string: {OrderStr}, Symbol {Symbol}", orderBody, orderBodyStr, instrument.Symbol); return(orderBodyStr); }
private void ApplyCommissions(OrderLeg leg, bool applyCommissionToBuy) { leg.CommissionCommodityID = applyCommissionToBuy ? leg.CommoditySellID : leg.CommodityBuyID; leg.Commission = (InfoExchangeConfigurationSection.Section.CommissionPercentage * (applyCommissionToBuy ? leg.SellQuantity : leg.BuyQuantity)).ToCeilingInt(); }
public OrderData AddOrder(OrderData orderData) { OrderLeg orderLegRecord = new OrderLeg(); orderLegRecord.Order = new Order(); orderCount++; orderData.OrderId = orderCount; try { Console.WriteLine("Add Order for Client {0} Details {1} ", orderData.ClientId, Newtonsoft.Json.JsonConvert.SerializeObject(orderData)); } catch (Exception ex) { Console.WriteLine("Problem Serializing Data in Add Order in debug write", ex.Message); } orderLegRecord.Order.ClientId = orderData.ClientId; // The OrderId and OrderLegId will be created by the database orderLegRecord.OrderId = orderData.OrderId; orderLegRecord.OrderLegId = orderData.OrderId; orderLegRecord.OrderLegCreatedDateTime = DateTime.Now; orderLegRecord.BuySellType = orderData.BuySellType; orderLegRecord.OrderLegFillStatus = OrderLegFillStatusEnum.None; orderLegRecord.OrderLegStatus = OrderLegStatusEnum.Active; orderLegRecord.OrderPriceTerms = orderData.OrderPriceTerms; orderLegRecord.OrderLegType = orderData.OrderType == OrderTypeEnum.Market ? OrderLegTypeEnum.Market : OrderLegTypeEnum.Limit; orderLegRecord.Token1AccountId = 0; orderLegRecord.Token2AccountId = 0; orderLegRecord.Token1Id = orderData.Token1Id; orderLegRecord.Token2Id = orderData.Token2Id; orderLegRecord.Token1Amount = orderData.Token1Amount; orderLegRecord.Token2Amount = orderData.Token2Amount; orderLegRecord.OrderPrice = orderData.OrderPrice; orderLegRecord.OrderPriceTerms = orderData.OrderPriceTerms; orderLegRecord.Order.ClientId = orderData.ClientId; orderLegRecord.Order.OrderId = orderData.OrderId; orderLegRecord.Order.OrderStatus = OrderStatusEnum.Active; orderLegRecord.Order.OrderType = orderData.OrderType; orderLegRecord.Order.OrderPriceTerms = orderData.OrderPriceTerms; // Needs to support expiration types like EOD, Good Till orderLegRecord.Order.OrderExpirationType = OrderExpirationTypeEnum.GoodTillCancel; _exchangeBook.AddOrderToExchange(orderLegRecord); // Automatic Offset via Broker who's clientID is 2 if (brokerLiquidityOn) { if (orderLegRecord.Order.ClientId != 2) { orderLegRecord = new OrderLeg(); orderLegRecord.Order = new Order(); orderCount++; orderLegRecord.Order.ClientId = 2; orderLegRecord.OrderId = orderCount; orderLegRecord.OrderLegId = orderCount; orderLegRecord.Order.OrderId = orderCount; Console.WriteLine("Add Order Offset using Broker {0} for Order Id {1} ", orderLegRecord.Order.ClientId, orderLegRecord.OrderId); orderLegRecord.OrderLegCreatedDateTime = DateTime.Now; orderLegRecord.BuySellType = orderData.BuySellType == OrderLegBuySellEnum.Buy ? OrderLegBuySellEnum.Sell : OrderLegBuySellEnum.Buy; orderLegRecord.OrderLegFillStatus = OrderLegFillStatusEnum.None; orderLegRecord.OrderLegStatus = OrderLegStatusEnum.Active; orderLegRecord.OrderPriceTerms = orderData.OrderPriceTerms; orderLegRecord.OrderLegType = orderData.OrderType == OrderTypeEnum.Market ? OrderLegTypeEnum.Market : OrderLegTypeEnum.Limit; orderLegRecord.Token1AccountId = 0; orderLegRecord.Token2AccountId = 0; orderLegRecord.Token1Id = orderData.Token1Id; orderLegRecord.Token2Id = orderData.Token2Id; orderLegRecord.Token1Amount = orderData.Token1Amount; orderLegRecord.Token2Amount = orderData.Token2Amount; orderLegRecord.OrderPrice = orderData.OrderPrice; orderLegRecord.OrderPriceTerms = orderData.OrderPriceTerms; orderLegRecord.Order.OrderStatus = OrderStatusEnum.Active; orderLegRecord.Order.OrderType = orderData.OrderType; orderLegRecord.Order.OrderPriceTerms = orderData.OrderPriceTerms; // Needs to support expiration types like EOD, Good Till orderLegRecord.Order.OrderExpirationType = OrderExpirationTypeEnum.GoodTillCancel; _exchangeBook.AddOrderToExchange(orderLegRecord); } } return(orderData); }
private void UpdateBlockChain(OrderLeg orderLegRecord, OrderFilledData orderFilledData) { BlockChainData blockChainRecord = new BlockChainData(); KeyPairData KeyPair = new KeyPairData(); //Console.WriteLine("Writing Order Flows to blockchain"); lock (BlockChainTransactionsLock) { if (orderLegRecord.BuySellType == OrderLegBuySellEnum.Buy) { blockChainRecord = new BlockChainData(); blockChainRecord.clientId = orderLegRecord.Order.ClientId; blockChainRecord.Date = orderFilledData.FilledDateTime.ToShortDateString(); blockChainRecord.BlockNumber = blockCount++; blockChainRecord.OrderId = orderLegRecord.OrderId; blockChainRecord.PayReceive = "Receive"; blockChainRecord.TokenAmount = orderFilledData.Token1Amount; blockChainRecord.TokenId = orderFilledData.Token1Id; if (KeyPairs.TryGetValue(1, out KeyPair) == true) { blockChainRecord.Address = KeyPair.publicKey; } else { //blockChainRecord.Address = GenerateNewClientKey(orderLegRecord.Order.ClientId); } blockChainRecord.TransactionHash = HashOrder(blockChainRecord); BlockChainTransactions.TryAdd(blockChainRecord.BlockNumber, blockChainRecord); blockChainRecord = new BlockChainData(); blockChainRecord.clientId = orderLegRecord.Order.ClientId; blockChainRecord.Date = DateTime.Now.ToShortDateString(); blockChainRecord.BlockNumber = blockCount++; blockChainRecord.OrderId = orderFilledData.OrderLegId; blockChainRecord.PayReceive = "Pay"; blockChainRecord.TokenAmount = orderFilledData.Token2Amount; blockChainRecord.TokenId = orderFilledData.Token2Id; if (KeyPairs.TryGetValue(0, out KeyPair) == true) { blockChainRecord.Address = KeyPair.publicKey; } else { //blockChainRecord.Address = GenerateNewClientKey(orderLegRecord.Order.ClientId); } blockChainRecord.TransactionHash = HashOrder(blockChainRecord); BlockChainTransactions.TryAdd(blockChainRecord.BlockNumber, blockChainRecord); } else { blockChainRecord = new BlockChainData(); blockChainRecord.Date = DateTime.Now.ToShortDateString(); blockChainRecord.clientId = orderLegRecord.Order.ClientId; blockChainRecord.BlockNumber = blockCount++; blockChainRecord.OrderId = orderLegRecord.OrderId; blockChainRecord.PayReceive = "Pay"; blockChainRecord.TokenAmount = orderFilledData.Token1Amount; blockChainRecord.TokenId = orderFilledData.Token1Id; if (KeyPairs.TryGetValue(0, out KeyPair) == true) { blockChainRecord.Address = KeyPair.publicKey; } else { } blockChainRecord.TransactionHash = HashOrder(blockChainRecord); BlockChainTransactions.TryAdd(blockChainRecord.BlockNumber, blockChainRecord); blockChainRecord = new BlockChainData(); blockChainRecord.Date = DateTime.Now.ToShortDateString(); blockChainRecord.clientId = orderLegRecord.Order.ClientId; blockChainRecord.BlockNumber = blockCount++; blockChainRecord.OrderId = orderLegRecord.OrderId; blockChainRecord.PayReceive = "Receive"; blockChainRecord.TokenAmount = orderFilledData.Token2Amount; blockChainRecord.TokenId = orderFilledData.Token2Id; if (KeyPairs.TryGetValue(1, out KeyPair) == true) { blockChainRecord.Address = KeyPair.publicKey; } else { } blockChainRecord.TransactionHash = HashOrder(blockChainRecord); BlockChainTransactions.TryAdd(blockChainRecord.BlockNumber, blockChainRecord); } } }
private void addFilledOrderToPosition(OrderLeg orderLegRecord, OrderFilledData orderFilledDataRecord) { ClientPosition clientPositionRecord; ClientPositionData ClientPosition = new ClientPositionData(); TokenRateData TokenRate = new TokenRateData(); int clientId = orderLegRecord.Order.ClientId; if (ClientPositions.TryGetValue(clientId, out clientPositionRecord) == false) { clientPositionRecord = new ClientPosition(clientId); ClientPositions.TryAdd(clientId, clientPositionRecord); } if (clientPositionRecord == null) { throw new Exception("Unable to find/generate client position record"); } if (orderLegRecord.BuySellType == OrderLegBuySellEnum.Buy) { if (clientPositionRecord.ClientPositions.TryGetValue(orderFilledDataRecord.Token1Id, out ClientPosition) == true) { ClientPosition.TokenAmount += orderFilledDataRecord.Token1Amount; ClientPosition.TokenValue = ClientPosition.TokenAmount * ClientPosition.TokenRate; } else { ClientPosition = new ClientPositionData(); ClientPosition.TokenId = orderFilledDataRecord.Token1Id; ClientPosition.TokenAmount = orderFilledDataRecord.Token1Amount; ClientPosition.TokenRate = 0.0m; ClientPosition.TokenRateIn = "USD"; if (TokenRates.TryGetValue(ClientPosition.TokenId, out TokenRate) == true) { ClientPosition.TokenRate = (decimal)TokenRate.AskRate; ClientPosition.TokenRateIn = TokenRate.PriceCurrency; } ClientPosition.TokenValue = ClientPosition.TokenAmount * ClientPosition.TokenRate; clientPositionRecord.ClientPositions.TryAdd(ClientPosition.TokenId, ClientPosition); } if (clientPositionRecord.ClientPositions.TryGetValue(orderFilledDataRecord.Token2Id, out ClientPosition) == true) { ClientPosition.TokenAmount -= orderFilledDataRecord.Token2Amount; ClientPosition.TokenValue = ClientPosition.TokenAmount * ClientPosition.TokenRate; } else { ClientPosition = new ClientPositionData(); ClientPosition.TokenId = orderFilledDataRecord.Token2Id; ClientPosition.TokenAmount -= orderFilledDataRecord.Token2Amount; ClientPosition.TokenRate = 0.0m; ClientPosition.TokenRateIn = "USD"; if (TokenRates.TryGetValue(ClientPosition.TokenId, out TokenRate) == true) { ClientPosition.TokenRate = (decimal)TokenRate.AskRate; ClientPosition.TokenRateIn = TokenRate.PriceCurrency; } ClientPosition.TokenValue = ClientPosition.TokenAmount * ClientPosition.TokenRate; clientPositionRecord.ClientPositions.TryAdd(ClientPosition.TokenId, ClientPosition); } } else { if (clientPositionRecord.ClientPositions.TryGetValue(orderFilledDataRecord.Token2Id, out ClientPosition) == true) { ClientPosition.TokenAmount += orderFilledDataRecord.Token2Amount; ClientPosition.TokenValue = ClientPosition.TokenAmount * ClientPosition.TokenRate; } else { ClientPosition = new ClientPositionData(); ClientPosition.TokenId = orderFilledDataRecord.Token2Id; ClientPosition.TokenAmount = orderFilledDataRecord.Token2Amount; ClientPosition.TokenRate = 0.0m; ClientPosition.TokenRateIn = "USD"; if (TokenRates.TryGetValue(ClientPosition.TokenId, out TokenRate) == true) { ClientPosition.TokenRate = (decimal)TokenRate.AskRate; ClientPosition.TokenRateIn = TokenRate.PriceCurrency; } ClientPosition.TokenValue = ClientPosition.TokenAmount * ClientPosition.TokenRate; clientPositionRecord.ClientPositions.TryAdd(ClientPosition.TokenId, ClientPosition); } if (clientPositionRecord.ClientPositions.TryGetValue(orderFilledDataRecord.Token1Id, out ClientPosition) == true) { ClientPosition.TokenAmount -= orderFilledDataRecord.Token1Amount; ClientPosition.TokenValue = ClientPosition.TokenAmount * ClientPosition.TokenRate; } else { ClientPosition = new ClientPositionData(); ClientPosition.TokenId = orderFilledDataRecord.Token1Id; ClientPosition.TokenAmount -= orderFilledDataRecord.Token1Amount; ClientPosition.TokenRate = 0.0m; ClientPosition.TokenRateIn = "USD"; if (TokenRates.TryGetValue(ClientPosition.TokenId, out TokenRate) == true) { ClientPosition.TokenRate = (decimal)TokenRate.AskRate; ClientPosition.TokenRateIn = TokenRate.PriceCurrency; } ClientPosition.TokenValue = ClientPosition.TokenAmount * ClientPosition.TokenRate; clientPositionRecord.ClientPositions.TryAdd(ClientPosition.TokenId, ClientPosition); } } }