设为首页收藏本站

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

发个模板,欢迎共享,欢迎测试、改进、完善 [复制链接]

Rank: 4

精华
0
UID
15288
积分
382
帖子
86
主题
18
阅读权限
50
注册时间
2010-8-20
最后登录
2010-10-14
跳转到指定楼层
1#
发表于 2010-9-11 12:27:57 |只看该作者 |倒序浏览
//本模板包含两个模块:开多仓,平多仓。
//本模板还没有完全测试完毕。已发现有个别重复发单现象。原因尚在查找中。
//欢迎copy,欢迎拍砖。

Params
        //模板参数
        Numeric        lastOpenTime(14.55);//开仓时间限制
        Numeric        lastCloseTime(14.56);//退出时间限制
        Numeric        waittimeEntry(20);//等待入场成交时间秒数
        Numeric        waittimeExit(20);//等待出场成交时间秒数
        Numeric        lots(1);                //交易量       


Vars
        //模板变量
        Bool                conBuyEntry;//开多条件
        Bool                conOpenOrderBuyEntry;//已存在未成交开多单
        Bool                conWaitTime;
        Numeric                        priceBuyEntry;
        Bool                conSellExit;
        Bool                conOpenOrderSellExit;//已存在未成交平多单
        Numeric                        priceSellExit;
       
        //个性变量

       

Begin
//开多*******************************************************************************************************

        //判断是否已有未成交多单 (防止网络延时以及全局变量意外丢失正确值)
        conOpenOrderBuyEntry=(GetGlobalVar(10)==1) || (A_GetLastOpenOrderIndex(Enum_Buy,Enum_Entry) != InvalidInteger) ;       
        If ( CurrentTime*100<lastOpenTime && A_BuyPosition==0 )
        {       
FileAppend("d:\\h.log",text(currenttime*100)+"***********************************准备开多");                       
                                                                                       
//-------------------------------------------------------------------------------------求开多条件
               
               
               
               
               
                conBuyEntry=True;
//-------------------------------------------------------------------------------------求开多条件完毕               
               
                If (conBuyEntry)        //多头条件
                {
                        //处理已有未成交多单                        
                        If ( conOpenOrderBuyEntry )       
                        {
                                // 判断等待时间
                                If (GetGlobalVar(11)==InvalidNumeric)       
                                        SetGlobalVar(11,0);//初始化等待时间变量
                                conWaitTime=(MyDecTime( currenttime,GetGlobalVar(11))>waittimeEntry)
                                                || ( MyDecTime(currenttime,A_OpenOrderTime( A_GetLastOpenOrderIndex(Enum_Buy,Enum_Entry) )) > waittimeEntry );                                                       
FileAppend("d:\\h.log",text(currenttime*100)+"     "+"等待时间秒数1="+text(MyDecTime( currenttime,GetGlobalVar(11)))
        +"      等待时间秒数2="+text( MyDecTime(currenttime,A_OpenOrderTime( A_GetLastOpenOrderIndex(Enum_Buy,Enum_Entry) ))));       
                                If ( conWaitTime )
                                {
FileAppend("d:\\h.log",text(currenttime*100)+"     "+"延时已到,撤单重发");               
FileAppend("d:\\h.log",text(currenttime*100)+"     "+"撤单合同号="
        +A_OpenOrderContractNo( A_GetLastOpenOrderIndex(Enum_Buy,Enum_Entry)));                               
                                        A_DeleteOrder( A_OpenOrderContractNo( A_GetLastOpenOrderIndex(Enum_Buy,Enum_Entry) ) );        //撤单                                               
                                        //算价、下单、设置、计时
                                        priceBuyEntry=        ;                                                                                       
                                        A_SendOrder(Enum_Buy,Enum_Entry,lots,priceBuyEntry);       
FileAppend("d:\\h.log",text(currenttime*100)+"     "+"重发单(未成交)索引号="
        +text( A_GetLastOpenOrderIndex(Enum_Buy,Enum_Entry)));                                       
FileAppend("d:\\h.log",text(currenttime*100)+"     "+"重发合同号(未成交)="
        +A_OpenOrderContractNo( A_GetLastOpenOrderIndex(Enum_Buy,Enum_Entry)));       
FileAppend("d:\\h.log",text(currenttime*100)+"     "+"重发合同号(末合同)="
        +A_OrderContractNo( A_GetLastOrderIndex(Enum_Buy,Enum_Entry)));               
                                        SetGlobalVar(10,1);
                                        SetGlobalVar(11,currenttime);                                       
                                }                                               
                        }
                        Else       
                        {
                        //算价、下单、设置、计时
                                priceBuyEntry=              ;

                        A_SendOrder(Enum_Buy,Enum_Entry,lots,priceBuyEntry);
FileAppend("d:\\h.log",text(currenttime*100)+"     "+"首次发单");
FileAppend("d:\\h.log",text(currenttime*100)+"     "+"首发合同号="
        +A_OpenOrderContractNo( A_GetLastOpenOrderIndex(Enum_Buy,Enum_Entry)));
                        SetGlobalVar(10,1);
                        SetGlobalVar(11,currenttime);                                                               
                        }               
                }
                Else
                {
FileAppend("d:\\h.log",text(currenttime*100)+"     "+"不符合多头条件");       
                        //有多单则撤单
                        If ( (A_GetLastOpenOrderIndex(Enum_Buy,Enum_Entry) != InvalidInteger) )        //不采用全局变量,需等待前面的单子可撤。
                                A_DeleteOrder( A_OpenOrderContractNo( A_GetLastOpenOrderIndex(Enum_Buy,Enum_Entry) ) );                               
                               
                        SetGlobalVar(10,0);
                }
               
        }
       
        Else
        {
                If ( (A_GetLastOpenOrderIndex(Enum_Buy,Enum_Entry) != InvalidInteger) )        //不采用全局变量,需等待前面的单子可撤。
                        A_DeleteOrder( A_OpenOrderContractNo( A_GetLastOpenOrderIndex(Enum_Buy,Enum_Entry) ) );
                SetGlobalVar(10,0);
        }
       
//处理多头仓位*************************************************************************************************************************************
       
        If ( A_BuyPosition!=0 )        
        {       
                //判断是否已有未成交平多单 (防止网络延时以及全局变量意外丢失正确值)
                conOpenOrderSellExit=(GetGlobalVar(30)==1) || (A_GetLastOpenOrderIndex(Enum_Sell,Enum_ExitToday) != InvalidInteger) ;       
FileAppend("d:\\h.log",text(currenttime*100)+"================================================准备平多仓");       
                If (CurrentTime*100<=lastCloseTime)        //退出时间限制
                {
                        //有单无单分别处理                        
                        If ( conOpenOrderSellExit )         //有单处理,有手工单也同样处理
                        {
                                If (GetGlobalVar(31)==InvalidNumeric)       
                                        SetGlobalVar(31,0);//初始化等待时间变量
                                conWaitTime=(MyDecTime( currenttime,GetGlobalVar(31))>waittimeExit)
                                                || ( MyDecTime(currenttime,A_OpenOrderTime( A_GetLastOpenOrderIndex(Enum_Sell,Enum_ExitToday) )) > waittimeExit );
FileAppend("d:\\h.log",text(currenttime*100)+"     "+"平仓等待时间秒数1="+text(MyDecTime( currenttime,GetGlobalVar(31)))
        +"      平仓等待时间秒数2="+text( MyDecTime(currenttime,A_OpenOrderTime( A_GetLastOpenOrderIndex(Enum_Sell,Enum_ExitToday) ))));       
                                If ( conWaitTime )                // 等待成交的延时已到,撤单追价重发
                                {
FileAppend("d:\\h.log",text(currenttime*100)+"     "+"延时已到,撤平仓单重发");               
FileAppend("d:\\h.log",text(currenttime*100)+"     "+"撤单合同号="
        +A_OpenOrderContractNo( A_GetLastOpenOrderIndex(Enum_Sell,Enum_ExitToday)));                               
                                        A_DeleteOrder( A_OpenOrderContractNo( A_GetLastOpenOrderIndex(Enum_Sell,Enum_ExitToday) ) );        //撤单                                                               
                                        //算价、下单、设置、计时
                                        PriceSellExit=            ;                                               
                                        A_SendOrder(Enum_Sell,Enum_Exit,lots,PriceSellExit);
                                        SetGlobalVar(30,1);
                                        SetGlobalVar(31,currenttime);                                       
                                }                                               
                        }
                        Else        //无单处理
                        {
                               
//-------------------------------------------------------------------------------------求平多条件
               
               
               
               
               
                                conSellExit=true;                       
//-------------------------------------------------------------------------------------求平多条件完毕                                               
                                                                                                                                                                               
                                If (conSellExit)        //平多条件
                                {
                                //算价、下单、设置、计时
                                        PriceSellExit=          ;

                                A_SendOrder(Enum_Sell,Enum_Exit,lots,PriceSellExit);
FileAppend("d:\\h.log",text(currenttime*100)+"     "+"首次平仓发单");                               
                                SetGlobalVar(30,1);
                                SetGlobalVar(31,currenttime);                                                               
                                }
                        }

                }
                Else        //退出时间已到,有单撤单,以停板价委托,之后不撤单
                {
FileAppend("d:\\h.log",text(currenttime*100)+"     "+"退出时限已到");               
                        If (GetGlobalVar(39)==InvalidNumeric)
                                SetGlobalVar(39,0);//初始化
                        If ( A_GetLastOpenOrderIndex(Enum_Sell,Enum_ExitToday)!=InvalidInteger && GetGlobalVar(39)!=1)
                        {
                                A_DeleteOrder( A_OpenOrderContractNo( A_GetLastOpenOrderIndex(Enum_Sell,Enum_ExitToday) ) );
FileAppend("d:\\h.log",text(currenttime*100)+"     "+"有平仓单撤单");
                                SetGlobalVar(30,0);
                        }
                        If ( GetGlobalVar(39)!=1 )
                        {
                        A_SendOrder(Enum_Sell,Enum_Exit,lots, Q_LowerLimit);        
FileAppend("d:\\h.log",text(currenttime*100)+"     "+"跌停价发平仓单");
                        SetGlobalVar(30,1);
                        SetGlobalVar(39,1);
                        }
                }
        }
        Else
                SetGlobalVar(30,0);
               
         
       
End
TB程序化交易研讨群121136207
纯拉皮条者谢绝。哈哈

Rank: 4

精华
0
UID
15288
积分
382
帖子
86
主题
18
阅读权限
50
注册时间
2010-8-20
最后登录
2010-10-14
2#
发表于 2010-9-11 12:29:44 |只看该作者
上面的用户函数mydectime用于计算两个时间的秒差

Params
        Numeric MyTime1; //如0.143059
        Numeric MyTime2;

Vars
        Numeric MyHH1;
        Numeric MyMM1;
        Numeric MySS1;
        Numeric MyHH2;
        Numeric MyMM2;
        Numeric MySS2;

Begin
        MyHH1 = IntPart(MyTime1*100);
        MyMM1 = IntPart(MyTime1*10000)-MyHH1*100;
        MySS1 = MyTime1*1000000-MyHH1*10000-MyMM1*100;
        MyHH2 = IntPart(MyTime2*100);
        MyMM2 = IntPart(MyTime2*10000)-MyHH2*100;
        MySS2 = MyTime2*1000000-MyHH2*10000-MyMM2*100;
        Return MyHH1*3600 + MyMM1*60 + MySS1 - MyHH2*3600 - MyMM2*60 - MySS2;
End
TB程序化交易研讨群121136207
纯拉皮条者谢绝。哈哈

使用道具 举报

Rank: 4

精华
0
UID
15288
积分
382
帖子
86
主题
18
阅读权限
50
注册时间
2010-8-20
最后登录
2010-10-14
3#
发表于 2010-9-11 12:34:03 |只看该作者
要是tb能提供收盘时间也能进行盘中测试就好了
TB程序化交易研讨群121136207
纯拉皮条者谢绝。哈哈

使用道具 举报

Rank: 5Rank: 5

精华
0
UID
5525
积分
1473
帖子
429
主题
93
阅读权限
60
注册时间
2009-9-22
最后登录
2022-5-23
4#
发表于 2010-9-13 12:31:57 |只看该作者
很高兴“顺势顺心”利用我的MyDecTime函数。但是我自己并不使用该函数,实际上使用Tick计算更合适,我认为。
有时间研究一下你的程序框架。
上善若水,无欲则刚

使用道具 举报

Rank: 4

精华
0
UID
15288
积分
382
帖子
86
主题
18
阅读权限
50
注册时间
2010-8-20
最后登录
2010-10-14
5#
发表于 2010-9-13 21:23:36 |只看该作者
很高兴“顺势顺心”利用我的MyDecTime函数。但是我自己并不使用该函数,实际上使用Tick计算更合适,我认为。
有时间研究一下你的程序框架。
efrog 发表于 2010-9-13 12:31


引用你的函数没有注明出处。哈哈。我也忘了从谁那copy的。把你的时间小数位数改了点。
TB程序化交易研讨群121136207
纯拉皮条者谢绝。哈哈

使用道具 举报

Rank: 3Rank: 3

精华
0
UID
6249
积分
227
帖子
81
主题
30
阅读权限
40
注册时间
2009-12-23
最后登录
2021-1-15
6#
发表于 2012-1-12 09:18:18 |只看该作者
重复发单的原因找到了吗

使用道具 举报

Rank: 2

精华
0
UID
112465
积分
63
帖子
36
主题
3
阅读权限
30
注册时间
2012-9-11
最后登录
2013-7-3
7#
发表于 2012-11-1 21:00:54 |只看该作者
  //判断是否已有未成交多单 (防止网络延时以及全局变量意外丢失正确值)
        conOpenOrderBuyEntry=(GetGlobalVar(10)==1) || (A_GetLastOpenOrderIndex(Enum_Buy,Enum_Entry) != InvalidInteger) ;   
顺势顺心,在么?这里判断是不是有多单是不是应该改下,把 || 改成 &&

使用道具 举报

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

bottom

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

GMT+8, 2024-5-23 10:24

Powered by Discuz! X2 LicensedChrome插件扩展

© 2011-2012 交易开拓者 Inc.

回顶部