public static void CalcAvgPrice() { var instruments = InstrumentsUtils.GetAll(); var allAvgPrice = new Dictionary <string, decimal>(); foreach (var item in instruments) { // 判断最近500天, 100天,加权平均价格。 var avgPrice = GetAvgPrice(item, (60 * 60 * 24).ToString()); allAvgPrice.Add(item.quote + "-" + item.symbol, avgPrice); if (item.MaxBuyPrice > avgPrice) { logger.Error($"投入价格大于加权平均 {item.quote}-{item.symbol}, MaxBuyPrice:{item.MaxBuyPrice}, avgPrice: {avgPrice}"); } } var fs = new FileStream("", FileMode.OpenOrCreate); var sw = new StreamWriter(fs); sw.Write(JsonConvert.SerializeObject(allAvgPrice)); }
static void Main(string[] args) { Console.WriteLine(1); // 注册日志 XmlConfigurator.Configure(new FileInfo("log4net.config")); Console.WriteLine(2); // 初始化币种 InstrumentsUtils.InitAllCoins(); Console.WriteLine(3); instruments = InstrumentsUtils.GetAll(); //DayAvgUtils.CalcAvgPrice(); // AccountDetailsUtils.ShowDetail(); //logger.Error(JsonConvert.SerializeObject(InstrumentsUtils.GetOkInstruments())); // 判断设置是否合理 //foreach (var item in instruments) //{ // // 获取行情, // var klineDataList = OkApi.GetKLineDataAsync(item.symbol + "-" + item.quote, "604800"); // if (klineDataList.Count == 0) // { // logger.Error($"获取行情数据有误 {item.quote},{item.symbol}"); // continue; // } // var close = klineDataList[0].close; // var max = klineDataList.Max(it => it.open); // var min = klineDataList.Min(it => it.low); // var avg = klineDataList.Sum(it => it.open) / klineDataList.Count; // if (close > item.MaxBuyPrice) // { // logger.Error($"现在价格大于MaxBuyPrice --> close:{close}, {item.quote}-{item.symbol} -- MaxBuyPrice: {item.MaxBuyPrice}"); // } // if (item.MaxBuyPrice > avg) // { // Console.WriteLine($"大于加权平均 --> avg:{avg}, {item.quote}-{item.symbol} -- MaxBuyPrice: {item.MaxBuyPrice}"); // } // if (item.MaxBuyPrice > max) // { // Console.WriteLine($"超过历史最大值 --> max:{max},min:{min}, {item.quote}-{item.symbol} -- MaxBuyPrice: {item.MaxBuyPrice}"); // } // else if (item.MaxBuyPrice > min + (max - min) * (decimal)0.7) // { // Console.WriteLine($"超过0.7 --> max:{max}, {item.quote}-{item.symbol}"); // } // Thread.Sleep(200); //} var orderDetailIndex = 0L; while (true) { orderDetailIndex++; var now = DateTime.Now; var btcPrice = (decimal)0; var ethPrice = (decimal)0; var okbPrice = (decimal)0; List <CoinInfo> allCoinInfos = new List <CoinInfo>(); try { allCoinInfos = new CoinInfoDao().ListCoinInfo(); var btcKlines = OkApi.GetKLineDataAsync("btc-usdt"); btcPrice = btcKlines[0].close; var ethKlines = OkApi.GetKLineDataAsync("eth-usdt"); ethPrice = ethKlines[0].close; var okbKlines = OkApi.GetKLineDataAsync("okb-usdt"); okbPrice = okbKlines[0].close; } catch (Exception ex) { logger.Error(ex.Message, ex); } // 获取所有ticks var tickers = OkApi.ListTickers(); foreach (var item in instruments) { // 查询订单结果 QueryOrderDetail(item.quote, item.symbol, (orderDetailIndex) % 10 != 0); // 找到当前的ticker var ticker = tickers.Find(it => it.instrument_id.ToLower() == $"{item.symbol}-{item.quote}".ToLower()); var needContinue = true; var oldData = new BuyInfoDao().List5LowerBuyForBuy(item.quote, item.symbol); if (oldData.Count == 0 || oldData[0].BuyPrice > ticker.last * (decimal)1.05) { needContinue = false; } if (needContinue) { var needSellForMoreList = new BuyInfoDao().ListNeedSellOrder(item.quote, item.symbol); if (needSellForMoreList.Count > 0 && needSellForMoreList[0].BuyPrice * (decimal)1.08 < ticker.last) { needContinue = false; } } if (needContinue) { // 读取数据库 看看以前的交易 var higherSell = new SellInfoDao().List5HigherSellForEmpty(item.quote, item.symbol); if (higherSell.Count > 0 && higherSell[0].SellPrice * (decimal)1.075 < ticker.last) { needContinue = false; } } if (needContinue) { var needBuyForEmptyList = new SellInfoDao().ListNeedBuyOrder(item.quote, item.symbol); if (needBuyForEmptyList.Count > 0 && needBuyForEmptyList[0].SellPrice > ticker.last * (decimal)1.075) { needContinue = false; } } if (needContinue && item.symbol.ToLower() != "egt") { continue; } // 查询订单结果 QueryOrderDetail(item.quote, item.symbol, false); // 核实订单 CheckOrderUtils.Check(item); // 获取行情, var klineDataList = OkApi.GetKLineDataAsync(item.symbol + "-" + item.quote); if (klineDataList == null || klineDataList.Count < 50) { logger.Error($"获取行情数据有误 {item.symbol}, quote:{item.quote}"); continue; } // 记录下价格 var findCoinfInfo = allCoinInfos.Find(it => it.Symbol == item.symbol); if (findCoinfInfo != null) { var nowPrice = (decimal)0;; if (item.quote.ToLower() == "btc") { nowPrice = klineDataList[0].close * btcPrice; } else if (item.quote.ToLower() == "eth") { nowPrice = klineDataList[0].close * ethPrice; } else if (item.quote.ToLower() == "okb") { nowPrice = klineDataList[0].close * okbPrice; } if (nowPrice > 0) { new CoinInfoDao().UpdateCoinInfo(item.symbol, nowPrice); } } if (runCount < 3) { var totalAmount = klineDataList.Sum(it => it.volume * (it.open + it.close) / 2); if (item.quote == "btc" && totalAmount < (decimal)0.01) { Console.WriteLine($"交易量太少, 不好办啊 {item.quote},{item.symbol}, totalAmount:{totalAmount}"); } if (item.quote == "eth" && totalAmount < 1) { Console.WriteLine($"交易量太少, 不好办啊 {item.quote},{item.symbol}, totalAmount:{totalAmount}"); } } if (item.MaxBuyPrice <= 0) { Console.WriteLine($"MaxBuyPrice -->没有设置 {item.quote}-{item.symbol} --> {klineDataList.Min(it => it.low)}"); } if (item.MaxBuyPrice > klineDataList[0].close * 4) { // 这里只是做粗略记录和控制 Console.WriteLine($"MaxBuyPrice xxxx -->设置的过大会接盘哦 {item.quote}-{item.symbol} --> {klineDataList.Min(it => it.low)}"); } try { // 启动交易 RunTrade(klineDataList, item); } catch (Exception ex) { logger.Error(ex.Message, ex); } // 每走一遍, 休眠一下 Thread.Sleep(500); } Console.WriteLine($"-------------> 运行次数:{runCount++}, 花费时间{(DateTime.Now - now).TotalSeconds} "); Thread.Sleep(1000 * 5); } }