예제 #1
0
        public Result CancelTrade(Trade trade)
        {
            var reservedAsset  = _assetRepository.GetById(trade.ReservedAssetId);
            var strategyAssets = _assetRepository.GetByStrategyId(trade.StrategyId);

            if (trade.TradeState == TradeState.New || trade.TradeState == TradeState.PartialyFulfilled)
            {
                trade.TradeState = trade.TradeState == TradeState.New ? TradeState.NewCanceled : TradeState.PartialyFulfilledCanceled;
                trade.Closed     = DateTime.Now;
                var originAsset = strategyAssets.FirstOrDefault(o =>
                                                                !o.IsReserved && o.Exchange == reservedAsset.Exchange &&
                                                                o.Currency == reservedAsset.Currency);
                if (originAsset == null)
                {
                    reservedAsset.IsReserved = false;
                    _assetRepository.EditNotSave(reservedAsset);
                }
                else
                {
                    originAsset.Amount += reservedAsset.Amount;
                    _assetRepository.EditNotSave(originAsset);
                    _assetRepository.DeleteNotSave(reservedAsset);
                }

                _tradeRepository.Edit(trade);
                _assetRepository.Save();
                return(new Result(true, trade.Id));
            }
            return(new Result(false, "Fulfilled or canceled already"));
        }