情景再现,策略交易做了一次交易后,用户查看策略交易的状态和账户状态。
用户注意到两边字段的盈亏不同(这里以当日盈亏为例)


2.事实上,用户也通过回测和账户成交发现了两者不同。(与小标题1内有一些时间差)
第一个图是回测图,买入价格是95360,卖出价格是96420
第二个图是账户交易图(该案例使用了模拟),买入价格是95820,卖出价格是96260
该现象可以总结为:我的回测那么好,为什么实盘交易后少了这么多!


该模拟使用代码:
//------------------------------------------------------------------------
// 简称: test_1126_2025
// 名称:
// 类别: 策略应用
// 类型: 用户应用
// 输出: Void
//------------------------------------------------------------------------
Params
//此处添加参数
Vars
//此处添加变量
Defs
//此处添加策略函数
Events
//此处实现事件函数
//初始化事件函数,策略运行期间,首先运行且只有一次
OnInit()
{
SubscribeBarCounts("lc2605.GFEX","1m",1);
SetOrderMap2MainSymbol();
SetOrderPriceOffset(3);
}
//Bar更新事件函数,参数indexs表示变化的数据源图层ID数组
OnBar(ArrayRef<Integer> indexs)
{
if(CurrentBar==1)
{
buy(1,low);
}
else if(BarsSinceEntry==5)
{
sell(0,high);
}
}
//------------------------------------------------------------------------
// 编译版本 2025/11/26 135626
// 版权所有 wangkaiming
// 更改声明 TradeBlazer Software保留对TradeBlazer平台
// 每一版本的TradeBlazer策略修改和重写的权利
//------------------------------------------------------------------------问题分析:
1.图表交易(策略交易,策略研究)的盈亏与账户成交产生的盈亏是独立的。
图表交易(策略交易,策略与那家)的盈亏字段由图表信号产生,
那么信号来源于哪里?
信号由代码中buysell体系对应的开平仓产生
而注意到上方的代码使用了 buy(1,low) sell(0,high)的形式,显然这是一种极致的偷价写法
但是在图表上,图表回测会严格按照图表信号产生的价格生成交易回测报告。即你写high就按high来成交,不会考虑成交不到的问题。
账户成交则不同,不论模拟还是实盘,返回的是交易系统撮合的结果。
实盘模拟使用的一般是偏移式报价,成交即是对手盘,相对真实。
所以大多情况下账户盈利必然小于图表回测。
下图为偷价图,最低买入,最高卖出

2.谁是真实的?
绝大多情况下,账户反应的永远是真实情况,如果你发现账户与图表差很多,那么错误大概率出在策略或设置上。
该案例中偷价较为极端容易发现,实际操作中,隐蔽的偷价更难发现,需要用户擦亮眼睛,也不要太相信只有回测的策略。
3.编写没有问题的策略,会不会也产生差异?
会,但是误差小,并且该误差实际是市场冲击成本等,并非属于编程范围的问题。
编写无误的策略可以准确的用图表信号表达即时可成交的价位。
也就是编写水平越高,图表信号和实际成交的误差越小。
😀