public static string BuyWhenDoMoreAnalyze(CommonSymbol symbol, AccountConfig account, decimal ladderBuyPercent) { AnalyzeResult analyzeResult = AnalyzeResult.GetAnalyzeResult(symbol); if (analyzeResult == null) { // 初始化数据, 再次拿去 analyzeResult = AnalyzeResult.GetAnalyzeResult(symbol); if (analyzeResult == null) { throw new ApplicationException("做多失败,分析出错"); } } var historyKlines = analyzeResult.HistoryKlines; var nowPrice = analyzeResult.NowPrice; // 1.低于管控的购入价 var controlCanBuy = JudgeBuyUtils.ControlCanBuy(symbol.BaseCurrency, symbol.QuoteCurrency, nowPrice); if (!controlCanBuy) { return($"判断 发现不适合 controlCanBuy:{controlCanBuy}"); } try { BuyWhenDoMore(symbol, account, analyzeResult); } catch (Exception ex) { //logger.Error($"{userName} {JsonConvert.SerializeObject(symbol)} {ex.Message}", ex); Console.WriteLine(ex.Message); Console.WriteLine(ex); return(ex.Message); } return("----"); }
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; } }
public static void DoEmpty(CommonSymbol symbol, string userName, string accountId) { AnalyzeResult analyzeResult = AnalyzeResult.GetAnalyzeResult(symbol); if (analyzeResult == null) { throw new ApplicationException("做空失败,分析出错"); } var nowPrice = analyzeResult.NowPrice; if (nowPrice * (decimal)1.06 < analyzeResult.MaxPrice) { throw new ApplicationException("已经降低了6%, 不要做空,谨慎起见"); } var maxSellTradePrice = new DogEmptySellDao().GetMaxSellTradePrice(userName, symbol.BaseCurrency, symbol.QuoteCurrency); if (maxSellTradePrice != null && nowPrice < maxSellTradePrice * (decimal)1.06) { throw new ApplicationException("有价格比这个更高得还没有收割。不能重新做空。"); } PlatformApi api = PlatformApi.GetInstance(userName); var accountInfo = api.GetAccountBalance(AccountConfigUtils.GetAccountConfig(userName).MainAccountId); var balanceItem = accountInfo.Data.list.Find(it => it.currency == symbol.BaseCurrency); // 要减去未收割得。 var notShougeQuantity = new DogMoreBuyDao().GetBuyQuantityNotShouge(userName, symbol.BaseCurrency); if (notShougeQuantity >= balanceItem.balance || notShougeQuantity <= 0) { logger.Error($"未收割得数量大于余额,有些不合理, {symbol.BaseCurrency},, {userName},, {notShougeQuantity}, {balanceItem.balance}"); return; } var devide = DogControlUtils.GetRecommendDivideForEmpty(symbol.BaseCurrency, symbol.QuoteCurrency, nowPrice, (balanceItem.balance - notShougeQuantity)); decimal sellQuantity = (balanceItem.balance - notShougeQuantity) / devide; // 暂定每次做空1/12 if (sellQuantity * nowPrice > 10) // 一次做空不超过10usdt { sellQuantity = 10 / nowPrice; } sellQuantity = decimal.Round(sellQuantity, symbol.AmountPrecision); if (sellQuantity * nowPrice < 1) { sellQuantity = (balanceItem.balance - notShougeQuantity) / 10; if (sellQuantity * nowPrice < 1) { sellQuantity = (balanceItem.balance - notShougeQuantity) / 5; if (sellQuantity * nowPrice < 1) { sellQuantity = (balanceItem.balance - notShougeQuantity) / 3; if (sellQuantity * nowPrice < (decimal)0.2) { LogNotBuy(symbol.BaseCurrency, $"收益不超过0.2usdt,, balance: {balanceItem.balance}, notShougeQuantity:{notShougeQuantity}, {nowPrice}, yu: {(balanceItem.balance - notShougeQuantity) * nowPrice}"); return; } } } } // 出售 decimal sellPrice = decimal.Round(nowPrice * (decimal)0.985, symbol.PricePrecision); SellWhenDoEmpty(accountId, userName, symbol, sellQuantity, sellPrice); }
public static bool Run(int index, CommonSymbol symbol, List <Ticker> tickers) { // 先获取最近的数据, 看看是否靠近购入,卖出 var minDogMoreBuy = new DogMoreBuyDao().GetSmallestDogMoreBuy(symbol.QuoteCurrency, symbol.BaseCurrency); var maxDogEmptySell = new DogEmptySellDao().GetBiggestDogEmptySell(symbol.QuoteCurrency, symbol.BaseCurrency); var findTicker = tickers.Find(it => it.symbol == symbol.BaseCurrency + symbol.QuoteCurrency); if (findTicker == null) { //logger.Error($"{symbol.QuoteCurrency}, {symbol.BaseCurrency}"); return(false); } if (findTicker.open <= 0 || findTicker.close <= 0 || findTicker.high <= 0 || findTicker.low <= 0) { logger.Error($"数据不对 : {JsonConvert.SerializeObject(findTicker)}"); return(false); } var control = new DogControlDao().GetDogControl(symbol.BaseCurrency, symbol.QuoteCurrency); if (control == null) { return(false); } if (control.HistoryMin >= findTicker.close || control.HistoryMax <= findTicker.close) { // 初始化一下 RefreshHistoryMaxMinAsync(control.SymbolName, control.QuoteCurrency); } new DogNowPriceDao().CreateDogNowPrice(new DogNowPrice { NowPrice = findTicker.close, NowTime = Utils.GetIdByDate(DateTime.Now), QuoteCurrency = symbol.QuoteCurrency, SymbolName = symbol.BaseCurrency, TodayMaxPrice = findTicker.high, TodayMinPrice = findTicker.low, NearMaxPrice = findTicker.high }); var maySell = false; var mayBuy = false; if (( control.EmptyPrice < findTicker.close && ( maxDogEmptySell == null || findTicker.close / maxDogEmptySell.SellOrderPrice > (decimal)1.082) ) || (maxDogEmptySell != null && maxDogEmptySell.SellOrderPrice / findTicker.close > (decimal)1.085)) { maySell = true; } if ( (control.MaxInputPrice > findTicker.close && ( minDogMoreBuy == null || minDogMoreBuy.BuyOrderPrice / findTicker.close > (decimal)1.062)) || (minDogMoreBuy != null && findTicker.close / minDogMoreBuy.BuyOrderPrice > (decimal)1.09)) { mayBuy = true; if (symbol.QuoteCurrency == "btc" && nobtcbalanceTime > DateTime.Now.AddMinutes(-5) && ( minDogMoreBuy == null || minDogMoreBuy.BuyOrderPrice / findTicker.close > (decimal)1.06 )) { mayBuy = false; } } if (symbol.BaseCurrency == "xmx") { Console.WriteLine($"{maySell}, {mayBuy}"); } if (!mayBuy && !maySell) { return(false); } AnalyzeResult analyzeResult = AnalyzeResult.GetAnalyzeResult(symbol); if (analyzeResult == null) { return(false); } try { // 计算是否适合购买 RunBuy(symbol, analyzeResult); } catch (Exception ex) { logger.Error($"---> 购买异常: {JsonConvert.SerializeObject(symbol)}" + ex.Message, ex); } try { // 计算是否适合出售 RunSell(symbol, analyzeResult, findTicker); RunCount++; } catch (Exception ex) { logger.Error($"---> 出售异常: {JsonConvert.SerializeObject(symbol)}" + ex.Message, ex); } return(true); }