tbmorning 发表于 2021-8-2 11:43:58

麻烦给看下这个写法哪里有问题

Vars       
BoolSeries    BL(True);       
Begin
If(BL && BarStatus==2) //
{
  If(Close>Close)
   {
        SellShort(1,Open-2);                               
        BL = False;                                                               
   }                               
}
End

1.如果不加BarStatus==2这个条件,则程序正常,只开一次仓,后面不再开仓。
2.如果加上BarStatus==2,程序会不断开仓。而且按照正常来说,开仓后K线图上开仓的标志会留在上面,但是这个在当根k线上会显示开仓符号,当根k线结束后开仓符号随即消失(模拟账户已经开仓),这是为什么呢?
按照我的理解,这段语句加载图形后只能执行一次,为什么会不断重复执行呢?

Yuen_Lee 发表于 2021-8-2 14:10:02

在第一个IF语句前加一个BL的延续试试:
BL = BL;
If(BL && BarStatus==2) //

若还不行,程序开头多加下面一段
If(BarStatus == 0)
    BL = True;

tbmorning 发表于 2021-8-2 15:10:31

Yuen_Lee 发表于 2021-8-2 14:10 static/image/common/back.gif
在第一个IF语句前加一个BL的延续试试:
BL = BL;
If(BL && BarStatus==2) //


好主意!多谢多谢,夜盘我试一下。

tbmorning 发表于 2021-8-3 09:16:35

Yuen_Lee 发表于 2021-8-2 14:10 static/image/common/back.gif
在第一个IF语句前加一个BL的延续试试:
BL = BL;
If(BL && BarStatus==2) //


您好,昨天晚上试过您说的方法了,不行,还是老样子,重复开仓,而且信号不固定。看起来是Barstatus这个函数的问题,因为加上这个就不行,不加这个函数一切正常。

Yuen_Lee 发表于 2021-8-3 11:10:11

当根K线的重复开仓BL应该控制不了,因为每次在当根K线的数据更新, BL都会初始化为TRUE。如果想控制,可以用全局变量。
If(BarStatus == 0)
    SetGlobalBar(0, 0)

If(GetGlobalBar(0) == 0 && BarStatus==2) //
{
  If(Close>Close)
   {
        SellShort(1,Open-2);                              
        SetGlobalBar(0, 1);                                                               
   }                              
}

tbmorning 发表于 2021-8-3 21:51:32

Yuen_Lee 发表于 2021-8-3 11:10 static/image/common/back.gif
当根K线的重复开仓BL应该控制不了,因为每次在当根K线的数据更新, BL都会初始化为TRUE。如果想控制,可以 ...

Params       
Vars       
Begin
    If(BarStatus == 0)
    SetGlobalVar(0, 0);

    If(GetGlobalVar(0) == 0 && BarStatus==2) //
      {
          If(Close>Close)
             {
               SellShort(1,Open-2);                              
               SetGlobalVar(0, 1);                                                               
             }                              
      }
End
感谢回复!如上我测试了一下,这样写确实第二个if语句只执行一次,但是有个问题,按照正常的程序运行,开仓后开仓符号应该停留在图表上,可是这样写开仓符号会在当根k线结束的时候消失,这是怎么回事呢?模拟运行的时候,虽然开仓符号消失,但是模拟账户已经开仓。

tbmorning 发表于 2021-8-3 21:58:32

这个问题貌似还是出现在BarStatus这个函数上,因为我把 && BarStatus==2这个条件去掉,则开仓符号显示完全正常。

tbmorning 发表于 2021-8-3 22:06:34

----------------------------------------------------------------
当根K线的重复开仓BL应该控制不了,因为每次在当根K线的数据更新, BL都会初始化为TRUE。如果想控制,可以用全局变量。
If(BarStatus == 0)
    SetGlobalBar(0, 0)

If(GetGlobalBar(0) == 0 && BarStatus==2) //
{
  If(Close>Close)
   {
        SellShort(1,Open-2);                              
        SetGlobalBar(0, 1);                                                               
   }                              
}
----------------------------------------------------------------
我仔细琢磨了一下,实际上BL我设置的是序列bool变量,按照序列变量的定义,序列变量会传递上个Bar上此变量的值,因此我一楼的那段程序也应该被执行一次。

Yuen_Lee 发表于 2021-8-4 10:03:50

tbmorning 发表于 2021-8-3 22:06 static/image/common/back.gif
----------------------------------------------------------------
当根K线的重复开仓BL应该控制不了,因 ...

在当前的最新K开仓后,对BL赋值False,这个值只有到当根K线走完才会固定下来。如果当前K线再一次刷新,程序会再运行一次,而此时的BL还是初始化的值TRUE,所以会出现重复开仓。

tbmorning 发表于 2021-8-4 21:41:38

Yuen_Lee 发表于 2021-8-4 10:03 static/image/common/back.gif
在当前的最新K开仓后,对BL赋值False,这个值只有到当根K线走完才会固定下来。如果当前K线再一次刷新,程 ...

您好,感谢回复。我修改了一下程序,如下:
Params       
Vars       
Begin
If(MarketPosition == 0 && BarStatus==2)//
{
  If(Close>Close)
   {
        Buy(1,Open+2);                                                                                          
   }                              
}
End
这样写依然会重复开仓!并且开仓后当根k线的开仓符号在当根k线结束的时候会消失。我说的重复开仓不是说在一根k线上反复开仓,而是已经开过仓了,但是后面的k线只要满足(Close>Close)依然开仓。并且开仓后开仓符号不显示。这是哪里错了呢?
页: [1] 2
查看完整版本: 麻烦给看下这个写法哪里有问题