开拓者期货期权程序化系统交易论坛

标题: 麻烦给看下这个写法哪里有问题 [打印本页]

作者: tbmorning    时间: 2021-8-2 11:43:58     标题: 麻烦给看下这个写法哪里有问题

Vars       
BoolSeries    BL(True);       
Begin
If(BL && BarStatus==2) //
{
  If(Close[1]>Close[2])
   {
        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[1];
If(BL && BarStatus==2) //

若还不行,程序开头多加下面一段
If(BarStatus == 0)
    BL = True;
作者: tbmorning    时间: 2021-8-2 15:10:31

Yuen_Lee 发表于 2021-8-2 14:10
在第一个IF语句前加一个BL的延续试试:
BL = BL[1];
If(BL && BarStatus==2) //

好主意!多谢多谢,夜盘我试一下。
作者: tbmorning    时间: 2021-8-3 09:16:35

Yuen_Lee 发表于 2021-8-2 14:10
在第一个IF语句前加一个BL的延续试试:
BL = BL[1];
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[1]>Close[2])
   {
        SellShort(1,Open-2);                              
        SetGlobalBar(0, 1);                                                               
   }                              
}
作者: tbmorning    时间: 2021-8-3 21:51:32

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

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

    If(GetGlobalVar(0) == 0 && BarStatus==2) //
      {
          If(Close[1]>Close[2])
             {
               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[1]>Close[2])
   {
        SellShort(1,Open-2);                              
        SetGlobalBar(0, 1);                                                               
   }                              
}
----------------------------------------------------------------
我仔细琢磨了一下,实际上BL我设置的是序列bool变量,按照序列变量的定义,序列变量会传递上个Bar上此变量的值,因此我一楼的那段程序也应该被执行一次。
作者: Yuen_Lee    时间: 2021-8-4 10:03:50

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

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

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

您好,感谢回复。我修改了一下程序,如下:
Params       
Vars       
Begin
If(MarketPosition == 0 && BarStatus==2)//
{
  If(Close[1]>Close[2])
   {
        Buy(1,Open+2);                                                                                          
   }                              
}
End
这样写依然会重复开仓!并且开仓后当根k线的开仓符号在当根k线结束的时候会消失。我说的重复开仓不是说在一根k线上反复开仓,而是已经开过仓了,但是后面的k线只要满足(Close[1]>Close[2])依然开仓。并且开仓后开仓符号不显示。这是哪里错了呢?
作者: Yuen_Lee    时间: 2021-8-5 09:39:51

使用MarketPosition == 0的条件在当根开仓K线不起作用,会造成当根K线的重复开仓,只有在开仓后的下一根K线MarketPosition的值才会变为1。这段程序不完整,不知道是否其它部分会导致你说的问题。
作者: tbmorning    时间: 2021-8-5 23:09:49

Yuen_Lee 发表于 2021-8-5 09:39
使用MarketPosition == 0的条件在当根开仓K线不起作用,会造成当根K线的重复开仓,只有在开仓后的下一根K线 ...

您好,感谢回复。这段代码是我的程序里的开头的部分,只是执行buy部分不一样,但是效果是一样的。 我贴出来的是可以完整执行的程序,直接复制到TB里就可以编译执行,运行结果就是如我所说的,所以不可能是其他部分导致的,只能是这小段程序的原因。
你说”使用MarketPosition == 0的条件在当根开仓K线不起作用,会造成当根K线的重复开仓“,但是加载到模拟账户的时候,满足条件的当根k线是实际开仓的,而且也只开一仓,只是后面k线陆续还会开仓。
我已经弃用这个函数了,使唤不了。
我一直在用文华的wh8。现在有个新的策略,文华的麦语言比较死板,实现起来有点困难,于是就转战TB了。在这里我再咨询您个新的问题,希望能得到您的帮助:我的这个是趋势模型,不是短舱,而且会一直持续持仓,但是问题来了,如果中途电脑关机,系统更新之类的,程序会重新运行,那我的持仓以及各个参数会被重新归零,这该怎么办呢?我想延续我之前的数据以及持仓,在这个基础上继续执行我的程序,而不是重新开始。因为我的这个模型是根据当前的k线走势开仓的,重新运行的开仓结果跟之前是完全不一样。我在尝试用SetTBProfileString这个函数,把数据读回程序,但是我发现重新运行程序后marketposition==0,而sell 以及buytocover只能在marketposition!=0下才起作用,这就意味着程序不能执行平老仓的动作。可能我对TB还不够了解,希望能得到您的帮助,就是重启后如何能让程序延续持仓,并能产生平仓动作。谢谢!
作者: Yuen_Lee    时间: 2021-8-6 08:45:44

首先,如果不是日内短线交易,可以不用BarStatus == 2的条件,避免重启程序后没有之前的开仓信号,也就无法自动平仓。TB里的A函数可以帮你查到现有持仓(帮助文件里点“索引”栏,开头部分都是A函数)和手数等,比如A_BuyPosition会返回现有多单的持仓状态,用这些A函数代替MarketPosition可以解决你说的关机重启的问题。帮助文件里有注释,TB的论坛里也能查到一些好的用法。
作者: tbmorning    时间: 2021-8-6 10:11:10

Yuen_Lee 发表于 2021-8-6 08:45
首先,如果不是日内短线交易,可以不用BarStatus == 2的条件,避免重启程序后没有之前的开仓信号,也就无法 ...

好的,非常非常感谢!
作者: tbmorning    时间: 2021-8-9 13:34:05

本帖最后由 tbmorning 于 2021-8-9 13:35 编辑
Yuen_Lee 发表于 2021-8-6 08:45
首先,如果不是日内短线交易,可以不用BarStatus == 2的条件,避免重启程序后没有之前的开仓信号,也就无法 ...


您好!又遇到新问题了,麻烦咨询您一下:
我浏览过其他的帖子,A_SendOrder函数是可以用在模拟盘的,可是我测试的 A_SendOrder为什么不发单呢?
Params
Vars
BoolSeries    BL(True);
Begin
If(BL) //
{
If(Close[1]<Close[2])
A_SendOrder(Enum_Sell,Enum_Entry,1,Open);
}
End
这段很简单的代码,编译加载图形后不发单,这又是咋回事呢?我已经开启全自动交易,图表右上角的笑脸符号是绿色笑脸。
作者: Yuen_Lee    时间: 2021-8-9 15:23:17

可以在论坛里搜一下关于“A_SendOrder不发单”的问题,这个我也不是很清楚。
作者: tbmorning    时间: 2021-8-9 17:11:15

Yuen_Lee 发表于 2021-8-9 15:23
可以在论坛里搜一下关于“A_SendOrder不发单”的问题,这个我也不是很清楚。 ...

好的,非常感谢!
实际上我发现问题的时候第一时间搜索过论坛,但是很遗憾关键字不准确,没找到具体答案。




欢迎光临 开拓者期货期权程序化系统交易论坛 (http://bbs.tb18.net/) Powered by Discuz! X2