public async Task <ValidationResult> ValidateLimitOrderAsync(string assetPairId, decimal price, decimal volume) { if (price <= 0) { return(new ValidationResult { Code = HftApiErrorCode.InvalidField, Message = HftApiErrorMessages.LessThanZero(nameof(price)), FieldName = nameof(price) }); } if (volume <= 0) { return(new ValidationResult { Code = HftApiErrorCode.InvalidField, Message = HftApiErrorMessages.LessThanZero(nameof(volume)), FieldName = nameof(volume) }); } var assetPair = await _assetsService.GetAssetPairByIdAsync(assetPairId); if (assetPair == null) { return(new ValidationResult { Code = HftApiErrorCode.ItemNotFound, Message = HftApiErrorMessages.AssetPairNotFound, FieldName = nameof(assetPairId) }); } if (volume < assetPair.MinVolume) { return(new ValidationResult { Code = HftApiErrorCode.InvalidField, Message = HftApiErrorMessages.MustBeGreaterThan(nameof(volume), assetPair.MinVolume.ToString(CultureInfo.InvariantCulture)), FieldName = nameof(volume) }); } return(null); }
public async Task <ValidationResult> ValidateLimitOrderAsync(string walletId, string assetPairId, OrderAction side, decimal price, decimal volume) { if (price <= 0) { return(new ValidationResult { Code = HftApiErrorCode.InvalidField, Message = HftApiErrorMessages.LessThanZero(nameof(price)), FieldName = nameof(price) }); } if (volume <= 0) { return(new ValidationResult { Code = HftApiErrorCode.InvalidField, Message = HftApiErrorMessages.LessThanZero(nameof(volume)), FieldName = nameof(volume) }); } var assetPair = await _assetsService.GetAssetPairByIdAsync(assetPairId); if (assetPair == null) { return(new ValidationResult { Code = HftApiErrorCode.ItemNotFound, Message = HftApiErrorMessages.AssetPairNotFound, FieldName = nameof(assetPairId) }); } if (volume < assetPair.MinVolume) { return(new ValidationResult { Code = HftApiErrorCode.InvalidField, Message = HftApiErrorMessages.MustBeGreaterThan(nameof(volume), assetPair.MinVolume.ToString(CultureInfo.InvariantCulture)), FieldName = nameof(volume) }); } decimal totalVolume; string asset; if (side == OrderAction.Buy) { asset = assetPair.QuoteAssetId; totalVolume = price * volume; } else { asset = assetPair.BaseAssetId; totalVolume = volume; } var balances = await _balanceService.GetBalancesAsync(walletId); var assetBalance = balances.FirstOrDefault(x => x.AssetId == asset); if (assetBalance == null || assetBalance.Available - assetBalance.Reserved < totalVolume) { return(new ValidationResult { Code = HftApiErrorCode.MeNotEnoughFunds, Message = "Not enough funds", FieldName = nameof(volume) }); } return(null); }