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,指标计算逻辑本身错误
修复方案
- 将存储高低价的列表转换为numpy数组,实现逐元素运算
- 按照HL2公式正确计算:
(High + Low)/2 - 确保数组长度满足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
相关产品推荐
相关产品推荐

