import time
import requests
import json
import numpy as np
import pandas as pd
from datetime import datetime
def get_klines(symbol, interval, limit=100):
url = "https://fapi.binance.com/fapi/v1/klines"
params = {'symbol': symbol, 'interval': interval, 'limit': limit}
print(url)
print(json.dumps(params, indent=4))
response = requests.get(url, params=params)
return response.json()
def calculate_ema(prices, period):
return pd.Series(prices).ewm(span=period, adjust=False).mean().tolist()
def calculate_macd(prices, fast_period, slow_period, signal_period):
ema_fast = calculate_ema(prices, fast_period)
ema_slow = calculate_ema(prices, slow_period)
macd = np.subtract(ema_fast[-len(ema_slow):], ema_slow)
signal = calculate_ema(macd, signal_period)
return macd, signal
def find_crossovers(macd, signal, times, prices, ema5, ema30):
crosses = []
valid_crosses = [] # 用于记录有效的穿透事件
min_length = min(len(macd), len(signal))
last_valid_time = datetime.min # 初始化上一个有效事件的时间
for i in range(1, min_length):
closing_price = prices[i]
ema5_price = ema5[i]
ema30_price = ema30[i]
current_time = times[i]
cross_time = datetime.utcfromtimestamp(current_time / 1000 + 8*3600)
time_diff = (cross_time - last_valid_time).total_seconds() / 60 # 计算时间差,单位转换为分钟
confidence_msg = ""
if macd[i-1] < signal[i-1] and macd[i] > signal[i] and closing_price > ema5_price:
if time_diff >= 30 or last_valid_time == datetime.min: # 判断时间间隔是否符合要求或者是第一个事件
if closing_price > ema5_price and closing_price > ema30_price:
confidence_msg = "放心做吧"
crosses.append((i, 'Gold', cross_time.strftime('%Y-%m-%d %H:%M:%S'), '有效', confidence_msg))
last_valid_time = cross_time
else:
crosses.append((i, 'Gold', cross_time.strftime('%Y-%m-%d %H:%M:%S'), '无效', ""))
elif macd[i-1] > signal[i-1] and macd[i] < signal[i] and closing_price < ema5_price:
if time_diff >= 30 or last_valid_time == datetime.min:
if closing_price < ema5_price and closing_price < ema30_price:
confidence_msg = "放心做吧"
crosses.append((i, 'Dead', cross_time.strftime('%Y-%m-%d %H:%M:%S'), '有效', confidence_msg))
last_valid_time = cross_time
else:
crosses.append((i, 'Dead', cross_time.strftime('%Y-%m-%d %H:%M:%S'), '无效', ""))
return crosses
def main():
symbol = 'BTCUSDT'
interval = '5m'
limit = 500
klines = get_klines(symbol, interval, limit)
prices = [float(kline[4]) for kline in klines]
times = [int(kline[0]) for kline in klines]
ema5 = calculate_ema(prices, 5)
ema30 = calculate_ema(prices, 30)
macd, signal = calculate_macd(prices, 6, 7, 4)
crossovers = find_crossovers(macd, signal, times, prices, ema5, ema30)
for index, crossover_type, cross_time, status, confidence_msg in crossovers:
print(f"{crossover_type} Cross at {cross_time}: {status}. {confidence_msg}")
if __name__ == '__main__':
while True:
main()
time.sleep(30)
网友评论