设为首页收藏本站

 找回密码
 注册
楼主: efrog
打印 上一主题 下一主题

如何控制每个Bar只操作一次(附程序) [复制链接]

Rank: 5Rank: 5

精华
0
UID
5525
积分
1473
帖子
429
主题
93
阅读权限
60
注册时间
2009-9-22
最后登录
2022-5-23
11#
发表于 2010-11-9 15:06:05 |只看该作者
你列出的结果是历史回测数据,看一下13:58:40以后的输出内容。
上善若水,无欲则刚

使用道具 举报

Rank: 5Rank: 5

精华
0
UID
7593
积分
609
帖子
109
主题
14
阅读权限
60
注册时间
2010-3-19
最后登录
2014-5-18
12#
发表于 2010-11-9 15:16:57 |只看该作者
7# cnbiz850


有时需要在第一个bar初始化变量。
追求卓越,周而复始

使用道具 举报

Rank: 5Rank: 5

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


有时需要在第一个bar初始化变量。
zejunl 发表于 2010-11-9 15:16

不明白12#兄弟的意思,能否详细点说。
上善若水,无欲则刚

使用道具 举报

Rank: 5Rank: 5

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

可以按7#兄弟的程序试一下,但从逻辑上将应该是一样的。
目前的输出很奇怪,有时能控制输出一个,但有的Bar却输出好几个。
看了我们业余爱好者还是不太明白TB的运行机制,能否请管理员出来说说。
以下是下午的测试结果片段:
3023 #1 2010-11-09 13:53:00 13:53:58
3024 #1 2010-11-09 13:54:00 13:54:58
3025 #1 2010-11-09 13:55:00 13:55:58
3026 #1 2010-11-09 13:56:00 13:56:58
3027 #2 2010-11-09 13:57:00 13:56:58
3027 #2 2010-11-09 13:57:00 13:56:59
3027 #1 2010-11-09 13:57:00 13:57:59

3028 #1 2010-11-09 13:58:00 13:58:58
3029 #1 2010-11-09 13:59:00 13:59:58
3030 #1 2010-11-09 14:00:00 14:00:58
3031 #1 2010-11-09 14:01:00 14:01:58
3032 #2 2010-11-09 14:02:00 14:01:58
3032 #2 2010-11-09 14:02:00 14:01:59
3032 #1 2010-11-09 14:02:00 14:02:59

3033 #1 2010-11-09 14:03:00 14:03:59
3034 #1 2010-11-09 14:04:00 14:04:59
3035 #1 2010-11-09 14:05:00 14:05:58
3036 #1 2010-11-09 14:06:00 14:06:58
3037 #1 2010-11-09 14:07:00 14:07:58
3038 #1 2010-11-09 14:08:00 14:08:58
3039 #1 2010-11-09 14:09:00 14:09:58
3040 #2 2010-11-09 14:10:00 14:09:58
3040 #2 2010-11-09 14:10:00 14:09:58
3040 #2 2010-11-09 14:10:00 14:09:59
3040 #2 2010-11-09 14:10:00 14:09:59
3040 #1 2010-11-09 14:10:00 14:10:58

3041 #1 2010-11-09 14:11:00 14:11:59
3042 #1 2010-11-09 14:12:00 14:12:59
3043 #1 2010-11-09 14:13:00 14:13:59
3044 #1 2010-11-09 14:14:00 14:14:59
3045 #1 2010-11-09 14:15:00 14:15:58
3046 #1 2010-11-09 14:16:00 14:16:58
3047 #1 2010-11-09 14:17:00 14:17:59
3048 #1 2010-11-09 14:18:00 14:19:00
3049 #1 2010-11-09 14:19:00 14:19:58
3050 #1 2010-11-09 14:20:00 14:20:58
3051 #2 2010-11-09 14:21:00 14:20:58
3051 #2 2010-11-09 14:21:00 14:20:58
3051 #2 2010-11-09 14:21:00 14:20:59
3051 #1 2010-11-09 14:21:00 14:21:59

3052 #1 2010-11-09 14:22:00 14:22:59
3053 #1 2010-11-09 14:23:00 14:24:01
3054 #1 2010-11-09 14:24:00 14:24:58
3055 #1 2010-11-09 14:25:00 14:25:58
3056 #1 2010-11-09 14:26:00 14:26:58
3057 #1 2010-11-09 14:27:00 14:27:58
3058 #2 2010-11-09 14:28:00 14:27:58
3058 #2 2010-11-09 14:28:00 14:27:58
3058 #2 2010-11-09 14:28:00 14:28:00
3058 #1 2010-11-09 14:28:00 14:28:58

3059 #1 2010-11-09 14:29:00 14:29:58
3060 #1 2010-11-09 14:30:00 14:30:58
3061 #1 2010-11-09 14:31:00 14:31:58
上善若水,无欲则刚

使用道具 举报

Rank: 5Rank: 5

精华
0
UID
5525
积分
1473
帖子
429
主题
93
阅读权限
60
注册时间
2009-9-22
最后登录
2022-5-23
15#
发表于 2010-11-17 13:13:56 |只看该作者
我估计是我对CurrentBar的理解有错,或者TB的运行机制我还不了解,所以用公共变量保存CurrentBar来控制每个Bar只发一次单的测试失败了。
不过我尝试了用公共变量记录Time的时分钟值,确保1分钟周期内,只输出一条记录。
测试程序如下:
Begin
        // 控制每个Bar仅执行一次
        If (Date!=Date[1]) SetGlobalVar(48,IntPart(Time*10000)-1);
        If (IntPart(Time*10000)>GetGlobalVar(48))
        {        SetGlobalVar(48,IntPart(Time*10000));
                FileAppend("C:\\Test6.Log",Text(CurrentBar)+" #"+Text(BarStatus)+" "+DateToString(Date)+" "+TimeToString(Time)+" "+TimeToString(CurrentTime)+" "+Text(IntPart(Time*10000)));
        }
End
上善若水,无欲则刚

使用道具 举报

Rank: 5Rank: 5

精华
0
UID
5525
积分
1473
帖子
429
主题
93
阅读权限
60
注册时间
2009-9-22
最后登录
2022-5-23
16#
发表于 2010-11-17 13:15:19 |只看该作者
3116 #2 2010-11-17 11:11:00 11:11:01 1111
3117 #2 2010-11-17 11:12:00 11:12:01 1112
3118 #2 2010-11-17 11:13:00 11:13:01 1113
3119 #2 2010-11-17 11:14:00 11:14:01 1114
3120 #2 2010-11-17 11:15:00 11:15:01 1115
3121 #2 2010-11-17 11:16:00 11:16:01 1116
3122 #2 2010-11-17 11:17:00 11:17:01 1117
3123 #2 2010-11-17 11:18:00 11:18:02 1118
3124 #2 2010-11-17 11:19:00 11:19:02 1119
3125 #2 2010-11-17 11:20:00 11:20:01 1120
3126 #2 2010-11-17 11:21:00 11:21:01 1121
3127 #2 2010-11-17 11:22:00 11:22:01 1122
3128 #2 2010-11-17 11:23:00 11:23:01 1123
3129 #2 2010-11-17 11:24:00 11:24:02 1124
3130 #2 2010-11-17 11:25:00 11:25:01 1125
3131 #2 2010-11-17 11:26:00 11:26:01 1126
3132 #2 2010-11-17 11:27:00 11:27:01 1127
3133 #2 2010-11-17 11:28:00 11:28:01 1128
3134 #2 2010-11-17 11:29:00 11:29:01 1129
上善若水,无欲则刚

使用道具 举报

Rank: 7Rank: 7Rank: 7

精华
0
UID
8209
积分
3268
帖子
413
主题
78
阅读权限
80
注册时间
2010-4-6
最后登录
2013-3-18
17#
发表于 2010-11-17 13:28:39 |只看该作者
多谢告知。

使用道具 举报

Rank: 3Rank: 3

精华
0
UID
19764
积分
163
帖子
18
主题
2
阅读权限
40
注册时间
2010-11-16
最后登录
2019-6-21
18#
发表于 2010-11-18 13:35:40 |只看该作者
我拿去试下

使用道具 举报

Rank: 5Rank: 5

精华
0
UID
19913
积分
634
帖子
92
主题
13
阅读权限
60
注册时间
2010-11-18
最后登录
2013-12-25
19#
发表于 2010-11-20 11:05:43 |只看该作者
CurrentBar
说明        当前公式应用商品在当前Bar的索引值。
语法        Integer CurrentBar()
参数        无
备注        当前公式应用商品当前Bar的索引值,第一个Bar返回值为0,以下其他Bar递增。
示例        无

这是CurrentBar()的介绍 按道理来说不会出现楼主的那种情况的说

使用道具 举报

Rank: 5Rank: 5

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

CurrentBar实际运行下来还是有问题。
我在实际使用中的情况是这样,开仓后我把开仓时的CurrenBar记录在公共变量GV36中,然后当下次开仓条件myEntryCon满足时,判断CurrentBar-GetGlobalVar(36)>1 ,若同时满足才运行开仓,然后再更新记录SetGloblVar(36,CurrentBar);
但开仓记录表明同一个Bar内,还会还会发生开仓平仓几次。按上述红色的条件,不可能发生同一个Bar内再次开仓情况。
当然我还是用了另一个公共变量GV32来保持当前的仓位,确保只能在空仓时开仓,平仓时有仓位。
另外,我也控制了万一网络中断导致程序从Bar==0开始运行的情况,在If (BarStatus==0 && GetGlobalVar(32)==InvalidNumeric) 中加了屏蔽条件,其他的程序都在 If (BarStatus==2)的情况下执行,也就是说没有历史回测的数据影响GV36的情况。
我真的没有办法了。CurrentBar,罢了!
上善若水,无欲则刚

使用道具 举报

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

bottom

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

GMT+8, 2024-5-22 06:12

Powered by Discuz! X2 LicensedChrome插件扩展

© 2011-2012 交易开拓者 Inc.

回顶部