Python交易脚本遇List assignment index out of range错误后自动重启方案咨询
问题描述
我是交易机器人开发新手,编写的Python交易脚本逻辑如下:遍历包含ETH/EUR、BTC/EUR等交易对的列表,每次删除列表首元素并切换交易对执行交易逻辑,遍历完成后恢复列表并循环执行。脚本已运行数小时、循环超1000次,但偶尔会触发List assignment index out of range(列表索引越界)错误,手动重启脚本后问题消失。现咨询:
- 能否在except异常处理块中添加命令实现脚本自动重启?
- 或有更优的解决方案?
用户提供的原始代码:
import time from playsound import playsound all = ['ETH/EUR', 'BTC/EUR', 'ADA/EUR', 'XRP/EUR', 'ETH/EUR', 'SOL/EUR', 'MANA/EUR',] symbol = all[0] def getsignals(): ''' # this function checks the symbols or tickers one by one for buying or #selling triggers ''' def runbot(): getsignals() time.sleep(2) while True: try: del all[0] symbol = all[0] print(F'-- The new symbol is now -- {symbol}') runbot() del all[0] symbol = all[0] print(F'-- The new symbol is now -- {symbol}') runbot() del all[0] symbol = all[0] print(F'-- The new symbol is now -- {symbol}') runbot() del all[0] symbol = all[0] print(F'-- The new symbol is now -- {symbol}') runbot() del all[0] symbol = all[0] print(F'-- The new symbol is now -- {symbol}') runbot() del all[0] symbol = all[0] print(F'-- The new symbol is now -- {symbol}') runbot() all = ['ETH/EUR', 'BTC/EUR', 'ADA/EUR', 'XRP/EUR', 'ETH/EUR', 'SOL/EUR', 'MANA/EUR',] print('------that was all of them------new round------') except Exception as e: print(e) print('-----error terror-----') playsound('problem.wav') time.sleep(5)
解决方案
一、实现脚本自动重启
可以用os.execv()替换当前进程实现重启,需要导入os和sys模块。修改后的except块如下:
import os import sys # ... 其他原有导入 except Exception as e: print(e) print('-----error terror-----') playsound('problem.wav') # 重启脚本,sys.executable是当前Python解释器路径,sys.argv是启动参数 os.execv(sys.executable, [sys.executable] + sys.argv)
注意:如果用了虚拟环境,要确保sys.executable指向虚拟环境里的Python解释器,避免用系统默认版本。
二、更优方案:修复索引越界的根源
你的代码问题出在手动重复修改列表+依赖固定次数的删除操作,一旦列表长度意外变化(比如其他逻辑修改了all、或者某次循环中列表未正确恢复)就会触发索引错误。直接迭代列表副本的方式更健壮:
优化后代码
import time from playsound import playsound # 定义交易对模板,每次循环用副本,不修改原始模板 SYMBOLS_TEMPLATE = ['ETH/EUR', 'BTC/EUR', 'ADA/EUR', 'XRP/EUR', 'ETH/EUR', 'SOL/EUR', 'MANA/EUR'] def getsignals(): '''检查交易对的买卖触发信号''' # 这里补充你的信号检测逻辑 def runbot(symbol): print(f'-- 当前交易对:{symbol} --') getsignals() time.sleep(2) while True: # 每次循环创建模板的副本,避免修改原始数据 for symbol in SYMBOLS_TEMPLATE.copy(): runbot(symbol) time.sleep(5) # 切换交易对前的等待时间 print('------本轮遍历完成,开始下一轮------')
优化说明
- 用
SYMBOLS_TEMPLATE.copy()每次循环生成独立列表,彻底避免了修改原始列表导致的索引问题 - 用
for循环自动遍历所有交易对,无需手动写6次重复代码,简洁易维护 - 把交易对作为参数传入
runbot,避免全局变量symbol带来的潜在问题 - 从根源上消除了索引越界的可能,
for循环会安全遍历每个元素
内容的提问来源于stack exchange,提问作者Wim Kraatz
相关产品推荐
相关产品推荐

