示例#1
0
        public void AddToOrderBook(OrderLeg orderLeg)
        {
            _exchangeBook.NotifyOrderAdded(orderLeg);
            WatchOrder watchOrder = new WatchOrder(orderLeg);

            AddOrderToWatchList(watchOrder);
        }
示例#2
0
        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);
            }
        }
示例#3
0
 public WatchOrder(OrderLeg orderLeg)
 {
     _orderPrice    = orderLeg.OrderPrice;
     orderLegRecord = orderLeg;
     if (orderLegRecord.Order != null)
     {
         ClientId = orderLegRecord.Order.ClientId;
     }
 }
示例#4
0
        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);
        }
示例#5
0
        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));
                }
            }
        }
示例#6
0
 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;
 }
示例#7
0
        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);
        }
示例#8
0
        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);
        }
示例#9
0
        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));
        }
示例#10
0
        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);
        }
示例#11
0
 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();
 }
示例#12
0
        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);
        }
示例#13
0
        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);
                }
            }
        }
示例#14
0
        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);
                }
            }
        }