You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python开发Binance加密货币交易机器人:HL2与SMA计算问题求助

加密货币交易机器人HL2指标及SMA计算问题

我基于Python开发了对接Binance账户的加密货币交易机器人,目前卡在HL2指标(计算公式:(High+Low)/2)计算及基于HL2的17周期SMA生成环节。用收盘价、开盘价这类单一价格数据计算SMA时程序运行正常,但处理HL2时,代码虽能运行却无法输出slowSma相关结果。

错误代码分析

关键代码片段存在两处核心问题:

if len(closes) > SLOWSMA_PERIOD:
    np_hl2 = numpy.array((closes+highs)/2)
    slowSma = talib.SMA(np_hl2, SLOWSMA_PERIOD)
    # ... 输出逻辑
  • Python列表的+操作是拼接列表,而非逐元素相加,closes+highs会生成一个长度翻倍的新列表,完全不符合HL2的计算逻辑
  • 原代码误将HL2公式中的Low替换成了Close,指标计算逻辑本身错误

修复方案

  1. 将存储高低价的列表转换为numpy数组,实现逐元素运算
  2. 按照HL2公式正确计算:(High + Low)/2
  3. 确保数组长度满足SMA周期要求

修复后的关键代码片段

if len(closes) > SLOWSMA_PERIOD:
    # 将列表转为numpy数组,支持逐元素运算
    np_highs = numpy.array(highs)
    np_lows = numpy.array(lows)
    # 正确计算HL2指标
    np_hl2 = (np_highs + np_lows) / 2
    # 计算指定周期的SMA
    slowSma = talib.SMA(np_hl2, SLOWSMA_PERIOD)
    print("slowSma")
    print(slowSma)
    last_slowSma = slowSma[-1]
    print("当前slowSma值为 {}".format(last_slowSma))

完整修复代码

import websocket, json, pprint, talib, numpy
from binance.client import Client
from binance.enums import *
import config

SOCKET = "wss://stream.binance.com:9443/ws/xrpusdt@kline_1m"

# SMA参数:修改为需求的17周期
SLOWSMA_PERIOD = 17 

TRADE_SYMBOL = 'XRPUSDT'
TRADE_QUANTITY = 1

closes = []
lows = []
highs = []

in_positon = False

client = Client(config.API_KEY, config.API_SECRET)

def order(side, quantity, symbol, order_type=ORDER_TYPE_MARKET):
    try:
        print("发送订单")
        order = client.create_order(symbol=symbol, side=side, type=order_type, quantity=quantity)
        print(order)
    except Exception as e:
        return False
    return True

def on_open(ws):
    print('连接已打开')

def on_close(ws):
    print('连接已关闭')

def on_message(ws, message):
    global closes; global lows; global highs

    print('收到消息')
    json_message = json.loads(message)
    pprint.pprint(json_message)

    candle = json_message['k']
    is_candle_closed = candle['x']

    close = candle['c']
    low = candle['l']
    high = candle['h']

    if is_candle_closed:
        print("K线收盘价:{}".format(close))
        closes.append(float(close))
        print("closes列表:", closes)

        lows.append(float(low))
        print("lows列表:", lows)

        highs.append(float(high))
        print("highs列表:", highs)

        if len(closes) > SLOWSMA_PERIOD:
            np_highs = numpy.array(highs)
            np_lows = numpy.array(lows)
            np_hl2 = (np_highs + np_lows) / 2
            slowSma = talib.SMA(np_hl2, SLOWSMA_PERIOD)
            print("slowSma数组:")
            print(slowSma)
            last_slowSma = slowSma[-1]
            print("当前slowSma值为 {}".format(last_slowSma))

ws = websocket.WebSocketApp(SOCKET, on_open=on_open, on_close=on_close, on_message=on_message)
ws.run_forever()

注意:原代码中SLOWSMA_PERIOD设为6,已修改为需求的17周期,可根据实际情况调整。

内容的提问来源于stack exchange,提问作者Szathmári Donát

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 09:40:29