
策略编写核心差异
QMT与PTrade的策略编写环境截然不同。QMT采用本地化Python编辑器,策略文件存储于本地,支持用户导入第三方库(如numpy、pandas、talib),代码补全和调试功能完善。编写时需继承系统提供的策略基类,并实现init、handle_bar等回调函数。期货策略中,QMT允许直接调用CTP接口获取逐笔行情,股票策略则通过passorder函数下单。
PTrade完全基于浏览器在线编写,策略保存在云端,用户无法安装自定义库,仅能使用平台内置的Python模块(如numpy、pandas基础版本)。编写方式类似事件驱动,但回调函数名称不同,如initialize、handle_data。期货策略中,PTrade通过order函数发送委托,股票交易需区分上海和深圳市场。两者都支持多因子选股和择时,QMT本地调试更灵活,PTrade在线协作更方便。
代码编辑与调试
QMT提供断点调试、变量监视和日志输出,用户可逐步执行策略逻辑。PTrade缺少断点功能,仅能通过log.info打印信息。对于复杂期货套利策略,QMT的本地调试能快速定位问题,PTrade则依赖回测日志反复排查。
回测机制对比
QMT回测基于本地历史数据,支持Tick级、分钟级和日线级,数据精度高。用户可指定回测时间段,系统逐笔撮合,计算滑点和手续费。期货回测中,QMT支持保证金和逐日盯市,股票回测支持分红送股。回测速度取决于电脑配置,大数据量时较慢。

PTrade回测在云端服务器运行,数据由平台统一维护,支持分钟级和日线级,Tick级仅限部分品种。回测速度极快,得益于分布式计算。期货回测中,PTrade自动计算保证金和强平,股票回测支持复权。但PTrade无法自定义历史数据,只能使用平台提供的标准化数据。
回测结果与实盘一致性
QMT回测与实盘使用相同的撮合引擎,成交价基于对手价或最新价,滑点可手动设置。PTrade回测采用简化撮合,以当前bar收盘价成交,实盘则根据市场实时价格,两者存在偏差。期货策略中,QMT的逐笔回测更贴近真实交易,PTrade的分钟回测可能忽略盘中波动。
股票与期货支持特性
股票策略中,QMT支持融资融券、ETF套利、网格交易,可获取Level-2行情。PTrade支持普通股票交易,提供财务数据和因子库。期货策略中,QMT覆盖国内五大交易所,支持夜盘和套利指令,可自定义合约乘数。PTrade期货支持主力连续合约,但无法交易郑商所部分品种。两者都支持股票期货混合策略,QMT需分别编写逻辑,PTrade通过统一接口处理。
下单函数差异
QMT股票下单用passorder,期货用order_target;PTrade股票用order,期货用order并指定开平标志。股票交易中,PTrade自动处理T+1限制,QMT需手动判断。期货交易中,QMT支持市价、限价、条件单,PTrade仅支持限价和市价。
性能与扩展能力
QMT本地运行,策略计算占用用户CPU和内存,适合高频期货策略,延迟可低至毫秒级。PTrade云端运行,策略计算在服务器,延迟受网络影响,适合中低频股票策略。扩展方面,QMT允许接入外部数据库和机器学习模型,PTrade仅支持平台内置因子。
代码示例:QMT期货均线策略
# QMT期货均线策略片段
def init(context):
context.set_universe(['rb2310'])
context.ma_short = 5
context.ma_long = 20
context.price_list = []
def handle_bar(context, bar_dict):
price = bar_dict['rb2310'].close
context.price_list.append(price)
if len(context.price_list) < context.ma_long:
return
ma_short = sum(context.price_list[-context.ma_short:]) / context.ma_short
ma_long = sum(context.price_list[-context.ma_long:]) / context.ma_long
if ma_short > ma_long and context.position == 0:
order_target('rb2310', 1)
elif ma_short < ma_long and context.position > 0:
order_target('rb2310', 0)
代码示例:PTrade股票双均线策略
# PTrade股票双均线策略片段
def initialize(context):
g.security = '600519.SS'
g.short_window = 5
g.long_window = 20
g.price_list = []
def handle_data(context, data):
price = data[g.security].close
g.price_list.append(price)
if len(g.price_list) < g.long_window:
return
ma_short = sum(g.price_list[-g.short_window:]) / g.short_window
ma_long = sum(g.price_list[-g.long_window:]) / g.long_window
if ma_short > ma_long and g.position == 0:
order(g.security, 100)
elif ma_short < ma_long and g.position > 0:
order(g.security, -g.position)
选择建议
股票期货交易者需根据策略频率和开发习惯选择。高频期货策略优先QMT,因其本地回测和低延迟;中低频股票策略可选PTrade,云端回测快速且免维护。QMT适合有编程基础的用户,PTrade适合追求便捷的投资者。两者都支持模拟交易,QMT模拟需本地配置,PTrade模拟一键开启。