全部 智大领峰 TBQuant功能 TBL语言 TB开户 问答专区 高手圈 其他
已解决
可能是Bug的一个问题
2022-02-24 13:32

我在使用以下代码的完整版进行实盘操作时,发现能进行交易,但是日志输出有问题。

于是将完整版的A函数都改成了普通的交易函数进行回测时发现,符合Buy条件时,不会买入,但是该IF内部的其它代码会正常运行。

经过3个多小时排查,最后精简到以下代码。该代码中,若只将IF语句内的My_State[0] = 1给注释掉,那么Buy运行正常;若是不注释掉,则Buy会执行一次,日志输出一次,但是回测报告上没有任何交易记录,但是若再写一个Buy,写到IF语句之外,外面的Buy可以进行正常交易且有交易记录。

若只将把上面那条计算式进行注释,则Buy依然可以正常运行。

若将下面的Sell那一段代码解开,则都可以正常运行。

Params
    //此处添加参数
    Numeric Choice_direction(0);       //0:不开仓,1:开多仓,-1:开空仓
    Numeric Buy_standary(0.3);        //开多仓的标准数(零点几),默认0.5  
    Numeric Buy_Lots(1);             //每次开多仓的手数,默认1
    Numeric MA_Daily_Amplitude_Long(10);   //日振幅移动平均的窗口长度,默认10
Vars
    //此处添加变量
    Global Array<Numeric> My_State;            //0 = 未委托 , 1 = 发出委托
    Numeric MA_Daily_Amplitude;    //十日的平均振幅
    Global Numeric i;
Events
    OnInit()
    {
        My_State[0] = 0;
    }
    OnBar(ArrayRef<Integer> indexs)
    {    
        MA_Daily_Amplitude = (Summation(High,MA_Daily_Amplitude_Long) - Summation(Low,MA_Daily_Amplitude_Long)) / MA_Daily_Amplitude_Long;
        //MA_Daily_Amplitude = (Average(High,MA_Daily_Amplitude_Long) - Average(Low,MA_Daily_Amplitude_Long)) / MA_Daily_Amplitude_Long;
        //MA_Daily_Amplitude = (Average(High,MA_Daily_Amplitude_Long) - Average(Low,MA_Daily_Amplitude_Long)) / 10;
        //MA_Daily_Amplitude = (Average(High,10) - Average(Low,10)) / 10;
        //MA_Daily_Amplitude = (AverageFC(High,10) - AverageFC(Low,10)) / 10;
        //MA_Daily_Amplitude = (AverageFC(Open,10) - AverageFC(Close,10)) / 10;
        
        If(CurrentBar % 10 == 0)
        {
            If(My_State[0] == 0)
            {
                Buy(1,Close);    
                My_State[0] = 1;
                FileAppend("C:\\Users\\14760\\Desktop\\量化交易\\交易日志\\daili","Buy222");

            }
            //Else
            //{
                //Sell(1,Close);    
                //My_State[0] = 0;
                //FileAppend("C:\\Users\\14760\\Desktop\\量化交易\\交易日志\\daili","Sell");
            //}            
        }

//
    }

kyover

你为什么会想用全局变量做buy命令的开仓信号啊...这不是明显的信号闪烁么

2022-02-24 13:36
kyover

粗略看了一下 这个公式 你如果做历史数据回测 信号肯定都是对的,每10根bar来一次开平

但是如果盘中实盘bar,会出现信号闪烁,开仓的委托单有,但是图上没有信号

2022-02-24 13:39
202****8153925177
@kyover

但是我回测的时候,如果按照我发上来这个,不把Sell解掉,回测报告上没有交易记录,但是日志上有输出

2022-02-24 13:46
kyover
@202****8153925177

因为你的my_state全局变量在一开始的bar上被污染了 导致无法复位

 

加上这句试试

2022-02-24 13:51
202****8153925177
@kyover

想问一下为啥加上这句就好了。可能是我对全局变量的理解还有偏差,老师能教教我吗?

2022-02-24 13:55
kyover
@202****8153925177

这个机制是因为tb有一个回溯机制,就是你公式里的所有算法,如果涉及到回溯计算,那么会比较最大的回溯值,然后在图表一开始处以这个回溯值的范围内,是不出信号的。

比如你的代码

这个求和函数就是回溯计算,回溯值是,MA_Daily_Amplitude_Long,那就意味着在图表一开始长度等于MA_Daily_Amplitude_Long的样本上是不可以出现交易信号的

2022-02-24 13:53
202****8153925177
@kyover

谢谢老师解答

2022-02-24 13:56
kyover
@kyover

虽然不出信号,但是你的代码依然运行过了,全局变量作为一个状态变量,也改变了状态,这就是我说的污染。

换句话说,状态变量已经变了,图上却没有信号,导致sell命令无法执行,状态变量无法重置,也就没有信号了

2022-02-24 13:57
您未登录,请先 登录注册 后发表评论
顶部