benyip 发表于 2013-4-16 16:43:10

有关变量,执行模式,交易函数的相关问题

以下讨论涉及的是在实时行情的情况,未考量历史数据下的输出情况(历史数据另文讨论)

技术指标和策略各自的设定,是各自默认模式加上设定,反映的是同种需要,既要当前K前面的K为逐

根计算,又要在当前K里的tick触发公式运行。

以下为单值变量的讨论,未涉及定位为序列变量的情况。

1.技术指标
  #run_by_bar
a.会新K的第一笔tick来到时,执行一次公式。
b.然后因为tick触发会再执行一次公式。

举例 定义了单值变量 A;公式里包含里修改A值的语句;
假设按照公式的逻辑是A对应值是(周期1分钟)
14:00:00 A为8,
14:01:00 A为9,
14:02:00 A为10,
14:03:00 A为11。
以下是日志:

14:01:59 A=8;
14:01:59 A=8;
14:02:00 A=8;<--- Time=140100
14:02:00 A=9;<--- Time=140200
14:02:00 A=9;<--- Time=140200
14:02:01 A=9;
14:02:01 A=9;
14:02:02 A=9;
14:02:02 A=9;

分析:
  1.第一个箭头:为上面a.所说,Time符合run_by_bay的逻辑,A值不符合
  2.第二个箭头:为上面b.所说,Time符合tick的逻辑,A值不符合(为上一K的的数值,按理因为   

    10,这也是导致第一箭头A值不正确的原因)
  3.第三个箭头:同第二个箭头(取材指数期货,每秒两tick,如果正常来说就算第二个箭头或者因为  

  执行流程的顺序导致没有赋值正确,这时A值按理应该为10)

2.策略
  #Run_Every_Tick
  情况同上。

总括和猜测:
   根据以上分析和没在这里例举的其他几种模式的分析,猜测软件底层关于运行模式执行的大概流程



   外循环 (run_by_bar) begin
      。。。。;
      执行公式;
      下标移位;(内置的序列移位,像high,low,time等,因未讨论序列变量,未知序列变量是否同  

                     时移位)
       。。。。;
       内循环(tick) begin
          。。。。;
          执行公式;
          。。。。;
       end;
       。。。。;
    end;

    但是通过以上的日志跟踪和分析,发现的是在内循环里公式执行了,但是变量的值并没有保存新值



以上的有关变量的分析,引出的问题是:

1.在每新K开始的第一刻,公式执行了两次。(技术指标采用默认模式,却不会执行两次,只是变量被

  重新初始化为0,对于变量来说这是符合逐行模式的逻辑)
   如果在策略里符合开仓条件哪不是开了两次仓?(当然可以说通过控制开仓数量防止)
  无论怎样,都觉得不符合逻辑。
2.不明白为何逐根加tick,为何既然tick触发了公式,变量值保存不了,只在逐根触发,除非是软件的  

执行逻辑的原因,又或者除非是定义里单值变量其实还是默认为序列(在我其他帖子,技术人员回答

了单值变量不是序列的),而且没有执行移位,或者移位了,但是引用的时候却没有对应正确。

========================================================

交易类函数的问题:

前面N根K,当前是第N+1根K的第一笔tick来到时,
1.OB_NextBar: 是指在N+2根周期内执行吗?
2.OB_ThisBar : 是指在N+1根周期内执行吗?3.OB_ThisBar除了和OT_Close组合,能否其他委托

类型组合吗?

如果执行OB_ThisBar和能结合其他委托类型,和符合2.定义,看其他帖子技术管理人员的回答,要加

run_every_tick,那对应上面有关变量的分析,如果变量涉及交易函数执行的判断时,不是会出现问

题吗?

解决办法之一:

应该是改成像技术指标默认方式下在日志里显示出的公式执行流程(那是符合想表现的逻辑),只是

因为逐根的逻辑不要重新初化变量就行。

再次说明,以上讨论不涉及盘后,历史数据下的表现是否正确。

解决办法之二:

公式编写控制好(暂时没想到如何去做)

John 发表于 2013-4-16 21:10:02

回答一下变量赋值的问题,变量在每一根K线只保留一个值,初始值就是前一根的值。记忆性是记忆上一根的值,而不是上次执行的值。每一个tick触发执行时,首先把变量恢复前一根的值作为初始值。
如果要每一个tick都记录变量的值,可以使用全局变量SetGlobalVar/GetGlobalVar

John 发表于 2013-4-16 21:18:28

在Run_every_Bar的模式下,“前面N根K,当前是第N+1根K的第一笔tick来到时”,运行的是第 N 根K线,open[-1] 取得 N+1根的开盘价(N+1根只能取得开盘价),open 是第N根(当前根)的开盘价,open 是第 N-1 根的。 ob_nextbar 成交在第 N+1 根。
Run_every_Tick模式下,“前面N根K,当前是第N+1根K的第一笔tick来到时”,运行的是第N+1根K线,后续tick也是运行在N+1,直到N+2根k线的第一个tick到来。ob_thisbar成交在 n+1 根。

ob_thisbar 只能用 ot_market 组合,就是市价单,不能使用 ot_limit 和 ot_stop 单,因为ob_thisbar是配合 run_every_tick来运行的,就是说每个tick都会运行,所以limit单可以写成 if close < myPrice then buy this bar market;stop单可以写成 if close > myprice then buy this bar market

benyip 发表于 2013-4-17 12:57:58

John 发表于 2013-4-16 21:10 static/image/common/back.gif
回答一下变量赋值的问题,变量在每一根K线只保留一个值,初始值就是前一根的值。记忆性是记忆上一根的值, ...

仁心慧能大大 在我的数组、变量的定义问题
http://www.hs633.com/forum.php?mod=viewthread&tid=6941&fromuid=9025
的回答:

1、array:A(0);
2、VARIABLE(或VARIABLES):A(0);
2种定义相同,第2种定义是为了兼容老飞狐。
A 是整个K线序列只有一个11个元素的数组,下标从0-10

variable:
  NumericSimple SN(90),
  V1(0), V2(0);
例如这样定义,SN是单值变量,不占内存,而V1、V2是序列变量。
根据需要定义成  NumericSimple,可以节约资源,提高效率。
序列变量其实可兼容单值型变量,所以默认是序列变量

我举的例子是定义成NumericSimple ,按您的回答所说,NumericSimple 定义不还是序列变量?
另外在Mt4里的公式,类似做法这样的局部变量,作用范围在当前公式都有效的,设全局变量是跨公式的。

另外关于逐根模式加run_every_tick,像前面所说那样,应该将新k第一笔tick判断一下,将公式执行合并一下,因为根据您关于变量的解释,如果自己写程序控制就很麻烦,或者应该像Mt4关于变量的作用范围那样做(如果内部机制像仁心慧能所说的话,但是按您的解释,是序列作用,而且引用的机制不同,就算记忆性,变量的意思,应该像其他内置序列,如time,high等,不然也不叫变量了,非实时)

benyip 发表于 2013-4-17 13:24:21

明白金魔方逐根的处理的方式,简化了某些编写的难度,不像mt4完全微观的处理,编写起来复杂很多。
但偏偏很多策略的逻辑却涉及微观,而金魔方在运行模式上宏观、微观都有,不过在宏观和微观的转换处,处理不是很符合自然的逻辑,不然公式不会执行两次了。而且关于变量赋值的做法也不是很符合”变量“这个意思和作用范围。

John 发表于 2013-4-18 11:22:20

是的,谢谢您的建议,我们将不断打磨。

benyip 发表于 2013-4-18 15:02:48

对于逐根加tick的模式,经过验证,只能把单值变量放进一个自定义的数组里,才能保证在tick时变量的值跟策略的逻辑的对应值相一致。

jazzson 发表于 2013-4-22 06:52:06

John 发表于 2013-4-16 21:10 static/image/common/back.gif
回答一下变量赋值的问题,变量在每一根K线只保留一个值,初始值就是前一根的值。记忆性是记忆上一根的值, ...

John ,如你所说,在Every_tick + By_bar 的模式下,记忆性是记忆上一根的值,而不是上一次的值。

那么,当一根新bar 创建的时候,初始化时候使用的上一根Bar 值,现在理解,难道不就是bar 最后一个tick 所记录的值吗?难道每个tick 执行的时候,都不能保留的?

jazzson 发表于 2013-4-22 06:56:06

benyip 发表于 2013-4-18 15:02 static/image/common/back.gif
对于逐根加tick的模式,经过验证,只能把单值变量放进一个自定义的数组里,才能保证在tick时变量的值跟策略 ...

benyip 能否说说一下?
我之所以迁移平台,也是因为TB 在执行时候,不能记录变量运行状态。比如我需要记录实盘仓位,就得用globalvar 来记录,不断的读入、加载,平空增加了程序的编码和复杂度。 程序的运行状态记录,就应该是平台提供的一个功能,难道金魔方也是和TB 一样的?
如果这样,就要让人崩溃了

John 发表于 2013-4-22 10:27:18

谢谢您的反映,目前是只记录上一个bar 的变量。
run_every_tick 的时候记录上一个tick的状态,run_every_bar记录上一个bar的状态,
这也是合理的,不过需要通过barpos判断是否新K线,否则很多指标没法算。
我们需要调研保存上一个tick变量的机制。再次感谢您的建议。
页: [1] 2
查看完整版本: 有关变量,执行模式,交易函数的相关问题