开拓者期货期权程序化系统交易论坛

标题: 几个问题 [打印本页]

作者: 轮回    时间: 2007-8-10 16:53:03     标题: 几个问题

1.编译消息提示"Left"没有被声明.
2.参数优化时,理论上应到最大值(或者)+最小变动时停止,但现在是最大值+最小值+最小变动才停止.
3.变量在使用后,没有重新赋值前应保持原值,现在为0.
4.建议增加一个初始化函数,这个函数只在程序启动时运行一次,并保存程序中用到的变量值,这样可以大大提高程序处理速度.
作者: tradeblazer    时间: 2007-8-10 17:12:06

原帖由 轮回 于 2007-8-10 16:53 发表
1.编译消息提示"Left"没有被声明.
2.参数优化时,理论上应到最大值(或者)+最小变动时停止,但现在是最大值+最小值+最小变动才停止.
3.变量在使用后,没有重新赋值前应保持原值,现在为0.
4.建议增加一个初始化函数,这个 ...


1、Left没有被声明的问题,应该是旧版本文件没有删掉。您删除掉安装目录xiaUser目录(会清掉您的工作区,公式等文件,请先备份),再重新登录试试!
2、不太明白您的意思,可否举例说明一下?
3、看来你是用过TradeStation的公式的,变量定义时不填写初始值,会默认初始化0,每个Bar都是这样。
这和TradeStation的变量一直保持有所不同,如果你需要在当前Bar用以前Bar的值,用 变量名[nOffset]来获取。
4、其实有这样类似的函数,看看GetGlobalVar和SetGlobalVar。
作者: 轮回    时间: 2007-8-11 23:54:09

1.第1个问题已解决.
2.参数优化时,假设设定最小值为1,最大值为3,步长0.1,那么应该从1到3优化计20次就够了,但现在要优化30次.所以建议大于3时停止优化.
3."如果你需要在当前Bar用以前Bar的值,用 变量名[nOffset]来获取"。庞大的数组序列会消耗很大的资源和速度.没有实用价值.
4.在BEGIN-END程序内的函数每周都是会执行的.用GetGlobalVar和SetGlobalVar好象不能实现只运行一次的要求.举例来说,假设我在交易指令里需要频繁使用5个变量,而这5个变量是根据以往数据经过复杂运算得出(如系数等),由于运算需要较长时间,且一旦算出就暂时不会更改,那么就只要在程序开始运行时执行一次就够了,同时也没有必要使用极耗资源的变量序列(长度=5*BAR),因此我觉得若有一个Init()函数会提供很大的方便.
作者: tradeblazer    时间: 2007-8-12 11:45:01

1、关于参数优化,好像步长设置为小数有这种问题,您暂时可以用整数来代替。下次升级会修改这个问题的。
2、变量是在当前周期有效,序列变量是在所有周期有效,要满足您的需求,只好用序列变量。如果觉得序列变量会耗费资源,其实也可以用全局变量[GetGlobalVar和SetGlobalVar函数]来进行转换,我们和TradeStation的实现机制不同,所以这个功能没办法兼容。
3、关于每个周期执行SetGlobalVar和GetGlobalVar的问题,其实很好解决。
在您的技术分析或交易指令里面写以下代码:
  1. If(CurrentBar==0)
  2. {
  3.     Init();
  4. }
复制代码

然后新建一个用户函数:Init。在Init内部就可以实现您的算法了。
作者: 轮回    时间: 2007-8-12 12:50:52

我现在就是用上面判断CurrentBar的办法,看来想省略每次都判断还不行.
即使用序列变量也要不停的赋前值才有效.因为在很多情况下[nOffset]是不方便计算的.
作者: nopain    时间: 2007-8-12 13:16:02

原帖由 轮回 于 2007-8-12 12:50 发表
我现在就是用上面判断CurrentBar的办法,看来想省略每次都判断还不行.
即使用序列变量也要不停的赋前值才有效.因为在很多情况下[nOffset]是不方便计算的. ...


1、这个判断的时间很短的,不会影响效率。
2、序列变量的机制就是这样,用XXX[nOffset]的方式来取值速度也比较快,是直接定位,也不会影响运算速度。




欢迎光临 开拓者期货期权程序化系统交易论坛 (http://bbs.tb18.net/) Powered by Discuz! X2