测试了一下MarketPosition的状态变化,在onbar里面进行了开仓操作,按教程MarketPosition是在同一根bar中状态不会变,测试确实是这样。
但是有个问题,就是按条件来开仓,每个tick都进去执行了一次,但最终的结果是实际只开仓了一次,并且也没有报闪烁,也就是说执行的过程与实际结果不匹配,百思不得其解,因为这个不搞清楚,会影响开仓代码的编写。请老师帮忙看看这个怎么解释?谢谢!
测试代码:
//Bar更新事件函数,参数indexs表示变化的数据源图层ID数组
OnBar(ArrayRef<Integer> indexs)
{
Print(Bar Count: + Text(BarCount));
Print(TimeToString( CurrentTime) + 1 Flag: + Text(MarketPosition));
If(MarketPosition == 0 && BarCount >= 219)
{
Print(TimeToString( CurrentTime) + +++ Buy: + Text(MarketPosition));
Numeric ret = IIF( Buy(1, High), 1, 0);
Print(TimeToString( CurrentTime) + +++ Buy result: + Text(ret));
}
Print(TimeToString( CurrentTime) + 2 Flag: + Text(MarketPosition));
}
执行情况:
消息:
实际成交后的持仓:
marketposition是一个序列对象
序列对象得特点就是,每根bar上的初始值是上一根bar的值传递过来的。
所以一根bar上逐tick的多次执行,每次执行结果都是一样的
关于序列类型的具体机制可以看零基础里的解释
https://www.bilibili.com/video/BV1ZG411f7bt/?spm_id_from=333.999.0.0
序列对象我没有疑问,主要的疑问是以marketposition作为条件,为何buy执行了多次,但实际开仓却只有1次呢?试过如果在判断条件内加上global类型的变量加一,是会不断变化的,这说明确实会不断执行,那么为何buy没有报闪烁却最终只执行了一次呢?
https://www.bilibili.com/video/BV1hM4y1H7Tx/?spm_id_from=333.999.0.0
buy可以理解为只是在图表上标记信号,而具体的报单是由系统外部去读图上的信号再进行发单。
这个读信号发单会自动去识别是否是同一个信号多次出现,从而避免同一个信号发生多次报单的情况
明白了,感谢老师!