设为首页收藏本站

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

关于持仓系统过夜提前发单的写法 [复制链接]

Rank: 10Rank: 10Rank: 10

精华
20
UID
4
积分
22709
帖子
4802
主题
64
阅读权限
255
注册时间
2007-7-20
最后登录
2024-1-15
跳转到指定楼层
1#
发表于 2009-9-15 15:21:51 |只看该作者 |倒序浏览
最近有很多朋友问到如何实现持仓系统过夜提前发单的问题,特意写一个模板,有此需要的朋友可以依样画葫芦。修改入场条件即可。

模板的交易系统采取价格和均线通道的穿越入场,一直在市。如果您的系统有较大差别,可以将开仓和平仓分别按此模板处理。

模板是应用于30分钟周期,上午收盘或下午收盘会提前交易。
  1. Params
  2.         Numeric Length(20);
  3.         Numeric OffSet(5);
  4. Vars
  5.         Numeric MinPoint;
  6.         Numeric AvgValue;

  7.         NumericSeries UpBand;
  8.         NumericSeries DnBand;
  9.         BoolSeries LongCon;
  10.         BoolSeries ShortCon;
  11.        
  12.         Numeric LastBarIndex;                // 用来保存最后交易Bar的索引
  13.         Numeric SendOrderFlag;                // 用来保存交易状态信息
  14. Begin
  15.         If(Date!=Date[1] && High == Low ) Return; // 集合竞价数据的过滤

  16.         LastBarIndex = GetGlobalVar(0);
  17.         SendOrderFlag = GetGlobalVar(1);
  18.         If(LastBarIndex != CurrentBar)
  19.         {
  20.                 SendOrderFlag = 0;
  21.                 LastBarIndex = CurrentBar;
  22.                 SetGlobalVar(0,LastBarIndex);
  23.                 SetGlobalVar(1,SendOrderFlag);
  24.         }
  25.        
  26.         MinPoint = MinMove*PriceScale;
  27.         AvgValue = AverageFC(Close,Length);
  28.         UpBand = AvgValue + OffSet * MinPoint;
  29.         DnBand = AvgValue - OffSet * MinPoint;
  30.        
  31.         LongCon = CrossOver(Close,UpBand);
  32.         ShortCon = CrossUnder(Close,DnBand);
  33.        
  34.         If(BarStatus == 2) // 实际交易
  35.         {               
  36.                 If(SendOrderFlag==1)
  37.                 {
  38.                         Buy(1,Close);
  39.                 }else If(SendOrderFlag==-1)
  40.                 {
  41.                         SellShort(1,Close);
  42.                 }Else If(SendOrderFlag ==0 && ((Time==0.1100 && CurrentTime > 0.112800 )||(Time==0.1430 && CurrentTime > 0.145800 )))
  43.                 {
  44.                         If(MarketPosition!=1 && LongCon)
  45.                         {
  46.                                 Buy(1,Q_AskPrice);
  47.                                 SendOrderFlag = 1;
  48.                         }Else If(MarketPosition!=-1 && ShortCon)
  49.                         {
  50.                                 SellShort(1,Q_BidPrice);
  51.                                 SendOrderFlag = -1;
  52.                         }
  53.                         SetGlobalVar(1,SendOrderFlag);
  54.                 }
  55.         }Else If(CurrentBar==BarCount-2)// 倒数第二根Bar
  56.         {
  57.                 If(SendOrderFlag==1)
  58.                 {
  59.                         Buy(1,NextOpen,True);
  60.                 }else If(SendOrderFlag==-1)
  61.                 {
  62.                         SellShort(1,NextOpen,True);
  63.                 }Else
  64.                 {
  65.                         If(MarketPosition!=1 && LongCon)
  66.                         {
  67.                                 Buy(1,NextOpen,True);
  68.                         }
  69.                                        
  70.                         If(MarketPosition!=-1 && ShortCon)
  71.                         {
  72.                                 SellShort(1,NextOpen,True);
  73.                         }               
  74.                 }
  75.         }Else // 测试
  76.         {
  77.                 If(MarketPosition!=1 && LongCon)
  78.                 {
  79.                         Buy(1,Close);
  80.                 }
  81.                                
  82.                 If(MarketPosition!=-1 && ShortCon)
  83.                 {
  84.                         SellShort(1,Close);
  85.                 }
  86.         }
  87. End
复制代码

Rank: 10Rank: 10Rank: 10

精华
8
UID
2300
积分
66650
帖子
1956
主题
168
阅读权限
200
注册时间
2008-9-8
最后登录
2009-11-11
2#
发表于 2009-9-17 16:37:41 |只看该作者
强帖先占座

使用道具 举报

Rank: 3Rank: 3

精华
0
UID
4945
积分
127
帖子
5
主题
3
阅读权限
40
注册时间
2009-7-27
最后登录
2011-10-9
3#
发表于 2009-9-18 11:07:59 |只看该作者
对于这个模板我有以下的问题,望得到解答,多谢!

Params
        Numeric Length(20);
        Numeric OffSet(5);
Vars
        Numeric MinPoint;
        Numeric AvgValue;

        NumericSeries UpBand;
        NumericSeries DnBand;
        BoolSeries LongCon;
        BoolSeries ShortCon;
        
        Numeric LastBarIndex;                // 用来保存最后交易Bar的索引
        Numeric SendOrderFlag;                // 用来保存交易状态信息
//1 对于sendorderflag这个变量,应该是记录的每个bar的交易信息吧,=1代表当前买多,=-1代表当前卖空,=0代表当前bar没有发送交易,那应该在每次buy,sell,sellshort,buytocover以后对它赋值,为什么在代码里没有呢?
Begin
        If(Date!=Date[1] && High == Low ) Return; // 集合竞价数据的过滤
//2 关于集合竞价的判断条件:为什么在集合竞价阶段要加上date!=date[1]的判断条件,对于每天来说date[1]不都应该是昨天吗?另外集合竞价阶段high和low记录的是什么价格?        
     LastBarIndex = GetGlobalVar(0);
        SendOrderFlag = GetGlobalVar(1);
        If(LastBarIndex != CurrentBar)
        {
                SendOrderFlag = 0;
                LastBarIndex = CurrentBar;
                SetGlobalVar(0,LastBarIndex);
                SetGlobalVar(1,SendOrderFlag);
        }
        
        MinPoint = MinMove*PriceScale;
        AvgValue = AverageFC(Close,Length);
        UpBand = AvgValue + OffSet * MinPoint;
        DnBand = AvgValue - OffSet * MinPoint;
        
        LongCon = CrossOver(Close,UpBand);
        ShortCon = CrossUnder(Close,DnBand);
        
        If(BarStatus == 2) // 实际交易
        {               
                If(SendOrderFlag==1)
//3 应该用marketposition和Longcon来作为判断条件下单吧,怎么会是用sendorderflag呢?
                {
                        Buy(1,Close);
                }else If(SendOrderFlag==-1)
                {
                        SellShort(1,Close);
                }Else If(SendOrderFlag ==0 && ((Time==0.1100 && CurrentTime > 0.112800 )||(Time==0.1430 && CurrentTime > 0.145800 )))
                {
                        If(MarketPosition!=1 && LongCon)
                        {
                                Buy(1,Q_AskPrice);
                                SendOrderFlag = 1;
                        }Else If(MarketPosition!=-1 && ShortCon)
                        {
                                SellShort(1,Q_BidPrice);
                                SendOrderFlag = -1;
                        }
                        SetGlobalVar(1,SendOrderFlag);
                }
        }Else If(CurrentBar==BarCount-2)// 倒数第二根Bar
//4 为什么会有一个倒数第二根bar和测试的判断条件呢?是不是在每当时间推移,走到新的bar,系统都会从第一个bar开始往前做运算呢,否则currentbar怎么会不等于barcount-1呢?
        {
                If(SendOrderFlag==1)
                {
                        Buy(1,NextOpen,True);
                }else If(SendOrderFlag==-1)
                {
                        SellShort(1,NextOpen,True);
                }Else
                {
                        If(MarketPosition!=1 && LongCon)
                        {
                                Buy(1,NextOpen,True);
                        }
                                       
                        If(MarketPosition!=-1 && ShortCon)
                        {
                                SellShort(1,NextOpen,True);
                        }               
                }
        }Else // 测试
        {
                If(MarketPosition!=1 && LongCon)
                {
                        Buy(1,Close);
                }
                                
                If(MarketPosition!=-1 && ShortCon)
                {
                        SellShort(1,Close);
                }
        }
End

使用道具 举报

Rank: 10Rank: 10Rank: 10

精华
20
UID
4
积分
22709
帖子
4802
主题
64
阅读权限
255
注册时间
2007-7-20
最后登录
2024-1-15
4#
发表于 2009-9-18 13:21:01 |只看该作者
1、SendOrderFlag只处理实际交易时提前委托的标记,所以只在指定地方添加。
2、Date!=Date[1]这个条件反应的是当天的第一个Bar,集合竞价出来的价格只有一个,High,Low,Close,Open都相等,我们希望这个时候不进行处理,直到开盘后交易产生更多的Tick之后。
3、这里是处理但条件满足委托之后,如果条件不稳定,则会出现讯号消失,通过这种写法,确保下单之后讯号还会保留。
4、同3,当增加一个新Bar时,会将最近两个Bar的数据一起计算,通过这么编写,可以确保最后两个Bar的信号能够保持住。

使用道具 举报

Rank: 3Rank: 3

精华
0
UID
4945
积分
127
帖子
5
主题
3
阅读权限
40
注册时间
2009-7-27
最后登录
2011-10-9
5#
发表于 2009-9-21 14:00:41 |只看该作者
感谢答复。
还有几个问题望解答。
1、对于3,您指的条件不稳定是不是在模板里指的是早晚收市时的情形。什么时候会出现讯号消失呢?
2、在这个模板里,判断条件一barstatus==2,判断条件二CurrentBar==BarCount-2,判断条件三 else//测试。
请问判断条件三(测试)下的buy不会对真实交易产生影响对吗? 是不是说真实交易下的我们所用的代码会和测试时的有很大的不同。如果我们用测试用的策略代码来交易会怎样呢?

另外,这个模板可以用于真实交易吗?日内的交易呢?您可以提供真实交易时日内的比较完备的代码模板吗?


使用道具 举报

Rank: 2

精华
0
UID
4386
积分
62
帖子
9
主题
0
阅读权限
30
注册时间
2009-5-13
最后登录
2019-3-30
6#
发表于 2009-11-6 16:52:35 |只看该作者
我在1分钟线上使用时最后一个bar会出多个信号!

使用道具 举报

Rank: 3Rank: 3

精华
0
UID
2088
积分
154
帖子
5
主题
2
阅读权限
40
注册时间
2008-8-6
最后登录
2015-9-8
7#
发表于 2009-11-8 21:29:34 |只看该作者
2、Date!=Date[1]这个条件反应的是当天的第一个Bar,集合竞价出来的价格只有一个,High,Low,Close,Open都相等,我们希望这个时候不进行处理,直到开盘后交易产生更多的Tick之后。
如果开盘停板的话High,Low,Close,Open都相等,这个情况怎么处理?

使用道具 举报

Rank: 4

精华
0
UID
5417
积分
502
帖子
94
主题
40
阅读权限
50
注册时间
2009-9-9
最后登录
2019-3-30
8#
发表于 2010-7-9 10:19:04 |只看该作者
}Else If(CurrentBar==BarCount-2)// 倒数第二根Bar
        {
                If(SendOrderFlag==1)
                {
                        Buy(1,NextOpen,True);
                }else If(SendOrderFlag==-1)
                {
                        SellShort(1,NextOpen,True);
                }Else
                {
                        If(MarketPosition!=1 && LongCon)
                        {
                                Buy(1,NextOpen,True);
                        }
                                       
                        If(MarketPosition!=-1 && ShortCon)
                        {
                                SellShort(1,NextOpen,True);
                        }               


请问为什么要用“nextopen"呢?

使用道具 举报

Rank: 5Rank: 5

精华
0
UID
5525
积分
1473
帖子
429
主题
93
阅读权限
60
注册时间
2009-9-22
最后登录
2022-5-23
9#
发表于 2010-11-26 21:41:22 |只看该作者
好久没有人对这个帖子研究了。我有几个问题想请教:
(1) 在BarStatus == 2分支,由于使用B/S指令,所以不存在重复发单问题。
(2) 在CurrentBar==BarCount-2 分支,实际行情时,是发生在新的Bar的第一个Tick传来时,TB补一个程序,还是与新Bar的第一个Tick一起执行?进一步问题是这个分支下的B/S指令是否能发送到交易柜台,还是只作信号显示?
(3) 最后的Else分支只是用作历史回测,应该说只要LongCon和ShortCon条件时稳定的,信号就能保持,但是我试下来并非如此。
为了做测试验证,我对版主的原始程序做了少许变得,让LongCon和ShortCon满足条件变得容易些;在不同的分支B/S的手数不一样;还加了FileAppend用来记录,程序如下,希望大家测试分析。谢谢!
  1. //------------------------------------------------------------------------
  2. // 简称: test1
  3. // 名称:
  4. // 类别: 交易指令
  5. // 类型: 多头建仓
  6. // 输出:
  7. //------------------------------------------------------------------------

  8. Params
  9.         Numeric Length(20);
  10.         Numeric OffSet(5);
  11. Vars
  12.         Numeric MinPoint;
  13.         Numeric AvgValue;

  14.         NumericSeries UpBand;
  15.         NumericSeries DnBand;
  16.         BoolSeries LongCon;
  17.         BoolSeries ShortCon;
  18.         
  19.         Numeric LastBarIndex;                // 用来保存最后交易Bar的索引
  20.         Numeric SendOrderFlag;                // 用来保存交易状态信息
  21. Begin
  22.         If(Date!=Date[1] && High == Low ) Return; // 集合竞价数据的过滤

  23.         LastBarIndex = GetGlobalVar(0);
  24.         SendOrderFlag = GetGlobalVar(1);
  25.         If(LastBarIndex != CurrentBar)
  26.         {
  27.                 SendOrderFlag = 0;
  28.                 LastBarIndex = CurrentBar;
  29.                 SetGlobalVar(0,LastBarIndex);
  30.                 SetGlobalVar(1,SendOrderFlag);
  31.         }
  32.         
  33.         MinPoint = MinMove*PriceScale;
  34.         AvgValue = AverageFC(Close,Length);
  35.         UpBand = AvgValue + OffSet * MinPoint;
  36.         DnBand = AvgValue - OffSet * MinPoint;
  37.         
  38.         LongCon = Low< Lowest(Low[1],5); //CrossOver(Close,UpBand);
  39.         ShortCon = High> Highest(high[1],5); //CrossUnder(Close,DnBand);
  40.         
  41.         If(BarStatus == 2) // 实际交易
  42.         {               
  43.                 If(SendOrderFlag==1)
  44.                 {
  45.                         Buy(3,Close);FileAppend("C:\Test1.log",TimeToString(CurrentTime)+" "+Text(CurrentBar)+" Buy(3,Close) "+Text(Close));
  46.                 }else If(SendOrderFlag==-1)
  47.                 {
  48.                         SellShort(3,Close);FileAppend("C:\Test1.log",TimeToString(CurrentTime)+" "+Text(CurrentBar)+" SellShort(3,Close) "+Text(Close));
  49.                 }Else If(SendOrderFlag ==0 && ((Time==0.1100 && CurrentTime > 0.112800 )||(Time==0.1430 && CurrentTime > 0.145800 )))
  50.                 {
  51.                         If(MarketPosition!=1 && LongCon)
  52.                         {
  53.                                 Buy(3,Q_AskPrice);FileAppend("C:\Test1.log",TimeToString(CurrentTime)+" "+Text(CurrentBar)+" Buy(3,Q_AskPrice) "+Text(Q_AskPrice));
  54.                                 SendOrderFlag = 1;
  55.                         }Else If(MarketPosition!=-1 && ShortCon)
  56.                         {
  57.                                 SellShort(3,Q_BidPrice);FileAppend("C:\Test1.log",TimeToString(CurrentTime)+" "+Text(CurrentBar)+" SellShort(3,Q_BidPrice) "+Text(Q_BidPrice));
  58.                                 SendOrderFlag = -1;
  59.                         }
  60.                         SetGlobalVar(1,SendOrderFlag);
  61.                 }
  62.         }Else If(CurrentBar==BarCount-2)// 倒数第二根Bar
  63.         {
  64.                 If(SendOrderFlag==1)
  65.                 {
  66.                         Buy(2,NextOpen,True);FileAppend("C:\Test1.log",TimeToString(CurrentTime)+" "+Text(CurrentBar)+" Buy(2,NextOpen,True) Flag==1 "+Text(NextOpen));
  67.                 }else If(SendOrderFlag==-1)
  68.                 {
  69.                         SellShort(2,NextOpen,True);FileAppend("C:\Test1.log",TimeToString(CurrentTime)+" "+Text(CurrentBar)+" SellShort(2,NextOpen,True) Flag==-1 "+Text(NextOpen));
  70.                 }Else
  71.                 {
  72.                         If(MarketPosition!=1 && LongCon)
  73.                         {
  74.                                 Buy(2,NextOpen,True);FileAppend("C:\Test1.log",TimeToString(CurrentTime)+" "+Text(CurrentBar)+" Buy(2,NextOpen,True) "+Text(NextOpen));
  75.                         }
  76.                                        
  77.                         If(MarketPosition!=-1 && ShortCon)
  78.                         {
  79.                                 SellShort(2,NextOpen,True);FileAppend("C:\Test1.log",TimeToString(CurrentTime)+" "+Text(CurrentBar)+" SellShort(2,NextOpen,True) "+Text(NextOpen));
  80.                         }               
  81.                 }
  82.         }Else // 测试
  83.         {
  84.                 If(MarketPosition!=1 && LongCon)
  85.                 {
  86.                         Buy(1,Close); FileAppend("C:\Test1.log",TimeToString(CurrentTime)+" "+Text(CurrentBar)+" Buy(1,Close) "+Text(NextOpen));
  87.                 }
  88.                                 
  89.                 If(MarketPosition!=-1 && ShortCon)
  90.                 {
  91.                         SellShort(1,Close);FileAppend("C:\Test1.log",TimeToString(CurrentTime)+" "+Text(CurrentBar)+" SellShort(1,Close) "+Text(NextOpen));
  92.                 }
  93.         }
  94. End
  95. //------------------------------------------------------------------------
  96. // 编译版本        GS2004.06.12
  97. // 用户版本        2009/10/07 20:34
  98. // 版权所有        guqf
  99. // 更改声明        TradeBlazer Software保留对TradeBlazer平台
  100. //                        每一版本的TrabeBlazer公式修改和重写的权利
  101. //------------------------------------------------------------------------
复制代码
上善若水,无欲则刚

使用道具 举报

Rank: 5Rank: 5

精华
0
UID
5525
积分
1473
帖子
429
主题
93
阅读权限
60
注册时间
2009-9-22
最后登录
2022-5-23
10#
发表于 2010-11-26 21:58:53 |只看该作者
本帖最后由 efrog 于 2010-11-26 22:00 编辑

对第二个问题,根据我的测试,TB时补执行一个Bar运算,然后再执行新Bar的第一个Tick。
大家可以参见这个帖子的测试和记录:http://www.tradeblazer.net/forum/thread-11073-1-1.html

问题是,这个分支下:If(CurrentBar==BarCount-2)// 倒数第二根Bar
发出的B/S指令发到了交易柜台,应该是不能发到交易柜台的。单交易记录里有手数为2的成交单,当然也有手数为3的单子。
上善若水,无欲则刚

使用道具 举报

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

bottom

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

GMT+8, 2024-5-8 08:36

Powered by Discuz! X2 LicensedChrome插件扩展

© 2011-2012 交易开拓者 Inc.

回顶部