109 lines
3.7 KiB
Python
109 lines
3.7 KiB
Python
from binance.spot import Spot
|
|
import talib
|
|
import numpy as np
|
|
import pandas as pd
|
|
import time,setting
|
|
import telegram_sender
|
|
|
|
|
|
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品种: {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= get_symbols()
|
|
for s in symbols:
|
|
df = get_dataFrame(s, interval)
|
|
check_signal(s,interval, df)
|
|
|
|
time.sleep(1)
|
|
|
|
|