全部 智大领峰 TBQuant功能 TBL语言 TB开户 问答专区 高手圈 其他
信号闪烁 不能用Global ,怎么来解决
2022-04-01 16:01

 

Global 会带来闪烁,我如何解决开仓标签的问题??

我的n1符值来代表开仓,还是没有开仓

现在不能用 Global 可以用什么方法来做,请技术老师支持一下!!

因为有底仓所以不能用MarketPosition  来判断, 问题核心:如何记录我已开仓了?

敬请老师给一个解决方案

cai446449

这段代码闪烁的原因,是没搞清楚全局变量在实时情况下的运行机制,全局变量在实时情况下是每一个tick都会改变以及保留相应的值,以开空仓代码为例,您的代码条件用了n1 == 0判断,判断后的操作  又 赋值 n1 = 1,那么n1 = 1 在第二个tick就会被保留,,,第一个tick开空仓的条件满足,,,,第二个tick由于全局变量的改变 n1 = 1,,导致条件又不满足,所以信号在第二个tick,信号消失了,,,,,,,1.不太理解为什么有底仓就不能用MarketPosition进行判断,我觉得一般情况下,就算是加仓,mp也是可以控制仓位的,您可以把mp理解为序列变量。。。2.如果一定要用全局变量控制,那么可以用多个全局变量形成闭环,n1控制条件,n2控制结果或者n2控制n1……,最终就是要满足全局变量在实时情况下的机制才可以,不要形成条件与赋值结果的互斥

2022-04-01 16:34
202****7193457017
@cai446449

没有能完全 理解您说的:2.如果一定要用全局变量控制,那么可以用多个全局变量形成闭环,n1控制条件,n2控制结果或者n2控制n1……,最终就是要满足全局变量在实时情况下的机制才可以,不要形成条件与赋值结果的互斥 

这一段的意思,麻烦您把我的这段代码改一下,这样我就好参考了

特别感谢老师的支持

我本就是一个低水平的 也是刚写TB的业余人员,敬请理解

 

 

Params
    Numeric kcjg(20000);            // 开仓价格
    Numeric pcjg(19000);            // 平仓价格
    Numeric Lots(1);            // 交易手数        
Vars   
     Global Numeric n1(0);   // 0代表没有开仓,1代表已经开仓
Events
    
    OnBar(ArrayRef<Integer> indexs)
    {
      // 开空仓
        If (High >= kcjg And n1 == 0)  
          {
            SellShort(Lots, kcjg);
            n1 = 1;
          }
        // 平空仓
        If( Low <=pcjg  And n1 == 1)
           {
                BuyToCover(Lots, pcjg);
                n1 = 0;
            }
        
      }

2022-04-01 17:09
202****7193457017
@cai446449

因为我是一个循环程序,会多次开空仓,多次开多仓,会同时有空仓与多仓,所以没办法用MarketPosition 来判断,如果能用MarketPosition 来判断,就简单了!!

2022-04-01 17:13
202****7193457017

没有能完全 理解您说的:2.如果一定要用全局变量控制,那么可以用多个全局变量形成闭环,n1控制条件,n2控制结果或者n2控制n1……,最终就是要满足全局变量在实时情况下的机制才可以,不要形成条件与赋值结果的互斥 

这一段的意思,麻烦您把我的这段代码改一下,这样我就要参考了

特别感谢老师的支持

我本就是一个低水平的 也是刚写TB的业余人员,敬请理解

 

 

Params
    Numeric kcjg(20000);            // 开仓价格
    Numeric pcjg(19000);            // 平仓价格
    Numeric Lots(1);            // 交易手数        
Vars   
     Global Numeric n1(0);   // 0代表没有开仓,1代表已经开仓
Events
    
    OnBar(ArrayRef<Integer> indexs)
    {
      // 开空仓
        If (High >= kcjg And n1 == 0)  
          {
            SellShort(Lots, kcjg);
            n1 = 1;
          }
        // 平空仓
        If( Low <=pcjg  And n1 == 1)
           {
                BuyToCover(Lots, pcjg);
                n1 = 0;
            }
        
      }

2022-04-01 17:08
kyover
@202****7193457017

Global Numeric n1(0);   

改成

series<numeric> n1(0);

2022-04-01 20:49
202****7193457017
@kyover

这种写法,我用了,当天没有问题,第二天信号就消失了,出现了重复开仓了

2022-04-02 11:26
202****7193457017
@kyover

前期我们就是用的  series<numeric> n1(0); 这个方案,N1的值第二天就重新符为0了,所以就出现了重复开仓的 BUG

2022-04-02 11:28
您未登录,请先 登录注册 后发表评论
顶部