/// <summary> /// 查询指定账户的余额 /// </summary> public void GetUserAccounts() { string resourcePath = AppSetting.GetConnection("HuoBi", "GetAccountBalance"); string proAccountId = AppSetting.GetConnection("HuoBi", "GetProAccountId"); resourcePath = resourcePath.Replace("{account-id}", proAccountId); //GET /v1/account/accounts/{account-id}/balance HBResponse<BalanceResponse> rsp = HttpRestHelper.SendRequestEncryption<BalanceResponse>(resourcePath); //trade: 交易余额,frozen: 冻结余额 var res = from item in rsp.Data.list where double.Parse(item.balance) != 0.0 group item by item.currency into m select new BalanceEntity() { CurrencyName = m.Key, CreateDate = DateTime.Now, TradeBalance = m.Where(p => p.type.Equals("trade")).Sum(o => double.Parse(o.balance)), FrozenBalance = m.Where(p => p.type.Equals("frozen")).Sum(o => double.Parse(o.balance)) }; if (res.Any()) { _iBalanceRepository.AddBulk<List<BalanceEntity>>(res.ToList()); } }
public async Task BuyTest(string quoteCurrency) { var symbols = CoinUtils.GetAllCommonSymbols(quoteCurrency); var account = AccountConfigUtils.GetAccountConfig("qq"); foreach (var symbol in symbols) { PlatformApi api = PlatformApi.GetInstance("qq"); OrderPlaceRequest req = new OrderPlaceRequest(); req.account_id = account.MainAccountId; req.amount = "0.0000001"; req.price = "0.001"; req.source = "api"; req.symbol = symbol.BaseCurrency + symbol.QuoteCurrency; req.type = "buy-limit"; try { HBResponse <long> order = api.OrderPlace(req); logger.Error($"3 ------------------------"); } catch (Exception ex) { logger.Error($"{ symbol.BaseCurrency + symbol.QuoteCurrency}" + ex.Message, ex); } } }
public void UpdateTradeRecordSellSuccess(long sellOrderId, HBResponse <OrderDetail> orderDetail, HBResponse <List <OrderMatchResult> > orderMatchResult, decimal sellTradePrice) { using (var tx = Database.BeginTransaction()) { var sql = $"update t_pig_more set STradeP={sellTradePrice}, SState='{orderDetail.Data.state}' ,SOrderDetail='{JsonConvert.SerializeObject(orderDetail)}', SOrderMatchResults='{JsonConvert.SerializeObject(orderMatchResult)}' where SOrderId ='{sellOrderId}'"; Database.Execute(sql); tx.Commit(); } }
public void UpdatePigMoreBuySuccess(long buyOrderId, HBResponse <OrderDetail> orderDetail, HBResponse <List <OrderMatchResult> > orderMatchResult, decimal buyTradePrice) { using (var tx = Database.BeginTransaction()) { var sql = $"update t_pig_more set BTradeP={buyTradePrice}, BState='{orderDetail.Data.state}' ,BOrderDetail='{JsonConvert.SerializeObject(orderDetail)}', BOrderMatchResults='{JsonConvert.SerializeObject(orderMatchResult)}' where BOrderId ='{buyOrderId}'"; Database.Execute(sql); tx.Commit(); } }
public void UpdateDogEmptySellWhenSuccess(long sellOrderId, HBResponse <OrderDetail> orderDetail, HBResponse <List <OrderMatchResult> > orderMatchResult, decimal sellTradePrice) { using (var tx = Database.BeginTransaction()) { var sqlSell = $"update t_dog_empty_sell set SellTradePrice={sellTradePrice}, SellState='{orderDetail.Data.state}' ,SellOrderDetail='{JsonConvert.SerializeObject(orderDetail)}'," + $" SellOrderMatchResults='{JsonConvert.SerializeObject(orderMatchResult)}' where SellOrderId ='{sellOrderId}'"; Database.Execute(sqlSell); tx.Commit(); } }
/// <summary> /// 查询当前用户的所有账户 /// </summary> /// <returns></returns> public int GetUserId() { string resourcePath = AppSetting.GetConnection("HuoBi", "GetAccountId"); //GET /v1/account/accounts HBResponse<AccountsResponse> rsp = HttpRestHelper.SendRequestEncryption<AccountsResponse>(resourcePath); if (rsp.Status.Equals("ok")) { return rsp.Data.user_id; } return 0; }
public void UpdateDogEmptyBuyWhenSuccess(long buyOrderId, HBResponse <OrderDetail> orderDetail, HBResponse <List <OrderMatchResult> > orderMatchResult, decimal buyTradePrice) { var dogEmptyBuy = GetDogEmptyBuyByBuyOrderId(buyOrderId); using (var tx = Database.BeginTransaction()) { var sqlBuy = $"update t_dog_empty_sell set IsFinished=1 where SellOrderId={dogEmptyBuy.SellOrderId}"; Database.Execute(sqlBuy); var sqlSell = $"update t_dog_empty_buy set BuyTradePrice={buyTradePrice}, BuyState='{orderDetail.Data.state}' ,BuyOrderDetail='{JsonConvert.SerializeObject(orderDetail)}'," + $" BuyOrderMatchResults='{JsonConvert.SerializeObject(orderMatchResult)}' where BuyOrderId ='{buyOrderId}'"; Database.Execute(sqlSell); tx.Commit(); } }
public void UpdateDogMoreBuySuccess(long buyOrderId, HBResponse <OrderDetail> orderDetail, HBResponse <List <OrderMatchResult> > orderMatchResult, decimal buyTradePrice) { var results = JsonConvert.SerializeObject(orderMatchResult); if (results.Length > 8000) { logger.Error($"{results}"); results = results.Substring(0, 8000); } using (var tx = Database.BeginTransaction()) { var sql = $"update t_dog_more_buy set BuyTradePrice={buyTradePrice}, BuyState='{orderDetail.Data.state}' ,BuyOrderDetail='{JsonConvert.SerializeObject(orderDetail)}', BuyOrderMatchResults='{results}' where BuyOrderId ='{buyOrderId}'"; Database.Execute(sql); tx.Commit(); } }
public void UpdateDogMoreSellWhenSuccess(long sellOrderId, HBResponse <OrderDetail> orderDetail, HBResponse <List <OrderMatchResult> > orderMatchResult, decimal sellTradePrice) { var dogMoreSell = GetDogMoreSellBySellOrderId(sellOrderId); var results = JsonConvert.SerializeObject(orderMatchResult); if (results.Length > 8000) { logger.Error($"{results}"); results = results.Substring(0, 8000); } using (var tx = Database.BeginTransaction()) { var sqlBuy = $"update t_dog_more_buy set IsFinished=1 where BuyOrderId={dogMoreSell.BuyOrderId}"; Database.Execute(sqlBuy); var sqlSell = $"update t_dog_more_sell set SellTradePrice={sellTradePrice}, SellState='{orderDetail.Data.state}' ,SellOrderDetail='{JsonConvert.SerializeObject(orderDetail)}'," + $" SellOrderMatchResults='{results}' where SellOrderId ='{sellOrderId}'"; Database.Execute(sqlSell); tx.Commit(); } }
public static void ShouGeDogMore(DogMoreBuy dogMoreBuy, CommonSymbol symbol, AnalyzeResult analyzeResult = null) { if (analyzeResult == null) { analyzeResult = AnalyzeResult.GetAnalyzeResult(symbol); } if (analyzeResult == null) { return; } var nowPrice = analyzeResult.NowPrice; var thisLadderMoreSellPercent = ladderMoreSellPercent; if (analyzeResult.NowPrice / analyzeResult.MinPrice > (decimal)1.20) { thisLadderMoreSellPercent = (decimal)1.085; } else if (analyzeResult.NowPrice / analyzeResult.MinPrice > (decimal)1.30) { thisLadderMoreSellPercent = (decimal)1.08; } else if (analyzeResult.NowPrice / analyzeResult.MinPrice > (decimal)1.40) { thisLadderMoreSellPercent = (decimal)1.075; } else if (analyzeResult.NowPrice / analyzeResult.MinPrice > (decimal)1.50) { thisLadderMoreSellPercent = (decimal)1.07; } else if (analyzeResult.NowPrice / analyzeResult.MinPrice > (decimal)1.60) { thisLadderMoreSellPercent = (decimal)1.065; } thisLadderMoreSellPercent = Math.Max(thisLadderMoreSellPercent, (decimal)1.065); // 没有大于预期, 也不能收割 if (nowPrice < dogMoreBuy.BuyTradePrice * thisLadderMoreSellPercent) { return; } if (!analyzeResult.CheckCanSellForHuiDiao(dogMoreBuy)) { Console.WriteLine("不满足回调"); // 判断是否有回掉 return; } // 计算要出的数量 decimal sellQuantity = JudgeSellUtils.CalcSellQuantityForMoreShouge(dogMoreBuy.BuyQuantity, dogMoreBuy.BuyTradePrice, nowPrice, symbol); // 计算要出的价格 decimal sellPrice = decimal.Round(nowPrice * (decimal)0.988, symbol.PricePrecision); if (sellQuantity >= dogMoreBuy.BuyQuantity) { Console.WriteLine("出售的量过多"); return; } if (sellQuantity * sellPrice <= dogMoreBuy.BuyQuantity * dogMoreBuy.BuyTradePrice) { //logger.Error($"{dogMoreBuy.SymbolName}{dogMoreBuy.QuoteCurrency} 未实现双向收益 sellQuantity:{sellQuantity}, BuyQuantity:{dogMoreBuy.BuyQuantity},sellQuantity * nowPrice:{sellQuantity * nowPrice},dogMoreBuy.BuyQuantity * dogMoreBuy.BuyTradePrice:{dogMoreBuy.BuyQuantity * dogMoreBuy.BuyTradePrice}"); return; } OrderPlaceRequest req = new OrderPlaceRequest(); req.account_id = dogMoreBuy.AccountId; req.amount = sellQuantity.ToString(); req.price = sellPrice.ToString(); req.source = "api"; req.symbol = symbol.BaseCurrency + symbol.QuoteCurrency;; req.type = "sell-limit"; PlatformApi api = PlatformApi.GetInstance(dogMoreBuy.UserName); 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") { DogMoreSell dogMoreSell = new DogMoreSell() { AccountId = dogMoreBuy.AccountId, UserName = dogMoreBuy.UserName, BuyOrderId = dogMoreBuy.BuyOrderId, SellOrderId = order.Data, SellOrderResult = JsonConvert.SerializeObject(order), SellDate = DateTime.Now, SellQuantity = sellQuantity, SellOrderPrice = sellPrice, SellState = StateConst.Submitted, SellTradePrice = 0, SymbolName = symbol.BaseCurrency, QuoteCurrency = symbol.QuoteCurrency, SellMemo = "", SellOrderDetail = "", SellOrderMatchResults = "" }; new DogMoreSellDao().CreateDogMoreSell(dogMoreSell); // 下单成功马上去查一次 QuerySellDetailAndUpdate(dogMoreBuy.UserName, order.Data); } logger.Error($"3:入库结束 ----------------------------- 多单收割 --> {JsonConvert.SerializeObject(dogMoreBuy)}"); logger.Error($""); } catch (Exception ex) { logger.Error($"严重严重111111 ----------------------------- 多单收割出错"); Thread.Sleep(1000 * 60 * 5); throw ex; } }
private static void SellWhenDoEmpty(string accountId, string userName, CommonSymbol symbol, decimal sellQuantity, decimal sellPrice, string sellMemo = "") { try { if ((symbol.AmountPrecision == 0 && sellQuantity < (decimal)20) || (symbol.AmountPrecision == 1 && sellQuantity < (decimal)2) || (symbol.AmountPrecision == 2 && sellQuantity < (decimal)0.2) || (symbol.AmountPrecision == 3 && sellQuantity < (decimal)0.02) || (symbol.AmountPrecision == 4 && sellQuantity < (decimal)0.002)) { LogNotBuy(symbol.BaseCurrency + "-empty-sell", $"sell userName:{userName} 出错,{symbol.BaseCurrency} 的精度为 {symbol.AmountPrecision}, 但是却要出售{sellQuantity} "); return; } OrderPlaceRequest req = new OrderPlaceRequest(); req.account_id = accountId; req.amount = sellQuantity.ToString(); req.price = sellPrice.ToString(); req.source = "api"; req.symbol = symbol.BaseCurrency + symbol.QuoteCurrency;; req.type = "sell-limit"; PlatformApi api = PlatformApi.GetInstance(userName); HBResponse <long> order = null; try { logger.Error($""); logger.Error($"1: 开始下单 -----------------------------{JsonConvert.SerializeObject(req)}"); order = api.OrderPlace(req); logger.Error($"2: 下单结束 -----------------------------{JsonConvert.SerializeObject(req)}"); if (order.Status == "ok") { DogEmptySell dogEmptySell = new DogEmptySell() { AccountId = accountId, UserName = userName, SellOrderId = order.Data, SellOrderResult = JsonConvert.SerializeObject(order), SellDate = DateTime.Now, SellQuantity = sellQuantity, SellOrderPrice = sellPrice, SellState = StateConst.Submitted, SellTradePrice = 0, SymbolName = symbol.BaseCurrency, QuoteCurrency = symbol.QuoteCurrency, SellMemo = sellMemo, SellOrderDetail = "", SellOrderMatchResults = "", IsFinished = false }; new DogEmptySellDao().CreateDogEmptySell(dogEmptySell); // 下单成功马上去查一次 QueryEmptySellDetailAndUpdate(userName, order.Data); } logger.Error($"3: 入库结束 -----------------------------做空 {JsonConvert.SerializeObject(req)}下单出售结果:" + JsonConvert.SerializeObject(order)); logger.Error($""); } catch (Exception ex) { logger.Error($"严重 --------------- 做空出错 --------------{JsonConvert.SerializeObject(req)}"); Thread.Sleep(1000 * 60 * 5); throw ex; } } catch (Exception ex) { logger.Error($"SellWhenDoEmpty {ex.Message}", ex); } }
public static string ShouGeDogEmpty(DogEmptySell dogEmptySell, CommonSymbol symbol, AnalyzeResult analyzeResult, bool isShouge = false) { var nowPrice = analyzeResult.NowPrice; var ladderEmptyWhenShouGe = ladderEmptyBuyPercent; if (isShouge) { ladderEmptyWhenShouGe = (decimal)1.05; } if (nowPrice * ladderEmptyWhenShouGe > dogEmptySell.SellTradePrice) { Console.WriteLine("没有收益,不能收割"); return("没有收益,不能收割"); } if (!analyzeResult.CheckCanBuyForHuiDiao(dogEmptySell)) { return("没有回调"); } decimal buyQuantity = CommonHelper.CalcBuyQuantityForEmptyShouge(dogEmptySell.SellQuantity, dogEmptySell.SellTradePrice, nowPrice, symbol); if (buyQuantity <= dogEmptySell.SellQuantity || nowPrice * buyQuantity >= dogEmptySell.SellQuantity * dogEmptySell.SellTradePrice) { Console.WriteLine($" {symbol.BaseCurrency}{symbol.QuoteCurrency}没有实现双向收益, 不能收割空单"); return("没有实现双向收益, 不能收割空单"); } decimal orderPrice = decimal.Round(nowPrice * (decimal)1.01, symbol.PricePrecision); OrderPlaceRequest req = new OrderPlaceRequest(); req.account_id = dogEmptySell.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(dogEmptySell.UserName, symbol.BaseCurrency + symbol.QuoteCurrency)) { logger.Error(" --------------------- 两个小时内购买次数太多,暂停一会 --------------------- "); Thread.Sleep(1000 * 5); return(" 两个小时内购买次数太多,暂停一会"); } PlatformApi api = PlatformApi.GetInstance(dogEmptySell.UserName); 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 DogEmptyBuyDao().CreateDogEmptyBuy(new DogEmptyBuy() { SymbolName = symbol.BaseCurrency, QuoteCurrency = symbol.QuoteCurrency, AccountId = dogEmptySell.AccountId, UserName = dogEmptySell.UserName, SellOrderId = dogEmptySell.SellOrderId, BuyQuantity = buyQuantity, BuyOrderPrice = orderPrice, BuyDate = DateTime.Now, BuyOrderResult = JsonConvert.SerializeObject(order), BuyState = StateConst.PreSubmitted, BuyTradePrice = 0, BuyOrderId = order.Data, BuyMemo = "", BuyOrderDetail = "", BuyOrderMatchResults = "", }); // 下单成功马上去查一次 QueryEmptyBuyDetailAndUpdate(dogEmptySell.UserName, order.Data); } logger.Error($"3: 入库结束 ----------------------------- 空单收割"); logger.Error($""); return("运行结束"); } catch (Exception ex) { logger.Error($"严重严重 --------------- 空单收割出错"); Thread.Sleep(1000 * 60 * 5); throw ex; } }
/// <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; } }
/// <summary> /// 查询当前委托、历史委托 /// </summary> public void GerOrderDelegate() { //GET /v1/order/orders string resourcePath = AppSetting.GetConnection("HuoBi", "GetOrderDelegate"); HBResponse<OrderDelegateResponse> rsp = HttpRestHelper.SendRequestEncryption<OrderDelegateResponse>(resourcePath); }
private static void RunSell(CommonSymbols symbol) { var key = HistoryKlinePools.GetKey(symbol, "1min"); var historyKlineData = HistoryKlinePools.Get(key); if (historyKlineData == null || historyKlineData.Data == null || historyKlineData.Data.Count == 0 || historyKlineData.Date < DateTime.Now.AddMinutes(-1)) // TODO { logger.Error($"RunSell 数据还未准备好:{symbol.BaseCurrency}"); Thread.Sleep(1000 * 5); return; } var historyKlines = historyKlineData.Data; // 获取最近行情 decimal lastLowPrice; decimal nowPrice; // 分析是否下跌, 下跌超过一定数据,可以考虑 decimal flexPercent = (decimal)1.050; var flexPointList = CoinAnalyze.Analyze(historyKlines, out lastLowPrice, out nowPrice, flexPercent); if (flexPointList == null || flexPointList.Count == 0 || (flexPointList.Count == 1 && !flexPointList[0].isHigh)) { flexPercent = (decimal)1.045; flexPointList = CoinAnalyze.Analyze(historyKlines, out lastLowPrice, out nowPrice, flexPercent); } if (flexPointList == null || flexPointList.Count == 0 || (flexPointList.Count == 1 && !flexPointList[0].isHigh)) { flexPercent = (decimal)1.040; flexPointList = CoinAnalyze.Analyze(historyKlines, out lastLowPrice, out nowPrice, flexPercent); } if (flexPointList == null || flexPointList.Count == 0 || (flexPointList.Count == 1 && !flexPointList[0].isHigh)) { flexPercent = (decimal)1.035; flexPointList = CoinAnalyze.Analyze(historyKlines, out lastLowPrice, out nowPrice, flexPercent); } if (flexPointList == null || flexPointList.Count == 0 || (flexPointList.Count == 1 && !flexPointList[0].isHigh)) { flexPercent = (decimal)1.03; flexPointList = CoinAnalyze.Analyze(historyKlines, out lastLowPrice, out nowPrice, flexPercent); } if (flexPointList == null || flexPointList.Count == 0 || (flexPointList.Count == 1 && !flexPointList[0].isHigh)) { flexPercent = (decimal)1.025; flexPointList = CoinAnalyze.Analyze(historyKlines, out lastLowPrice, out nowPrice, flexPercent); } if (flexPointList == null || flexPointList.Count == 0 || (flexPointList.Count == 1 && !flexPointList[0].isHigh)) { flexPercent = (decimal)1.02; flexPointList = CoinAnalyze.Analyze(historyKlines, out lastLowPrice, out nowPrice, flexPercent); } if (flexPointList == null || flexPointList.Count == 0 || (flexPointList.Count == 1 && !flexPointList[0].isHigh)) { flexPercent = (decimal)1.015; flexPointList = CoinAnalyze.Analyze(historyKlines, out lastLowPrice, out nowPrice, flexPercent); } if (flexPointList.Count == 0 && flexPointList.Count == 0) { logger.Error($"--------------> 分析{symbol.BaseCurrency}的flexPoint结果数量为0 "); return; } if (!flexPointList[0].isHigh) { // 最低点 不适合出售 logger.Error($"最低点 不适合出售 {symbol.BaseCurrency}-{flexPercent},lastLowPrice:{lastLowPrice}, nowPrice:{nowPrice}, flexPointList:{JsonConvert.SerializeObject(flexPointList)}"); return; } var userNames = UserPools.GetAllUserName(); foreach (var userName in userNames) { var accountConfig = AccountConfigUtils.GetAccountConfig(userName); var accountId = accountConfig.MainAccountId; var needSellPigMoreList = new PigMoreDao().GetNeedSellPigMore(accountId, userName, symbol.BaseCurrency); foreach (var needSellPigMoreItem in needSellPigMoreList) { // 分析是否 大于 decimal itemNowPrice = 0; decimal higher = JudgeSellUtils.AnalyzeNeedSell(needSellPigMoreItem.BOrderP, needSellPigMoreItem.BDate, symbol.BaseCurrency, symbol.QuoteCurrency, out itemNowPrice, historyKlines); decimal gaoyuPercentSell = (decimal)1.045; bool needHuitou = true;// 如果很久没有出售过,则要考虑不需要回头 if (flexPercent < (decimal)1.04) { gaoyuPercentSell = (decimal)1.035; if (flexPointList.Count <= 2 && needSellPigMoreList.Where(it => it.BDate > DateTime.Now.AddDays(-1)).ToList().Count == 0) { // 1天都没有交易. 并且波动比较小. 则不需要回头 needHuitou = false; } } var canSell = JudgeSellUtils.CheckCanSell(needSellPigMoreItem.BOrderP, higher, itemNowPrice, gaoyuPercentSell, needHuitou); //logger.Error($"是否能够出售: {symbol.BaseCurrency},{canSell}, price:{needSellPigMoreItem.BOrderP}, nowPrice:{nowPrice},itemNowPrice:{itemNowPrice}, {userName}, {needSellPigMoreList.Count}, {accountId}"); if (canSell) { decimal sellQuantity = needSellPigMoreItem.BQuantity * (decimal)0.99; sellQuantity = decimal.Round(sellQuantity, symbol.AmountPrecision); if (symbol.BaseCurrency == "xrp" && sellQuantity < 1) { sellQuantity = 1; } // 出售 decimal sellPrice = decimal.Round(itemNowPrice * (decimal)0.985, symbol.PricePrecision); OrderPlaceRequest req = new OrderPlaceRequest(); req.account_id = accountId; req.amount = sellQuantity.ToString(); req.price = sellPrice.ToString(); req.source = "api"; req.symbol = symbol.BaseCurrency + symbol.QuoteCurrency;; req.type = "sell-limit"; PlatformApi api = PlatformApi.GetInstance(userName); HBResponse <long> order = api.OrderPlace(req); if (order.Status == "ok") { new PigMoreDao().ChangeDataWhenSell(needSellPigMoreItem.Id, sellQuantity, sellPrice, JsonConvert.SerializeObject(order), JsonConvert.SerializeObject(flexPointList), order.Data); // 下单成功马上去查一次 QuerySellDetailAndUpdate(userName, order.Data); } logger.Error($"下单出售结果 {JsonConvert.SerializeObject(req)}, order:{JsonConvert.SerializeObject(order)},itemNowPrice:{itemNowPrice} higher:{higher},accountId:{accountId}"); logger.Error($"下单出售结果 分析 {JsonConvert.SerializeObject(flexPointList)}"); } } } }
private async Task <DogMoreFinishedDTO> GetDogMoreFinishedDTO(long buyOrderId) { var dogMoreBuy = new DogMoreBuyDao().GetByBuyOrderId(buyOrderId); HBResponse <List <OrderMatchResult> > orderMatchResult = null; var buyQuantity = (decimal)0; var buyAmount = (decimal)0; var buyFees = (decimal)0; try { orderMatchResult = JsonConvert.DeserializeObject <HBResponse <List <OrderMatchResult> > >(dogMoreBuy.BuyOrderMatchResults); foreach (var item in orderMatchResult.Data) { buyAmount += item.FilledAmount * item.price; if (item.symbol.IndexOf("ven") >= 0) { buyQuantity += item.FilledAmount * 100; } else { buyQuantity += item.FilledAmount; } buyFees += item.FilledFees; } } catch (Exception ex) { buyQuantity = dogMoreBuy.BuyQuantity; buyAmount = dogMoreBuy.BuyQuantity * dogMoreBuy.BuyTradePrice; logger.Error(ex.Message, ex); } // 交易量,交易总额, 出售总额 出售数量, var sellQuantity = (decimal)0; var sellAmount = (decimal)0; var sellFees = (decimal)0; var sellTradePrice = (decimal)999999; var sellDate = DateTime.MinValue; var dogMoreSellList = new DogMoreSellDao().ListDogMoreSellByBuyOrderId(buyOrderId); foreach (var sell in dogMoreSellList) { try { var sellOrderMatchResult = JsonConvert.DeserializeObject <HBResponse <List <OrderMatchResult> > >(sell.SellOrderMatchResults); if (sellOrderMatchResult != null && sellOrderMatchResult.Data != null && sellOrderMatchResult.Data.Count > 0) { foreach (var item in sellOrderMatchResult.Data) { sellAmount += item.FilledAmount * item.price; sellQuantity += item.FilledAmount; sellFees += item.FilledFees; if (item.price < sellTradePrice) { sellTradePrice = item.price; } } } } catch (Exception ex) { sellAmount = sell.SellTradePrice * sell.SellQuantity; sellQuantity += sell.SellQuantity; sellFees += 0; sellTradePrice = sell.SellTradePrice; } if (sell.SellDate > sellDate) { sellDate = sell.SellDate; } } return(new DogMoreFinishedDTO { BuyOrderId = buyOrderId, SymbolName = dogMoreBuy.SymbolName, QuoteCurrency = dogMoreBuy.QuoteCurrency, UserName = dogMoreBuy.UserName, BuyTradePrice = dogMoreBuy.BuyTradePrice, BuyDate = dogMoreBuy.BuyDate, BuyState = dogMoreBuy.BuyState, BuyQuantity = buyQuantity, BuyAmount = buyAmount, BuyFees = buyFees, SellAmount = sellAmount, SellQuantity = sellQuantity, SellTradePrice = sellTradePrice, SellFees = sellFees, SellDate = sellDate, Usdt = sellAmount - buyAmount - sellFees, BaseSymbol = buyQuantity - sellQuantity - buyFees }); }
private static void RunBuy(CommonSymbols symbol) { var key = HistoryKlinePools.GetKey(symbol, "1min"); var historyKlineData = HistoryKlinePools.Get(key); if (historyKlineData == null || historyKlineData.Data == null || historyKlineData.Data.Count == 0 || historyKlineData.Date < DateTime.Now.AddMinutes(-1))// TODO { logger.Error($"RunBuy 数据还未准备好:{symbol.BaseCurrency}"); Thread.Sleep(1000 * 5); return; } var historyKlines = historyKlineData.Data; // 获取最近行情 decimal lastLowPrice; decimal nowPrice; // 分析是否下跌, 下跌超过一定数据,可以考虑 decimal flexPercent = (decimal)1.050; var flexPointList = CoinAnalyze.Analyze(historyKlines, out lastLowPrice, out nowPrice, flexPercent); if (flexPointList == null || flexPointList.Count == 0 || (flexPointList.Count == 1 && flexPointList[0].isHigh)) { flexPercent = (decimal)1.045; flexPointList = CoinAnalyze.Analyze(historyKlines, out lastLowPrice, out nowPrice, flexPercent); } if (flexPointList == null || flexPointList.Count == 0 || (flexPointList.Count == 1 && flexPointList[0].isHigh)) { flexPercent = (decimal)1.040; flexPointList = CoinAnalyze.Analyze(historyKlines, out lastLowPrice, out nowPrice, flexPercent); } if (flexPointList == null || flexPointList.Count == 0 || (flexPointList.Count == 1 && flexPointList[0].isHigh)) { flexPercent = (decimal)1.035; flexPointList = CoinAnalyze.Analyze(historyKlines, out lastLowPrice, out nowPrice, flexPercent); } if (flexPointList == null || flexPointList.Count == 0 || (flexPointList.Count == 1 && flexPointList[0].isHigh)) { flexPercent = (decimal)1.03; flexPointList = CoinAnalyze.Analyze(historyKlines, out lastLowPrice, out nowPrice, flexPercent); } if (flexPointList == null || flexPointList.Count == 0 || (flexPointList.Count == 1 && flexPointList[0].isHigh)) { flexPercent = (decimal)1.025; flexPointList = CoinAnalyze.Analyze(historyKlines, out lastLowPrice, out nowPrice, flexPercent); } if (flexPointList == null || flexPointList.Count == 0 || (flexPointList.Count == 1 && flexPointList[0].isHigh)) { flexPercent = (decimal)1.02; flexPointList = CoinAnalyze.Analyze(historyKlines, out lastLowPrice, out nowPrice, flexPercent); } if (flexPointList == null || flexPointList.Count == 0 || (flexPointList.Count == 1 && flexPointList[0].isHigh)) { flexPercent = (decimal)1.015; flexPointList = CoinAnalyze.Analyze(historyKlines, out lastLowPrice, out nowPrice, flexPercent); } if (flexPointList.Count == 0 && flexPointList.Count == 0) { logger.Error($"RunBuy--------------> 分析{symbol.BaseCurrency}的flexPoint结果数量为0 "); return; } if (flexPointList[0].isHigh || JudgeBuyUtils.IsQuickRise(symbol.BaseCurrency, historyKlines) )//|| JudgeBuyUtils.CheckCalcMaxhuoluo(historyKlines) { // 最高点 不适合购入 // 快速升高 不适合购入 // 大量回落 不适合购入 return; } var userNames = UserPools.GetAllUserName(); foreach (var userName in userNames) { AccountConfig accountConfig = AccountConfigUtils.GetAccountConfig(userName); var accountId = accountConfig.MainAccountId; //var noSellList = new PigMoreDao().ListPigMore(accountId, userName, symbol.BaseCurrency, new List<string> { StateConst.PartialFilled, StateConst.Submitted, StateConst.Submitting, StateConst.PreSubmitted }); var canBuy = JudgeBuyUtils.CheckCanBuy(nowPrice, flexPointList[0].close); if (!canBuy) { continue; } decimal minBuyPrice = new PigMoreDao().GetMinPriceOfNotSell(accountId, userName, symbol.BaseCurrency); if (minBuyPrice <= 0) { minBuyPrice = 999999; } //noSellList.ForEach(item => //{ // if (item.BOrderP < minBuyPrice) // { // minBuyPrice = item.BOrderP; // } //}); if (nowPrice * (decimal)1.035 > minBuyPrice) { // 最近一次购入,没有低于3% continue; } PlatformApi api = PlatformApi.GetInstance(userName); var accountInfo = api.GetAccountBalance(accountId); var usdt = accountInfo.Data.list.Find(it => it.currency == "usdt"); decimal recommendAmount = usdt.balance / 200; // TODO 测试阶段,暂定低一些, Console.WriteLine($"RunBuy--------> 开始 {symbol.BaseCurrency} 推荐额度:{decimal.Round(recommendAmount, 2)} "); if (recommendAmount < (decimal)0.3) { continue; } // 获取最近的购买记录 // 购买的要求 // 1. 最近一次是低点, 并且有上升的迹象。 // 2. 快速上升的,快速下降情况(如果升的太高, 最一定要回落,或者有5个小时平稳才考虑购入,) // 3. 如果flexpoint 小于等于1.02,则只能考虑买少一点。 // 4. 余额要足够,推荐购买的额度要大于0.3 // 5. decimal buyQuantity = recommendAmount / nowPrice; buyQuantity = decimal.Round(buyQuantity, symbol.AmountPrecision); if (symbol.BaseCurrency == "xrp" && buyQuantity <= 1) { buyQuantity = (decimal)1.01; } decimal orderPrice = decimal.Round(nowPrice * (decimal)1.005, 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)) { logger.Error(" --------------------- 两个小时内购买次数太多,暂停一会 --------------------- "); logger.Error(" --------------------- 两个小时内购买次数太多,暂停一会 --------------------- "); logger.Error(" --------------------- 两个小时内购买次数太多,暂停一会 --------------------- "); Thread.Sleep(1000 * 5); return; } HBResponse <long> order = api.OrderPlace(req); if (order.Status == "ok") { new PigMoreDao().CreatePigMore(new PigMore() { Name = symbol.BaseCurrency, AccountId = accountId, UserName = accountConfig.UserName, FlexPercent = flexPercent, BQuantity = buyQuantity, BOrderP = orderPrice, BDate = DateTime.Now, BOrderResult = JsonConvert.SerializeObject(order), BState = StateConst.PreSubmitted, BTradeP = 0, BOrderId = order.Data, BFlex = JsonConvert.SerializeObject(flexPointList), BMemo = "", BOrderDetail = "", BOrderMatchResults = "", SOrderId = 0, SOrderResult = "", SDate = DateTime.MinValue, SFlex = "", SMemo = "", SOrderDetail = "", SOrderMatchResults = "", SOrderP = 0, SQuantity = 0, SState = "", STradeP = 0, }); // 下单成功马上去查一次 QueryBuyDetailAndUpdate(userName, order.Data); } logger.Error($"下单购买结果 {JsonConvert.SerializeObject(req)}, order:{JsonConvert.SerializeObject(order)}, 上一次最低购入价位:{minBuyPrice},nowPrice:{nowPrice}, accountId:{accountId}"); logger.Error($"下单购买结果 分析 {JsonConvert.SerializeObject(flexPointList)}"); } }