设为首页收藏本站

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

求助!版主麻烦看看怎么回事 [复制链接]

Rank: 3Rank: 3

精华
0
UID
234307
积分
153
帖子
103
主题
29
阅读权限
40
注册时间
2016-5-12
最后登录
2023-7-26
跳转到指定楼层
1#
发表于 2016-6-2 13:34:58 |只看该作者 |倒序浏览
写了一段分钟线测试程序,加了K线结束前撤单平仓一段后,运行就死机,实在找不出问题出在哪里,请版主帮忙看看。
  1. //------------------------------------------------------------------------
  2. // 简称: mintrade
  3. // 名称: 分钟线测试
  4. // 类别: 公式应用
  5. // 类型: 用户应用
  6. //------------------------------------------------------------------------

  7. Params
  8.         Numeric offSet(5);       
  9.         Numeric jyss(1);
  10. Vars
  11.         Numeric stop(0);
  12.         Numeric wtpyl;
  13.         Numeric nCount;
  14.         Numeric i;
  15.         Numeric nEntryFlag;
  16.        
  17.        
  18. Begin
  19.         if (BarStatus==2)
  20.         {
  21.                 wtpyl = offSet*MinMove*PriceScale;//委托偏移量
  22.                 if ( (H>H[1]&&L<L[1]) ) //出现穿头破脚走势,停止开仓交易并清仓
  23.                 {
  24.                         stop = 1;
  25.                         Sell(A_BuyPosition,Q_BidPrice-wtpyl);
  26.                         BuyToCover(A_SellPosition,Q_AskPrice+wtpyl);
  27.                        
  28.                 }Else
  29.                 {
  30.                 //----------------------做多------------------------------

  31.                         if (stop==0&&A_SellPosition>0&&H>H[1])
  32.                                 Buy(jyss,Max(o,H[1]));
  33.                                
  34.                         if (L<L[1] )
  35.                                 if ( A_BuyPosition>0) Sell(A_BuyPosition,Min(o,L[1]));
  36.                 //-------------------------放空-------------------------------

  37.                         if (stop==0&&A_SellPosition==0&&L<L[1])
  38.                                 SellShort(jyss,Min(o,L[1]));
  39.                                
  40.                         if (H>H[1] )
  41.                                 if (A_SellPosition>0) BuyToCover(A_SellPosition,Max(o,H[1]));
  42.                                
  43.                 //-------本Bar结束前2秒撤销所有未成交平仓委托,并加大偏移重发平仓单----
  44.                         if ( K_remaining_time<=2 )
  45.                         {
  46.                                 nCount = A_GetOpenOrderCount;//取得未成交委托数量
  47.                                 if (nCount>0)
  48.                                 {
  49.                                         For i = 1 To nCount
  50.                                         {
  51.                                                 nEntryFlag = A_OrderEntryOrExit(i);//取得第i个未成交单开平类型
  52.                                                 If(nEntryFlag == Enum_Exit())//是平仓单
  53.                                                         A_DeleteOrder(A_OpenOrderContractNo(i));//取得第i个未成交单合同号,并针对该合同号发撤单指令
  54.                                         }
  55.                                
  56.                                         //以现价加大偏移重发平仓单
  57.                                         if (L<L[1]) Sell( A_BuyPosition,c-wtpyl);
  58.                                         if (H>H[1]) BuyToCover( A_SellPosition,c+wtpyl);
  59.                                 }
  60.                         }
  61.                 }
  62.                
  63.         }Else//历史回测
  64.         {
  65.                 //----------------------做多------------------------------

  66.                 if (MarketPosition <>1&&H>H[1])
  67.                         Buy(jyss,Max(o,H[1]));
  68.                        
  69.                 if (MarketPosition==1&&L<L[1] )
  70.                         Sell(0,Min(o,L[1]));
  71.                 //-------------------------放空-------------------------------

  72.                 if (MarketPosition <>-1&&L<L[1])
  73.                         SellShort(jyss,Min(o,L[1]));
  74.                        
  75.                 if (MarketPosition==-1&&H>H[1] )
  76.                         BuyToCover(0,Max(o,H[1]));
  77.                        
  78.                 //出现穿头破脚走势,相应仓位平仓
  79.                 if ( (H>H[1]&&L<L[1]) )
  80.                 {
  81.                         if (c>o&&MarketPosition==-1) BuyToCover(0,H[1]);
  82.                         if (c<o&&MarketPosition==1) Sell(0,L[1]);
  83.                 }
  84.                        

  85.         }
  86.        
  87.                
  88. End
复制代码
投机像山岳一样古老

Rank: 3Rank: 3

精华
0
UID
234307
积分
153
帖子
103
主题
29
阅读权限
40
注册时间
2016-5-12
最后登录
2023-7-26
2#
发表于 2016-6-2 13:39:13 |只看该作者
另外上面代码中有自己写的一个计算收盘剩余时间的用户函数,为方便版主测试也一并放在这里
  1. //------------------------------------------------------------------------
  2. // 简称: K_remaining_time
  3. // 名称: 内盘期货市场实时收盘剩余时间(秒数)
  4. // 类别: 用户函数
  5. // 类型: 用户函数
  6. // 输出: 数值型
  7. //------------------------------------------------------------------------
  8. //只能应用于1、5、15、30、60分钟及日线、周线计算
  9. Params
  10.         Numeric tdrq(0);//节假日调整周收盘日期,例如周4收盘,输入1
  11. Vars
  12.         Numeric bjrq;//当前日期
  13.         Numeric bjsj;//当前时间
  14.         Numeric Kxrq;//K线日期
  15.         Numeric Kxsj;//K线时间
  16.         Numeric Num(0);
  17.         Numeric        chule(9999999999);
  18.        
  19. Begin
  20.         if (BarStatus<>2)
  21.                 Return chule;//当前不是实时K线,返回99999999999

  22.         if (BarStatus==2)
  23.         {
  24.                 bjrq =        CurrentDate;
  25.                 bjsj =        CurrentTime;
  26.                 Kxrq =        Date;
  27.                 Kxsj =        Time;
  28.                
  29.                 if (BarType==1)        //分钟周期计算
  30.                         {
  31.                                 if ( BarInterval==1) //1分钟周期
  32.                                         {
  33.                                                 Num =60-1000000*(bjsj-Kxsj);
  34.                                         }
  35.                                 if ( BarInterval==5) //5分钟周期
  36.                                         {
  37.                                                 Num =4*100+60-1000000*(bjsj-Kxsj);
  38.                                         }
  39.                                 if ( BarInterval==15) //15分钟周期
  40.                                         {
  41.                                                 Num =14*100+60-1000000*(bjsj-Kxsj);
  42.                                         }
  43.                                 if ( BarInterval==30) //30分钟周期
  44.                                         {
  45.                                                 Num =29*100+60-1000000*(bjsj-Kxsj);
  46.                                         }
  47.                                 if (BarInterval==60) //60分钟周期
  48.                                         {
  49.                                                 Num =59*100+60-1000000*(bjsj-Kxsj);
  50.                                         }
  51.                         }
  52.                 if (BarType==0)        //日线周期计算
  53.                 {
  54.                         if (Kxrq==bjrq)        Num        =(0.150000-bjsj)*1000000;//日盘交易时间
  55.                         if (bjsj>0.2100) Num = 777777; //夜盘交易时间
  56.                 }

  57.                 if (BarType==4)        //周线周期计算
  58.                 {
  59.                         if (bjrq-Kxrq-4-tdrq==0)
  60.                         {
  61.                                 Num        =(0.150000-bjsj)*1000000;

  62.                         }Else
  63.                         {
  64.                                 Num = 88888888;
  65.                         }
  66.                 }
  67.         }

  68.         Return Num;
  69. End
复制代码

使用道具 举报

Rank: 10Rank: 10Rank: 10

精华
3
UID
5
积分
26584
帖子
12686
主题
49
阅读权限
200
注册时间
2007-7-20
最后登录
2021-11-3
3#
发表于 2016-6-2 16:21:42 |只看该作者
问题的关键应该在循环那一段。
当然公式加载到图表上,还没有启动自动交易前,A函数的取值 都是无效值 。
此时ncount是一个极大的值。用这个 来进行循环,自然就没法出来了。
多加一些判断条件吧。比如判断帐户函数已经能取到有效值的情况下再对A函数进行一系列的计算及交易吧。

使用道具 举报

Rank: 3Rank: 3

精华
0
UID
234307
积分
153
帖子
103
主题
29
阅读权限
40
注册时间
2016-5-12
最后登录
2023-7-26
4#
发表于 2016-6-2 17:47:03 |只看该作者
小米 发表于 2016-6-2 16:21
问题的关键应该在循环那一段。
当然公式加载到图表上,还没有启动自动交易前,A函数的取值 都是无效值 。
...

谢谢,明白问题可能出在哪里了。

另外上面我自己写的这个时间计算函数,发现有个缺陷,就是用在成交不密集的品种上,比如IF等,在没有新的Tick进来时,时间处于停顿状态。
在我另外的测试程序中,有收盘前几秒钟提前平仓的指令,可是由于时间停顿,常常会出现丢失应有的操作。

有没有直接取本机时钟而与行情无关的办法?

使用道具 举报

Rank: 10Rank: 10Rank: 10

精华
3
UID
5
积分
26584
帖子
12686
主题
49
阅读权限
200
注册时间
2007-7-20
最后登录
2021-11-3
5#
发表于 2016-6-3 08:48:50 |只看该作者
laofu602 发表于 2016-6-2 17:47
谢谢,明白问题可能出在哪里了。

另外上面我自己写的这个时间计算函数,发现有个缺陷,就是用在成交不密 ...

没有看你的函数。。
直接取本机时间用currenttime

使用道具 举报

Rank: 3Rank: 3

精华
0
UID
234307
积分
153
帖子
103
主题
29
阅读权限
40
注册时间
2016-5-12
最后登录
2023-7-26
6#
发表于 2016-6-3 21:43:08 |只看该作者
小米 发表于 2016-6-3 08:48
没有看你的函数。。
直接取本机时间用currenttime

我就是用的currenttime,它在没有tick进来的时候,是不变的。

使用道具 举报

Rank: 10Rank: 10Rank: 10

精华
3
UID
5
积分
26584
帖子
12686
主题
49
阅读权限
200
注册时间
2007-7-20
最后登录
2021-11-3
7#
发表于 2016-6-6 09:01:02 |只看该作者
本帖最后由 小米 于 2016-6-6 09:02 编辑
laofu602 发表于 2016-6-3 21:43
我就是用的currenttime,它在没有tick进来的时候,是不变的。


当然,开拓者的策略是由K线驱动的运算,没有新的数据来,不会再次运算,currenttime自然不会更新。

使用道具 举报

Rank: 3Rank: 3

精华
0
UID
234307
积分
153
帖子
103
主题
29
阅读权限
40
注册时间
2016-5-12
最后登录
2023-7-26
8#
发表于 2016-6-6 15:29:39 |只看该作者
小米 发表于 2016-6-6 09:01
当然,开拓者的策略是由K线驱动的运算,没有新的数据来,不会再次运算,currenttime自然不会更新。 ...

我现在需要的是准时发委托,这对于成交活跃的品种没问题,成交不太活跃的品种就有问题了。例如IF的1分钟K线,总共只有60秒,总不能提前10秒发单吧。所以希望能有一个直接取本机时间的系统函数,就解决问题了。

使用道具 举报

Rank: 10Rank: 10Rank: 10

精华
3
UID
5
积分
26584
帖子
12686
主题
49
阅读权限
200
注册时间
2007-7-20
最后登录
2021-11-3
9#
发表于 2016-6-6 15:34:45 |只看该作者
laofu602 发表于 2016-6-6 15:29
我现在需要的是准时发委托,这对于成交活跃的品种没问题,成交不太活跃的品种就有问题了。例如IF的1分钟K ...

取本机时间的函数就是currentime啊。。。可是仅用这个函数并不能解决问题哟。。。
在您当前的交易需求中,要对不活跃品种进行定时发生委托。。可以尝试在不活跃的合约图表上叠加一个活跃的合约。
以活跃合约的行情来驱动运算就可以实现你的需求了。

使用道具 举报

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

bottom

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

GMT+8, 2024-5-24 05:14

Powered by Discuz! X2 LicensedChrome插件扩展

© 2011-2012 交易开拓者 Inc.

回顶部