有效的穿越事件


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  # 初始化上一個(gè)有效事件的時(shí)間
    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  # 計(jì)算時(shí)間差,單位轉(zhuǎn)換為分鐘
        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:  # 判斷時(shí)間間隔是否符合要求或者是第一個(gè)事件
                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)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容