/// <summary> /// 购买,做多的时候 /// </summary> /// <param name="symbol"></param> /// <param name="userName"></param> /// <param name="accountId"></param> public static void BuyWhenDoMore(CommonSymbol symbol, AccountConfig account, AnalyzeResult analyzeResult) { var accountId = account.MainAccountId; var userName = account.UserName; var nowPrice = analyzeResult.NowPrice; var dogMoreBuy = new DogMoreBuyDao().GetMinBuyPriceDataOfNotSellFinished(accountId, userName, symbol.QuoteCurrency, symbol.BaseCurrency); var ladderBuyWhenDoMore = ladderMoreBuyPercent; if (symbol.QuoteCurrency == "usdt") { ladderBuyWhenDoMore = (decimal)1.06; } if (dogMoreBuy != null && (nowPrice * ladderBuyWhenDoMore > Math.Min(dogMoreBuy.BuyTradePrice, dogMoreBuy.BuyOrderPrice))) { throw new ApplicationException("有价格比这个更低得还没有收割。不能重新做多。"); } PlatformApi api = PlatformApi.GetInstance(userName); var accountInfo = api.GetAccountBalance(accountId); var quoteCurrency = accountInfo.Data.list.Find(it => it.currency == symbol.QuoteCurrency); // 要减去空单未收割得额度总和 var notShougeEmptySellAmount = new DogEmptySellDao().GetSumNotShougeDogEmptySell(userName, symbol.QuoteCurrency); if (!CommonHelper.CheckBalanceForDoMore(symbol.QuoteCurrency, quoteCurrency.balance, notShougeEmptySellAmount)) { Console.WriteLine($"{symbol.BaseCurrency}{symbol.QuoteCurrency}余额不足notShougeEmptySellAmount:{notShougeEmptySellAmount},balance:{quoteCurrency.balance}"); if (symbol.QuoteCurrency == "btc" && account.MainAccountId == "529880") { nobtcbalanceTime = DateTime.Now; } throw new ApplicationException($"余额不足notShougeEmptySellAmount:{notShougeEmptySellAmount},balance:{quoteCurrency.balance}"); } decimal recommendAmount = DogControlUtils.GetRecommendBuyAmount(symbol); var maxBuyPrice = new DogMoreBuyDao().GetMaxBuyPrice(accountId, userName, symbol.QuoteCurrency, symbol.BaseCurrency); recommendAmount = DogControlUtils.GetMoreSize(recommendAmount, maxBuyPrice, nowPrice); // 购买的要求 decimal buyQuantity = recommendAmount / nowPrice; buyQuantity = CoinUtils.CalcTradeQuantity(symbol, buyQuantity); // 判断是否满足最小购买数量 if (!CoinUtils.IsBiggerThenLeastBuyForDoMore(symbol.BaseCurrency, symbol.QuoteCurrency, buyQuantity)) { Console.WriteLine($" {symbol.BaseCurrency}{symbol.QuoteCurrency},做多数量太少,不符合最小交易额度"); return; } buyQuantity = decimal.Round(buyQuantity, symbol.AmountPrecision); decimal orderPrice = decimal.Round(nowPrice * (decimal)1.006, symbol.PricePrecision); OrderPlaceRequest req = new OrderPlaceRequest(); req.account_id = accountId; req.amount = buyQuantity.ToString(); req.price = orderPrice.ToString(); req.source = "api"; req.symbol = symbol.BaseCurrency + symbol.QuoteCurrency; req.type = "buy-limit"; if (BuyLimitUtils.Record(userName, symbol.BaseCurrency + symbol.QuoteCurrency)) { logger.Error(" --------------------- 两个小时内购买次数太多,暂停一会 --------------------- "); Thread.Sleep(1000 * 10); return; } HBResponse <long> order = null; try { logger.Error($""); logger.Error($"1: 开始下单 -----------------------------{JsonConvert.SerializeObject(req)}"); order = api.OrderPlace(req); logger.Error($"2: 下单结束 -----------------------------{JsonConvert.SerializeObject(order)}"); if (order.Status == "ok") { new DogMoreBuyDao().CreateDogMoreBuy(new DogMoreBuy() { SymbolName = symbol.BaseCurrency, QuoteCurrency = symbol.QuoteCurrency, AccountId = accountId, UserName = userName, BuyQuantity = buyQuantity, BuyOrderPrice = orderPrice, BuyDate = DateTime.Now, BuyOrderResult = JsonConvert.SerializeObject(order), BuyState = StateConst.PreSubmitted, BuyTradePrice = 0, BuyOrderId = order.Data, BuyMemo = "", BuyOrderDetail = "", BuyOrderMatchResults = "", IsFinished = false }); // 下单成功马上去查一次 QueryBuyDetailAndUpdate(userName, order.Data); } logger.Error($"3: 入库结束 -----------------------------做多 下单购买结果 {JsonConvert.SerializeObject(req)}, notShougeEmptySellAmount:{notShougeEmptySellAmount}, order:{JsonConvert.SerializeObject(order)}, nowPrice:{nowPrice}, accountId:{accountId},"); logger.Error($""); } catch (Exception ex) { logger.Error($"严重严重 --------------- 下的出错 --------------{JsonConvert.SerializeObject(req)}"); Thread.Sleep(1000 * 60 * 5); throw ex; } }