我在使用以下代码的完整版进行实盘操作时,发现能进行交易,但是日志输出有问题。
于是将完整版的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");
//}
}
//
}
粗略看了一下 这个公式 你如果做历史数据回测 信号肯定都是对的,每10根bar来一次开平
但是如果盘中实盘bar,会出现信号闪烁,开仓的委托单有,但是图上没有信号
但是我回测的时候,如果按照我发上来这个,不把Sell解掉,回测报告上没有交易记录,但是日志上有输出
因为你的my_state全局变量在一开始的bar上被污染了 导致无法复位
加上这句试试
这个机制是因为tb有一个回溯机制,就是你公式里的所有算法,如果涉及到回溯计算,那么会比较最大的回溯值,然后在图表一开始处以这个回溯值的范围内,是不出信号的。
比如你的代码
这个求和函数就是回溯计算,回溯值是,MA_Daily_Amplitude_Long,那就意味着在图表一开始长度等于MA_Daily_Amplitude_Long的样本上是不可以出现交易信号的
想问一下为啥加上这句就好了。可能是我对全局变量的理解还有偏差,老师能教教我吗?
谢谢老师解答
虽然不出信号,但是你的代码依然运行过了,全局变量作为一个状态变量,也改变了状态,这就是我说的污染。
换句话说,状态变量已经变了,图上却没有信号,导致sell命令无法执行,状态变量无法重置,也就没有信号了
你为什么会想用全局变量做buy命令的开仓信号啊...这不是明显的信号闪烁么