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)
有效的穿越事件
©著作权归作者所有,转载或内容合作请联系作者
- 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
- 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
- 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
推荐阅读更多精彩内容
- 一、有时候会碰到这么一个有趣的现象,上层的ViewGroup把事件传递到下层的View,导致一些奇怪的bug。 比...
- 一谈《道德与法治》课上的有效化活动教学 道德教育要回归生活,怎样让《道德与法治》教学提高实效性,达到育人目的...