设为首页收藏本站

 找回密码
 注册
查看: 3702|回复: 6
打印 上一主题 下一主题

在线求助:用了全局变量,怎么还会反复开仓? [复制链接]

Rank: 3Rank: 3

精华
0
UID
3091
积分
244
帖子
55
主题
11
阅读权限
40
注册时间
2008-12-19
最后登录
2011-4-9
跳转到指定楼层
1#
发表于 2010-9-30 13:14:46 |只看该作者 |倒序浏览
本帖最后由 leevolvo 于 2010-9-30 13:17 编辑

今天开始尝试学习套利交易,代码如下,为什么还会反复开仓?甚至我在交易设置里 禁止连续建仓,都没用,依然重复开仓。

Params
        Numeric Lots(1);
Vars  
        NumericSeries delta;
Begin
        If(BarStatus == 0)        //全局变量初始化
        {
                SetGlobalVar(0,0);
        }
        If(Data0.Close[1] != InvalidNumeric && Data1.Close[1] != InvalidNumeric)
              {
                   delta=Data0.Close-Data1.Close;
              }
                        IF(delta>delta[1] And GetGlobalVar(0) == 1)//有持仓
                 {
                  Data0.A_SendOrder(Enum_Buy,Enum_Exit,Lots,C[1]+2);
                  Data1.A_SendOrder(Enum_Sell,Enum_Exit,Lots,C[1]-2);
                  SetGlobalVar(0,0);//平仓后,全局变量赋值为0
                 }

                        IF(delta>delta[1] And GetGlobalVar(0) == 0)//没持仓,才开仓
                 {
                  Data0.A_SendOrder(Enum_Buy,Enum_Entry,Lots,C[1]+2);
                  Data1.A_SendOrder(Enum_Sell,Enum_Entry,Lots,C[1]-2);
                  SetGlobalVar(0,1);//开仓后,全局变量赋值为1
                 }
                                            

                        IF(delta<delta[1] And GetGlobalVar(0) == 1)
                 {
                  Data0.A_SendOrder(Enum_Sell,Enum_Exit,Lots,C[1]-2);
                  Data1.A_SendOrder(Enum_Buy,Enum_Exit,Lots,C[1]+2);
                  SetGlobalVar(0,0);
                 }

        IF(delta<delta[1] And GetGlobalVar(0) == 0)
                 {
                  Data0.A_SendOrder(Enum_Sell,Enum_Entry,1,C[1]-2);
                  Data1.A_SendOrder(Enum_Buy,Enum_Entry,1,C[1]+2);
                  SetGlobalVar(0,1);
                 }
End

Rank: 10Rank: 10Rank: 10

精华
2
UID
4130
积分
20906
帖子
6519
主题
17
阅读权限
200
注册时间
2009-4-15
最后登录
2019-4-12
2#
发表于 2010-9-30 13:27:34 |只看该作者
就这一段来说
  1.                         IF(delta>delta[1] And GetGlobalVar(0) == 1)//有持仓
  2.                  {
  3.                   Data0.A_SendOrder(Enum_Buy,Enum_Exit,Lots,C[1]+2);
  4.                   Data1.A_SendOrder(Enum_Sell,Enum_Exit,Lots,C[1]-2);
  5.                   SetGlobalVar(0,0);//平仓后,全局变量赋值为0
  6.                  }

  7.                         IF(delta>delta[1] And GetGlobalVar(0) == 0)//没持仓,才开仓
  8.                  {
  9.                   Data0.A_SendOrder(Enum_Buy,Enum_Entry,Lots,C[1]+2);
  10.                   Data1.A_SendOrder(Enum_Sell,Enum_Entry,Lots,C[1]-2);
  11.                   SetGlobalVar(0,1);//开仓后,全局变量赋值为1
  12.                  }
复制代码
前面的if把仓平了,公式还会执行第二个if的,然后又会开仓的
试试将结构改成:
if(..)
{
..
}else if(..)
{
..
}
判断是否有持仓请用A_BuyPosition和A_SellPosition

使用道具 举报

Rank: 3Rank: 3

精华
0
UID
3091
积分
244
帖子
55
主题
11
阅读权限
40
注册时间
2008-12-19
最后登录
2011-4-9
3#
发表于 2010-9-30 13:55:51 |只看该作者
谢谢。我找到原因了

使用道具 举报

Rank: 3Rank: 3

精华
0
UID
3091
积分
244
帖子
55
主题
11
阅读权限
40
注册时间
2008-12-19
最后登录
2011-4-9
4#
发表于 2010-9-30 13:56:29 |只看该作者
Params
        Numeric Lots(1);
Vars  
        NumericSeries delta;
Begin
        If(BarStatus == 0)        //全局变量初始化
        {
                SetGlobalVar(0,0);
        }
        If(Data0.Close[1] != InvalidNumeric && Data1.Close[1] != InvalidNumeric)
              {
                   delta=Data0.Close-Data1.Close;
              }
                        IF(delta>delta[1] And GetGlobalVar(0) == -1)
                 {
                  Data0.A_SendOrder(Enum_Buy,Enum_Exit,1,C[1]+10);
                  Data1.A_SendOrder(Enum_Sell,Enum_Exit,1,C[1]-10);
                  SetGlobalVar(0,0);
                 }

                        IF(delta>delta[1] And GetGlobalVar(0) == 0)
                 {
                  Data0.A_SendOrder(Enum_Buy,Enum_Entry,1,C[1]+10);
                  Data1.A_SendOrder(Enum_Sell,Enum_Entry,1,C[1]-10);
                  SetGlobalVar(0,1);
                 }
                                            

                        IF(delta<delta[1] And GetGlobalVar(0) == 1)
                 {
                  Data0.A_SendOrder(Enum_Sell,Enum_Exit,1,C[1]-10);
                  Data1.A_SendOrder(Enum_Buy,Enum_Exit,1,C[1]+10);
                  SetGlobalVar(0,0);
                 }

                                        IF(delta<delta[1] And GetGlobalVar(0) == 0)
                 {
                  Data0.A_SendOrder(Enum_Sell,Enum_Entry,1,C[1]-10);
                  Data1.A_SendOrder(Enum_Buy,Enum_Entry,1,C[1]+10);
                  SetGlobalVar(0,-1);
                 }
End

使用道具 举报

Rank: 3Rank: 3

精华
0
UID
3091
积分
244
帖子
55
主题
11
阅读权限
40
注册时间
2008-12-19
最后登录
2011-4-9
5#
发表于 2010-9-30 14:03:09 |只看该作者
不过,还是有错误,报单价格错了
应该这样
Data1.A_SendOrder(Enum_Buy,Enum_Exit,1,data1.C[1]+10);

整体代码如下,还没有加入收盘平仓 和集合竞价的处理:
Params
        Numeric Lots(1);
Vars  
        NumericSeries delta;
Begin
        If(BarStatus == 0)        //全局变量初始化
        {
                SetGlobalVar(0,0);
        }
        If(Data0.Close[1] != InvalidNumeric && Data1.Close[1] != InvalidNumeric)
              {
                   delta=Data0.Close-Data1.Close;
              }
                        IF(delta>delta[1] And GetGlobalVar(0) == -1)
                 {
                  Data0.A_SendOrder(Enum_Buy,Enum_Exit,1,C[1]+10);
                  Data1.A_SendOrder(Enum_Sell,Enum_Exit,1,C[1]-10);
                  SetGlobalVar(0,0);
                 }

                        IF(delta>delta[1] And GetGlobalVar(0) == 0)
                 {
                  Data0.A_SendOrder(Enum_Buy,Enum_Entry,1,C[1]+10);
                  Data1.A_SendOrder(Enum_Sell,Enum_Entry,1,C[1]-10);
                  SetGlobalVar(0,1);
                 }
                                            

                        IF(delta<delta[1] And GetGlobalVar(0) == 1)
                 {
                  Data0.A_SendOrder(Enum_Sell,Enum_Exit,1,C[1]-10);
                  Data1.A_SendOrder(Enum_Buy,Enum_Exit,1,C[1]+10);
                  SetGlobalVar(0,0);
                 }

                                        IF(delta<delta[1] And GetGlobalVar(0) == 0)
                 {
                  Data0.A_SendOrder(Enum_Sell,Enum_Entry,1,C[1]-10);
                  Data1.A_SendOrder(Enum_Buy,Enum_Entry,1,C[1]+10);
                  SetGlobalVar(0,-1);
                 }
End

使用道具 举报

Rank: 2

精华
0
UID
112465
积分
63
帖子
36
主题
3
阅读权限
30
注册时间
2012-9-11
最后登录
2013-7-3
6#
发表于 2012-12-28 14:53:46 |只看该作者
leevolvo 发表于 2010-9-30 14:03
不过,还是有错误,报单价格错了
应该这样
Data1.A_SendOrder(Enum_Buy,Enum_Exit,1,data1.C[1]+10);

如果你这程序下单没有成功,你考虑进去了么

使用道具 举报

Rank: 2

精华
0
UID
112465
积分
63
帖子
36
主题
3
阅读权限
30
注册时间
2012-9-11
最后登录
2013-7-3
7#
发表于 2012-12-28 14:53:50 |只看该作者
leevolvo 发表于 2010-9-30 14:03
不过,还是有错误,报单价格错了
应该这样
Data1.A_SendOrder(Enum_Buy,Enum_Exit,1,data1.C[1]+10);

如果你这程序下单没有成功,你考虑进去了么

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

bottom

静态版|手机版|联系我们|交易开拓者 ( 粤ICP备07044698   

GMT+8, 2024-5-23 13:52

Powered by Discuz! X2 LicensedChrome插件扩展

© 2011-2012 交易开拓者 Inc.

回顶部