最近在调试程序,写了一个简单的开仓策略。
开仓逻辑:【前一根为阳线】且【dt=0】
用模拟账号,云端回测,总是出现信号闪烁。不知道什么原因,求解。
如果在开仓条件中去掉【dt==0】则不会出现闪烁。【我写dt==0的目的:我准备在实盘时,每次下单用FileAppend记录1次交易日志,防止在开仓bar多次记录日志】
【测试平台:TB V3 版本3.2.42】
Vars
//此处添加变量
Global Integer dt(0);
Events
//此处实现事件函数
//初始化事件函数,策略运行期间,首先运行且只有一次
OnInit()
{
PrintClear;
}
//Bar更新事件函数,参数indexs表示变化的数据源图层ID数组
OnBar(ArrayRef<Integer> indexs)
{
//dt=0 前一根为阳线时开多
If(MarketPosition !=1 && BarStatus==2 && Close[1]>Open[1] && dt==0)
{
Bool ret = Buy(1, Open);
String fhz = IIFString(ret, "成功", "失败");
String str = fhz;
If(ret)
{
Print(str);
Commentary(str);
dt = dt + 1;
}
}
}
请问解决了吗?也好奇这个怎么做,按自己理解逻辑,既然全局的变动了,下一次再到if,应该是不成立,防止了进入判断,但也因为这样出现闪烁?也就是永远只能用过去固定数据做判断和计算了吗?
我建议你先看看零基础课程理关于全局变量 图表信号机制 序列变量的教学
解决闪烁的核心逻辑是
IF块的内容不变
理解这个
怎么写都不会闪烁
代码中直接改变了DT
这个是低级错误
是我对程序运行机制理解不够透彻,这机制与普通的编程差别还不小。谢谢
算是量化平台传统的控制开仓次数传统机制
各个品种基本都都这样
和正常写代码有区别
如果基于MarketP、BuySell等图表/虚拟账户为基准
就用序列变量吧
逻辑是一致的
如果基于行情触发等实盘逻辑
研究一下全局变量
两种方式都需要琢磨
没有那种方式好坏
看自己癖好😁
你用global做开仓条件那不是明摆着要闪烁么?
这种错误有点过于低级了哦,零基础课程里都是讲过数据特点的,特别是用来做状态变量的时候
老刘
不是global问题撒...
用全局不是原罪😭
那是哪里的问题呢?
dt值他在改变啊
当然闪烁
但是原罪不在全局
当然
用序列是对的
你再看看他的设计目标和逻辑
和用啥没关系
明显dt不能用global啊
dt定义成series就不会闪烁了