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")); }