如何在Pandas中为多货币对并行运行带动态变量的循环
多货币对交易机器人适配方案
要实现多货币对并行运行,同时满足独立变量/DataFrame管理的需求,可按以下方案落地:
1. 用字典统一管理各货币对的变量与DataFrame
动态生成变量名易引发代码混乱,更稳妥的方式是通过字典存储每个货币对的专属配置和DataFrame:
- 主字典以货币对为键,值为包含该货币对所有参数(均线周期、手数等)和对应K线DataFrame的子字典
- 初始化时为每个货币对生成独立的历史K线DataFrame,避免数据交叉污染
2. 用多线程实现循环并行执行
将单货币对的交易逻辑封装成独立函数,通过Python的threading模块为每个货币对启动单独线程,实现并行运行:
- 每个线程仅负责对应货币对的循环逻辑、DataFrame更新和交易操作
- 线程内部保留原有的
sleep等待新K线逻辑,各货币对的等待互不干扰
完整实现代码
import threading import time import pandas as pd # 定义所有交易货币对的配置参数 currency_configs = [ {"pair": "EURUSD.FX.CFD", "slowma": 50, "fastma": 20, "lot_size": 1, "slippagepips": 2, "sl": -35, "tp": 60}, {"pair": "GBPUSD.FX.CFD", "slowma": 50, "fastma": 20, "lot_size": 0.8, "slippagepips": 2, "sl": -40, "tp": 70}, {"pair": "USDJPY.FX.CFD", "slowma": 60, "fastma": 25, "lot_size": 1.2, "slippagepips": 1, "sl": -30, "tp": 55} ] # 初始化货币对数据容器:存储每个货币对的配置、DataFrame和交易状态 currency_data = {} for config in currency_configs: pair = config["pair"] # 替换成你的历史K线DataFrame生成逻辑 hist_df = pd.DataFrame(columns=["open", "high", "low", "close", "volume"]) currency_data[pair] = { **config, # 复制配置参数 "df": hist_df, "opentrade": False # 初始化交易状态 } # 单货币对交易逻辑函数 def run_bot(pair): bot_data = currency_data[pair] df = bot_data["df"] # 提取当前货币对的所有配置参数 slowma = bot_data["slowma"] fastma = bot_data["fastma"] lot_size = bot_data["lot_size"] slippagepips = bot_data["slippagepips"] sl = bot_data["sl"] tp = bot_data["tp"] for i in range(2000): opentrade = bot_data["opentrade"] if opentrade: # 替换成你的持仓逻辑:更新DataFrame、检查止损止盈、执行交易等 print(f"{pair} 持仓状态:处理最新K线") # 示例:模拟添加新K线数据 new_bar = pd.DataFrame({"open": [1.08], "high": [1.085], "low": [1.078], "close": [1.082], "volume": [1000]}) bot_data["df"] = pd.concat([df, new_bar], ignore_index=True) # 等待新K线(替换为对应周期的实际等待时间) time.sleep(1) else: # 替换成你的空仓逻辑:更新DataFrame、判断开仓信号、执行开仓等 print(f"{pair} 空仓状态:寻找开仓机会") # 示例:模拟添加新K线数据 new_bar = pd.DataFrame({"open": [1.08], "high": [1.085], "low": [1.078], "close": [1.082], "volume": [1000]}) bot_data["df"] = pd.concat([df, new_bar], ignore_index=True) # 等待新K线 time.sleep(1) # 示例:每10次循环切换交易状态(替换为你的实际状态判断逻辑) if i % 10 == 0: bot_data["opentrade"] = not bot_data["opentrade"] # 启动所有货币对的交易线程 threads = [] for pair in currency_data.keys(): thread = threading.Thread(target=run_bot, args=(pair,), daemon=True) threads.append(thread) thread.start() # 保持主程序运行(若需持续交易,可保留此部分;若用守护线程,主程序退出时线程自动终止) for thread in threads: thread.join()
关键说明
currency_configs可灵活添加/修改货币对及参数,无需调整核心逻辑currency_data确保每个货币对拥有独立的DataFrame和交易状态,完全隔离- 线程设置为
daemon=True,保证主程序退出时所有交易线程自动终止 - 各线程的
sleep等待互不影响,每个货币对按自身周期处理K线
内容的提问来源于stack exchange,提问作者Anushka A
相关产品推荐
相关产品推荐

