from binance.spot import Spot import talib import numpy as np import pandas as pd import time,setting import telegram_sender import utils api_key = "HCpeel8g6fsTK2630b7BvGBcS09Z3qfXkLVcAY2JkpaiMm1J6DWRvoQZBQlElDJg" api_secret= "TySs6onlHOTrGzV8fMdDxLKTWWYnQ4rCHVAmjrcHby17acKflmo7xVTWVsbqtxe7" client = Spot(api_key, api_secret) ## 获取所有现货交易对 def get_symbols(): data = client.exchange_info()["symbols"] # 创建DataFrame columns = ['symbol', 'status', 'baseAsset', 'quoteAsset'] df = pd.DataFrame(data, columns=columns) # 过滤出在架交易对 df_in_trade = df[df['status'] == 'TRADING'] df_in_USDT = df_in_trade[df_in_trade['quoteAsset'] == 'USDT'] return df_in_USDT['symbol'] ## 根据交易对和周期获取数据集 def get_dataFrame(symbol,interval): # 获取 k 线数据 data = client.klines(symbol, interval,limit=500) # 将数据转换为DataFrame columns = ['timestamp', 'open', 'high', 'low', 'close', 'volume', 'close_time', 'quote_asset_volume', 'number_of_trades', 'taker_buy_base_asset_volume', 'taker_buy_quote_asset_volume', 'ignore'] df = pd.DataFrame(data, columns=columns) # 转化成 float df['open'] = df['open'].astype('float64') df['high'] = df['high'].astype('float64') df['low'] = df['low'].astype('float64') df['close'] = df['close'].astype('float64') df['volume'] = df['volume'].astype('float64') # 将时间戳转换为日期时间格式 df['timestamp'] = pd.to_datetime(df['timestamp'], unit='ms') df['close_time'] = pd.to_datetime(df['close_time'], unit='ms') return df # crossover 函数:检测上穿信号 def crossover(series1, series2): return (series1 > series2) & (series1.shift(1) <= series2.shift(1)) # crossunder 函数:检测下穿信号 def crossunder(series1, series2): return (series1 < series2) & (series1.shift(1) >= series2.shift(1)) ## 检查信号 def check_signal(symbol, interval,df): ## 计算 ema df['ema13'] = talib.EMA(df['close'], timeperiod=13) df['ema144'] = talib.EMA(df['close'], timeperiod=144) df['ema169'] = talib.EMA(df['close'], timeperiod=169) df['ema576'] = talib.EMA(df['close'], timeperiod=576) df['ema676'] = talib.EMA(df['close'], timeperiod=676) maxline = np.maximum(df['ema144'], df['ema169']) minline = np.minimum(df['ema144'], df['ema169']) shortArragement = df['ema13'] < minline longArrangement = df['ema13'] > maxline confuse = (df['ema13'] >= minline) & (df['ema13'] <= maxline) crossRatio = 0.2 shortA = crossunder(df['ema13'], minline) shortB = shortArragement & crossunder(df['close'], minline) & (((minline - df['close']) / df.apply(lambda x: abs(x['open'] - x['close']), axis=1)) > crossRatio) df['shortResut'] = (shortA | shortB) & (confuse == False) longA = crossover(df['ema13'], maxline) longB = longArrangement & crossover(df['close'], maxline) & (((df['close'] - maxline) / df.apply(lambda x: abs(x['open'] - x['close']), axis=1)) > crossRatio) df['longResut'] = (longA | longB) & (confuse == False) latest = df.iloc[-1] direction = "" if latest['shortResut']==True: direction = '空' if latest['longResut']==True: direction = '多' message = f"⭐️信号提醒⭐️\r\n\r\n策略:【Vegas趋势跟踪V1.0】\r\n品种: {symbol}\r\n周期: {interval}\r\n信号: 【{direction}】\r\n当前价格:{latest['open']}\r\n\r\n{latest['timestamp']}" print(f"{symbol} - {interval} is checked!") if direction != "": telegram_sender.send_message(setting.chat_id, message) def run(interval): print('Vegas策略运行....') symbols = utils.get_top_binance_usdt_pairs(20) for s in symbols: df = get_dataFrame(s, interval) check_signal(s,interval, df) time.sleep(1)