Exemplo n.º 1
0
        public void TryMatchMarketOrder(IMarketOrder order)
        {
            switch (order.Way)
            {
            case WayEnum.Buy:
                if (SellOrders.Count == 0)
                {
                    return;
                }

                while (order.Quantity > 0 && SellOrders.Count > 0)
                {
                    marketOrderMatchingAlgorithm.TryMatch(order, SellOrders[0]);
                }

                break;

            case WayEnum.Sell:
                if (BuyOrders.Count == 0)
                {
                    return;
                }

                while (order.Quantity > 0 && BuyOrders.Count > 0)
                {
                    marketOrderMatchingAlgorithm.TryMatch(BuyOrders[0], order);
                }
                break;
            }
        }
        public async Task <bool> TryCreateAsync(IMarketOrder marketOrder)
        {
            var byOrderEntity  = MarketOrderEntity.ByOrderId.Create(marketOrder);
            var byClientEntity = MarketOrderEntity.ByClientId.Create(marketOrder);

            return(await _tableStorage.TryInsertAsync(byOrderEntity) && await _tableStorage.TryInsertAsync(byClientEntity));
        }
Exemplo n.º 3
0
        public static ApiMarketOrder ConvertToApiModel(this IMarketOrder marketOrder, AssetPair assetPair, int accuracy)
        {
            var rate =
                (!marketOrder.Straight ? 1 / marketOrder.Price : marketOrder.Price).TruncateDecimalPlaces(
                    marketOrder.Straight ? assetPair.Accuracy : assetPair.InvertedAccuracy, marketOrder.OrderAction() == OrderAction.Buy);

            double converted = (rate * marketOrder.Volume).TruncateDecimalPlaces(accuracy, marketOrder.OrderAction() == OrderAction.Buy);

            var totalCost = marketOrder.OrderAction() == OrderAction.Sell ? marketOrder.Volume : converted;
            var volume    = marketOrder.OrderAction() == OrderAction.Sell ? converted : marketOrder.Volume;

            return(new ApiMarketOrder
            {
                Id = marketOrder.Id,
                OrderType = marketOrder.OrderAction().ToString(),
                AssetPair = marketOrder.AssetPairId,
                Volume = Math.Abs(volume),
                Comission = 0,
                Position = marketOrder.Volume,
                TotalCost = Math.Abs(totalCost),
                DateTime = marketOrder.CreatedAt.ToIsoDateTime(),
                Accuracy = assetPair.Accuracy,
                Price = rate,
                BaseAsset = marketOrder.Straight ? assetPair.BaseAssetId : assetPair.QuotingAssetId
            });
        }
Exemplo n.º 4
0
        private void TryMatchMarketOrder(IMarketOrder marketOrder)
        {
            if (marketOrder.Quantity == 0)
            {
                return;
            }

            switch (marketOrder.Way)
            {
            case WayEnum.Buy:
                if (!orderBookBestBidAsk.BestAskPrice.HasValue)
                {
                    return;
                }

                PriceSlots[orderBookBestBidAsk.BestAskPrice.Value].TryMatchMarketOrder(marketOrder);

                SetBestBidAndAsk();
                TryMatchMarketOrder(marketOrder);

                break;

            case WayEnum.Sell:
                if (!orderBookBestBidAsk.BestBidPrice.HasValue)
                {
                    return;
                }

                PriceSlots[orderBookBestBidAsk.BestBidPrice.Value].TryMatchMarketOrder(marketOrder);

                SetBestBidAndAsk();
                TryMatchMarketOrder(marketOrder);
                break;
            }
        }
            public static MarketOrderEntity Create(IMarketOrder marketOrder)
            {
                var entity = CreateNew(marketOrder);

                entity.RowKey       = GenerateRowKey(marketOrder.Id);
                entity.PartitionKey = GeneratePartitionKey(marketOrder.ClientId);
                return(entity);
            }
Exemplo n.º 6
0
        public async Task CreateAsync(IMarketOrder marketOrder)
        {
            var byOrderEntity  = MarketOrderEntity.ByOrderId.Create(marketOrder);
            var byClientEntity = MarketOrderEntity.ByClientId.Create(marketOrder);

            await _tableStorage.InsertAsync(byOrderEntity);

            await _tableStorage.InsertAsync(byClientEntity);
        }
Exemplo n.º 7
0
        public void HandleMarketOrder(IMarketOrder marketOrder)
        {
            string symbol = marketOrder.Symbol;

            if (!OrderBooks.ContainsKey(symbol))
            {
                return;
            }

            OrderBooks[symbol].HandleMarketOrder(marketOrder);
        }
Exemplo n.º 8
0
 public static MarketOrderEntity CreateNew(IMarketOrder marketOrder)
 {
     return(new MarketOrderEntity
     {
         AssetPairId = marketOrder.AssetPairId,
         ClientId = marketOrder.ClientId,
         CreatedAt = marketOrder.CreatedAt,
         Id = marketOrder.Id,
         MatchedAt = marketOrder.MatchedAt,
         Price = marketOrder.Price,
         Status = marketOrder.Status,
         Straight = marketOrder.Straight,
         Volume = marketOrder.Volume
     });
 }
Exemplo n.º 9
0
        public void TryMatch(ILimitOrder buyLimitOrder, IMarketOrder sellMarketOrder)
        {
            if (sellMarketOrder.Way != WayEnum.Sell || buyLimitOrder.Way != WayEnum.Buy)
            {
                return;
            }

            if (sellMarketOrder.Symbol != buyLimitOrder.Symbol)
            {
                return;
            }

            if (sellMarketOrder.Quantity == 0 || buyLimitOrder.Quantity == 0)
            {
                return;
            }

            int matchQuantity = FindMatchQuantity(sellMarketOrder, buyLimitOrder);

            if (matchQuantity == 0)
            {
                return;
            }

            double matchPrice = buyLimitOrder.Price;

            sellMarketOrder.Modify(sellMarketOrder.Quantity - matchQuantity);
            buyLimitOrder.Modify(buyLimitOrder.Quantity - matchQuantity);

            var execution = new NewExecution(buyLimitOrder, sellMarketOrder, matchQuantity, matchPrice, dateService.UtcNow());

            for (int i = 0; i < executionHandlers.Count; i++)
            {
                executionHandlers[i].Invoke(execution);
            }
        }
        public void TryMatch(ILimitOrder buyLimitOrder, IMarketOrder sellMarketOrder)
        {
            if (sellMarketOrder.Way != WayEnum.Sell || buyLimitOrder.Way != WayEnum.Buy)
                return;

            if (sellMarketOrder.Symbol != buyLimitOrder.Symbol)
                return;

            if (sellMarketOrder.Quantity == 0 || buyLimitOrder.Quantity == 0)
                return;

            int matchQuantity = FindMatchQuantity(sellMarketOrder, buyLimitOrder);
            if (matchQuantity == 0)
                return;

            double matchPrice = buyLimitOrder.Price;

            sellMarketOrder.Modify(sellMarketOrder.Quantity - matchQuantity);
            buyLimitOrder.Modify(buyLimitOrder.Quantity - matchQuantity);

            var execution = new NewExecution(buyLimitOrder, sellMarketOrder, matchQuantity, matchPrice, dateService.UtcNow());
            for (int i = 0; i < executionHandlers.Count; i++)
                executionHandlers[i].Invoke(execution);
        }
Exemplo n.º 11
0
        public void TryMatchMarketOrder(IMarketOrder order)
        {
            switch (order.Way)
            {
                case WayEnum.Buy:
                    if (SellOrders.Count == 0)
                        return;

                    while (order.Quantity > 0 && SellOrders.Count > 0)
                        marketOrderMatchingAlgorithm.TryMatch(order, SellOrders[0]);

                    break;

                case WayEnum.Sell:
                    if (BuyOrders.Count == 0)
                        return;

                    while (order.Quantity > 0 && BuyOrders.Count > 0)
                        marketOrderMatchingAlgorithm.TryMatch(BuyOrders[0], order);
                    break;
            }
        }
 private int FindMatchQuantity(IMarketOrder marketOrder, ILimitOrder limitOrder)
 {
     return Math.Min(marketOrder.Quantity, limitOrder.Quantity);
 }
Exemplo n.º 13
0
 public void HandleMarketOrder(IMarketOrder marketOrder)
 {
     TryMatchMarketOrder(marketOrder);
     SetBestBidAndAsk();
 }
Exemplo n.º 14
0
 private int FindMatchQuantity(IMarketOrder marketOrder, ILimitOrder limitOrder)
 {
     return(Math.Min(marketOrder.Quantity, limitOrder.Quantity));
 }
Exemplo n.º 15
0
        public static IClientTrade[] GetTradeRecords(this TradeQueueItem.TradeInfo trade, IMarketOrder marketOrder,
                                                     string btcTransactionId, IWalletCredentials walletCredentialsMarket,
                                                     IWalletCredentials walletCredentialsLimit)
        {
            var result = new List <IClientTrade>();

            result.AddRange(CreateTradeRecordsForClient(trade, marketOrder, btcTransactionId, walletCredentialsMarket, walletCredentialsLimit, true));
            result.AddRange(CreateTradeRecordsForClient(trade, marketOrder, btcTransactionId, walletCredentialsMarket, walletCredentialsLimit, false));

            return(result.ToArray());
        }
Exemplo n.º 16
0
        private void TryMatchMarketOrder(IMarketOrder marketOrder)
        {
            if (marketOrder.Quantity == 0)
                return;

            switch (marketOrder.Way)
            {
                case WayEnum.Buy:
                    if (!orderBookBestBidAsk.BestAskPrice.HasValue)
                        return;

                    PriceSlots[orderBookBestBidAsk.BestAskPrice.Value].TryMatchMarketOrder(marketOrder);

                    SetBestBidAndAsk();
                    TryMatchMarketOrder(marketOrder);

                    break;

                case WayEnum.Sell:
                    if (!orderBookBestBidAsk.BestBidPrice.HasValue)
                        return;

                    PriceSlots[orderBookBestBidAsk.BestBidPrice.Value].TryMatchMarketOrder(marketOrder);

                    SetBestBidAndAsk();
                    TryMatchMarketOrder(marketOrder);
                    break;
            }
        }
Exemplo n.º 17
0
        private static IClientTrade[] CreateTradeRecordsForClientWithVolumes(TradeQueueItem.TradeInfo trade, IMarketOrder marketOrder,
                                                                             string btcTransactionId, IWalletCredentials walletCredentialsMarket, IWalletCredentials walletCredentialsLimit,
                                                                             bool isMarketClient, double marketVolume, double limitVolume)
        {
            var clientId = isMarketClient ? walletCredentialsMarket?.ClientId : walletCredentialsLimit?.ClientId;

            if (!isMarketClient && string.IsNullOrWhiteSpace(clientId))
            {
                return(new IClientTrade[0]);
            }

            clientId = clientId ?? marketOrder.ClientId;

            var mutlisig     = isMarketClient ? walletCredentialsMarket?.MultiSig : walletCredentialsLimit?.MultiSig;
            var fromMultisig = isMarketClient ? walletCredentialsLimit?.MultiSig : walletCredentialsMarket?.MultiSig;

            var marketAssetRecord = CreateCommonPartForTradeRecord(trade, marketOrder, btcTransactionId);
            var limitAssetRecord  = CreateCommonPartForTradeRecord(trade, marketOrder, btcTransactionId);

            marketAssetRecord.ClientId    = limitAssetRecord.ClientId = clientId;
            marketAssetRecord.AddressFrom = limitAssetRecord.AddressFrom = fromMultisig;
            marketAssetRecord.AddressTo   = limitAssetRecord.AddressTo = mutlisig;
            marketAssetRecord.Multisig    = limitAssetRecord.Multisig = mutlisig;

            marketAssetRecord.Amount  = marketVolume * (isMarketClient ? -1 : 1);
            marketAssetRecord.AssetId = trade.MarketAsset;

            limitAssetRecord.Amount  = limitVolume * (isMarketClient ? 1 : -1);
            limitAssetRecord.AssetId = trade.LimitAsset;

            marketAssetRecord.Id = Utils.GenerateRecordId(marketAssetRecord.DateTime);
            limitAssetRecord.Id  = Utils.GenerateRecordId(limitAssetRecord.DateTime);

            return(new IClientTrade[] { marketAssetRecord, limitAssetRecord });
        }
Exemplo n.º 18
0
 private static IClientTrade[] CreateTradeRecordsForClient(TradeQueueItem.TradeInfo trade, IMarketOrder marketOrder,
                                                           string btcTransactionId, IWalletCredentials walletCredentialsMarket, IWalletCredentials walletCredentialsLimit,
                                                           bool isMarketClient)
 {
     return(CreateTradeRecordsForClientWithVolumes(trade, marketOrder, btcTransactionId, walletCredentialsMarket,
                                                   walletCredentialsLimit, isMarketClient, trade.MarketVolume, trade.LimitVolume));
 }
Exemplo n.º 19
0
 public void HandleMarketOrder(IMarketOrder marketOrder)
 {
     TryMatchMarketOrder(marketOrder);
     SetBestBidAndAsk();
 }
Exemplo n.º 20
0
 private static ClientTrade CreateCommonPartForTradeRecord(TradeQueueItem.TradeInfo trade, IMarketOrder marketOrder,
                                                           string btcTransactionId)
 {
     return(new ClientTrade
     {
         DateTime = trade.Timestamp,
         Price = trade.Price.GetValueOrDefault(),
         LimitOrderId = trade.LimitOrderId,
         MarketOrderId = marketOrder.Id,
         TransactionId = btcTransactionId
     });
 }
        public void HandleMarketOrder(IMarketOrder marketOrder)
        {
            string symbol = marketOrder.Symbol;
            if (!OrderBooks.ContainsKey(symbol))
                return;

            OrderBooks[symbol].HandleMarketOrder(marketOrder);
        }