【算法下单】- 算法代理下单与信号闪烁

关联帖子:  https://bbs.tbquant.net/thread/20260403195818194586


问题如下:

Q1. 当使用 【算法代理下单】时,是否只要调用图表下单函数Buy/Sell就会通过代理报单而且同一根Bar只报单一次,无论有没有信号闪烁问题(就像OnSignal域捕获下单信号)?

Q2. 在使用图表交易和历史回测时,能否通过设置忽略信号闪烁问题,做到只要调用Buy/Sell函数就记录报单?(比如传递Enum_Signal_UnCorrectPrice参数?)

【算法交易】- 开通算法下单模式
算法代理有记录但实际没有下单?
【算法交易】- 如何在TBQuant3中启动算法下单代理
关于算法代理信号持仓与账号持仓
【算法代理】- 如何将TB的算法下单模式应用于自己的策略
算法下单功能
请问现在算法代理功能是否支持A函数下单?
算法代理下单模式默认按照净头寸吗?
TB算法代理深入浅出
【算法交易】- 在TBQuant3中使用算法代理

不建议用算法代理处理信号闪烁问题

应该是无法处理信号消失的

老师误会我的意思了,

关于Q1, 我的意思是如果在自己的策略里调用了Buy/Sell,无论是否出现信号闪烁,都会通过算法代理出发实际报单?

关于Q2, 这个问题是关于如何忽略信号闪烁,如何做到只要出现Buy/Sell调用就能在实盘中触发报单,无论有没有信号闪烁?

q1,只要执行了buy sell,那么会产生对应报单,那么算法代理就会接管这个报单进行处理

q2,我其实没有看明白这是什么问题。为什么buysell信号闪烁就不会报单了?

谢谢老师回复,关于Q2其实我就是想确认和澄清一下【产生图标交易信号】和实盘交易时【产生实际报单】的关系,我自己做了点测试,先把观察到的现象放在这里,代码和截图放到后面供参考:

1. 在图表和历史回测时如果出现信号闪烁,会有弹出信息提醒,且不会在虚拟账户上产生仓位变化,也就是说Buy/Sell不会生效

2. 如果放到实盘运行,只要调用了Buy/Sell, 无论有没有信号闪烁,都会在一根bar上产生一次实际的报单(哪怕是onBar连续的buy一个bar上也只会触发一次实际报单),但是虚拟账户依然不会减仓,如果打开头寸监控,会一直匹配不上。

测试代码如下:

//------------------------------------------------------------------------
// 简称: sbx_chart_signalblink
// 名称: 
// 类别: 策略应用
// 类型: 用户应用
// 输出: Void
//------------------------------------------------------------------------
Params
    //此处添加参数

Vars
    Global Integer orderCounter(0);

Defs
    //此处添加策略函数
    
Events
    //此处实现事件函数
    
    //初始化事件函数,策略运行期间,首先运行且只有一次
    OnInit()
    {
        PrintClear();
        SetBasePeriod("5m");
    }


    //Bar更新事件函数,参数indexs表示变化的数据源图层ID数组
    OnBar(ArrayRef<Integer> indexs)
    {
        If((CurrentBar + 1) % 5 == 0)
        {
            If(orderCounter < 1)
            {
                Print("Bar #" + Text(CurrentBar) + " Long Contracts:" + Text(longCurrentContracts));
                orderCounter = orderCounter + 1;
                Buy(2, C);
                
                
            }
        
        } Else 
            orderCounter = 0;
    }

//------------------------------------------------------------------------
// 编译版本    2026/4/11 123721
// 版权所有    tb274345
// 更改声明    TradeBlazer Software保留对TradeBlazer平台
//            每一版本的TradeBlazer策略修改和重写的权利
//------------------------------------------------------------------------

头寸监控和交易师的截图:


这个东西我记得零基础课程里,关于图表交易信号系统,是讲过的....

是这个, https://video.tbquant.net/video?id=video444

这个视频之前看过,当时还动手试了下,觉得明白了,最近又有点不确定了😅

所以是什么让你觉得不确定了?

之前在策略研究和历史回测阶段在onBarClose调用buy/sell,虽然有偷价情况但也能有效规避信号闪烁同时较准确的统计理论入场价格的表现。现在准备用于实盘,实盘时信号是在Bar内产生(在onBar内发单),要修改处理逻辑。另外不是很想把图表报单函数代码都改成A函数,这样以后如果要做调整优化啥的不方便回测,还得改回去。

未达到上述目的,目前尝试的思路是:

- 历史回测也在onBar中触发下单(用setBasePeriod模拟或者更小周期的onBarClose),历史回测也不产生信号闪烁,尽量符合实盘发单时机。

- 在另一个独立的策略里用onsignal捕捉处理报单信号,转换为实盘时不改动原策略代码,只需要在同一个策略单元里添加这个独立的公式(类似教学视频里使用算法代理时添加其对应的公式即可)

- 刚开始下单手数少,不用太考虑滑点,用【交易助手】追单即可,稍后要能接入算法下单代理优化报单过程

- 实盘时如果使用【头寸监控】最好信号仓和实际仓位保持一致 (实际测下来,感觉这点做不到也没关系)

对于我的问题,老师可有建议或者其它思路?

你写了一大段但是你还是没说清楚你的诉求是什么,你只是说了很多你采取的对策和方法

我写尝试的思路之前先写了诉求,看来是我没说清楚

我再尝试下把诉求说清楚:

遇到的问题:

- 开发要给策略时为了支持历史回测和查看回测统计数据,产生信号发单用的都是buy/sell函数

- 为了在回测时捕捉交易信号更及时并贴近实盘数据,我会采用两种方法

1.叠加更小的周期的数据在上面找信号

2. 或者用setbaseperiod设置一个更小的基础周期,然后在大周期图层的onBar事件中分析行情和交易机会.

如果想把捕捉到信号记录在较大周期的图表上,上述两种方法在捕捉后立即调用buy/sell有可能会产生信号闪烁问题,我会把产生信号时的价格信息单独记录,然后在目标周期的onbarclose事件里调用buy/sell规避信号闪烁。

- 策略测试没问题了,准备实盘,这时候为了更及时的捕捉信号,就要用A函数对原来的代码进行改动,比如遇到信号就发单,去掉buy/sell

- 但是有时候会有些新的思路要对策略进行调整,调整完还要回测验证,这时候又要把带有A函数的策略改成buy/sell,测试通过后再改回去。

诉求:

- 弄一个较为通用的方法,不管历史回测还是实盘,都用onbar在信号出现时就调用buy/sell,同时规避规避信号闪烁

- 另一个公式里用onsignal捕捉到发单信号,然后用A函数实盘发单,策略都用这个框架用buy/sell实现,实盘时只要把带有onsignal的公式也添加到同一个策略单元里即可

- 这样就不用为了回测和实盘在buy/sell和A函数见改来改去, 实盘发单部分也被分隔开,如果以后想对实盘发单部分进行优化,只需要改一次,现有策略都能生效。



我看得真的挺费劲的。

首先,你既然采用了两种方法降低颗粒度,那请问为什么还要把信号记录在较大周期图表?直接放小周期上不就完了吗?

其次,目标周期是什么意思?为什么目标周期onbarclose里用buysell就能规避?

第三,遇到信号就发单,buysell也可以啊!为什么一定要用a函数改呢?

我没有看到你的设计思路,我不好评价,这个问题一向是只能具体情况具体分析的。我只能说目前的情况看,你似乎是方向就选错了,而且走了很远了,以致于要解决我看起来很莫名其妙的问题。

你如果是只想解决信号闪烁的问题,通过跨周期叠加小周期就完全能解决了,1分钟不行,用15s,15s不行用tick总行了吧?搞个onbarclose是什么目的呢?onbarclose是收盘才执行的,如果你是收盘策略,你直接写开盘判断上一根是否满足不就行了吗?绕这么一大圈是为了什么啊?

onsignal接管信号的前提是有信号,不管闪不闪烁,有信号就报单。这个是信号的下游工作链,下游怎么可能影响上游呢?我完全看不懂你的操作和想法,我非常迷惑