Python币安交易脚本运行出现NoneType无Open属性报错如何修复
问题定位
报错的直接原因是getMinuteData函数没有显式返回处理好的DataFrame,Python函数在没有写return语句时默认会返回None,因此你赋值给df变量的值是None,调用df.Open自然会抛出属性不存在的错误。
修复方案
步骤1:给getMinuteData函数添加返回语句
修改后的函数如下:
def getMinuteData(symbol, interval, lookback): frame = pd.DataFrame(client.get_historical_klines(symbol, interval, lookback+' min ago EST')) frame = frame.iloc[:, :6] frame.columns = ['Time', 'Open', 'High', 'Low', 'Close', 'Volume'] frame = frame.set_index('Time') frame.index = pd.to_datetime(frame.index, unit='ms') frame = frame.astype(float) print(frame) return frame # 新增这行返回处理好的DataFrame
步骤2:修复变量作用域问题
当前代码中order变量是在if not entered的分支内定义的,如果第一次调用没有触发买入条件,后续if entered分支引用order会抛出未定义的错误,调整逻辑如下:
def strategyTest(symbol, qty, entered=False): df = getMinuteData(symbol, '1m', '30') cumulRet = (df.Open.pct_change() + 1).cumprod() -1 order = None # 提前定义order变量 if not entered: if cumulRet [-1] < -0.002: order = client.create_order(symbol=symbol, side='BUY', type = 'MARKET', quantity=qty) print(order) entered = True else: print("No trade executed") return # 没触发买入直接退出,避免后续逻辑报错 if entered and order is not None: # 增加order非空判断 while True: df = getMinuteData(symbol, '1m', '30') sinceBuy = df.loc[df.index > pd.to_datetime(order['transactTime'], unit='ms')] if len(sinceBuy) > 0: sinceBuyReturns = (sinceBuy.Open.pct_change() + 1).cumprod() -1 if sinceBuyReturns[-1] > 0.0015 or sinceBuyReturns[-1] < -0.0015: sell_order = client.create_order(symbol=symbol, side='SELL', type = 'MARKET', quantity=qty) print(sell_order) break
其他可选优化点
- 如果你使用的是币安国际站而非币安美国站,删除Client初始化参数里的
tld='us',否则会请求失败返回空数据 - 调用
client.get_historical_klines前增加异常捕获,避免网络波动导致的程序崩溃 - 确认交易对的最小下单精度,BTCUSDT的最小下单量通常是0.0001,你填写的0.0003符合要求,可根据自身账户余额调整
内容的提问来源于stack exchange,提问作者Reckliss
相关产品推荐
相关产品推荐

