以文本方式查看主题 - 金字塔客服中心 - 专业程序化交易软件提供商 (http://weistock.com/bbs/index.asp) -- 公式模型编写问题提交 (http://weistock.com/bbs/list.asp?boardid=4) ---- 关于变量执行顺序的问题 (http://weistock.com/bbs/dispbbs.asp?boardid=4&id=137784) |
-- 作者:QQ56048933 -- 发布时间:2016/8/10 9:40:36 -- 关于变量执行顺序的问题 if 变量=0 then begin 执行语句; 变量:=1; end 我在这种情况下执行语句一直执行,因此说明变量并没有被付值为1; 然而当我把程序改成这样: if 变量=0 then begin 执行语句; end if 变量=0 then 变量:=1; 变量就直接变成了1,按理说如果程序按从上往下顺序执行的话,应该执行语句执行了一次,然后变量=1,然后语句不再执行了,而这种情况语句一次也不执行了,而不是执行了一次。 最后,我想实现的是语句执行了一次然后就不执行了,我是后台程序 |
-- 作者:QQ56048933 -- 发布时间:2016/8/10 9:54:14 -- 另外,我用 变量=0 和变量:=1 这样判断或者付值才是我的本意,而不是用EXTGBDATA(\'变量\' )=0 和EXTGBDATASET( \'变量\',1); 因为考虑到EXTGBDATA和EXTGBDATASET一直保存着变量的值就算程序停止,而我想要的是每次重新打开程序都初始化,不要原先保存的变量值
|
-- 作者:jinzhe -- 发布时间:2016/8/10 9:59:56 -- 把能证明上面结论的调试发一下 |
-- 作者:QQ56048933 -- 发布时间:2016/8/10 10:17:51 -- 不好意思,这个我也感觉到奇怪,我怀疑是extgbdata储存了“之前”数据的问题,我有时候是可以执行的有时候是不行的,我现在执行是又不行了,所以没法发给你证明 我还是贴代码吧: (1) 变量shit, if extgbdata(\'shit\')=0 then begin//if shit=0 then begin TBUY(1,entrysize,mkt);//后台,通过虚拟持仓开仓 end if extgbdata(\'shit\')=0 then EXTGBDATASET( \'shit\',1); 在这种情况下,TBUY语句是没有执行的 (2)然而,这种情况: if extgbdata(\'shit\')=0 then begin//if shit=0 then begin //TBUY(1,entrysize,mkt); end if extgbdata(\'shit\')=0 then EXTGBDATASET( \'shit\',1); if extgbdata(\'shit\')=1 then TBUY(1,entrysize,mkt); 这种情况,TBUY是执行的,成交了,说明了shit的确变成了1 (3)这种情况,变量shit应该变成1之前Tbuy要执行一次才对,可是tbuy没有执行 if extgbdata(\'shit\')=0 then begin//if shit=0 then begin TBUY(1,entrysize,mkt); end if extgbdata(\'shit\')=0 then EXTGBDATASET( \'shit\',1); 最后重申,我的目的是:tbuy执行一次,之后变量shit变成1,于是条件不符合,然后tbuy就一直不执行了 |
-- 作者:jinzhe -- 发布时间:2016/8/10 10:32:08 -- 那么在之前shit被赋值过吗? 你在工具 数据管理 全局变量 里面清空下试试看 |
-- 作者:QQ56048933 -- 发布时间:2016/8/10 10:56:43 -- variable:shit=0,被初始化为0,数据管理里清空了无论是停止还是执行,还是停止以后再清空shit都是1, 在这种情况下: if shit=0 then begin TBUY(1,entrysize,mkt); end if shit=0 then shit:=1; 理应是shit=0先执行一次才变成1的,可是shit初始的时候就是1,清空也是1,我变量是这么初始的:variable:shit=0; |
-- 作者:QQ56048933 -- 发布时间:2016/8/10 11:04:55 -- 会不会是程序有时候是默认先执行一些变量赋值的语句再执行开仓语句的呢,比如,所有TBUY这种开仓语句都是放在周期结束,也就是程序最后才执行的,于是 当shit变了,tbuy就不执行了,我觉得这种可能性较大; 我今天问这些问题的由来是昨天我想获得当前策略的图表持仓,而不是账户持仓,因为我多策略执行,但由于是后台,所以holding没法获得图表持仓, 于是我考虑用变量来作为开仓平仓条件,在开仓语句的时候把变量重新赋值,这样仓位开了,变量也变了就不会再执行了。 虽然变量变化的时候严格来说并不代表仓位已经开了,或者说单子发出去并且成交了,但是反过来,我要怎么知道单子成交了呢?那还不是要获得持仓的状况吗, 这样的话图表持仓又是不可用的,账户持仓更不行(因为别的策略也在开仓),那我该怎么做呢? 如果开仓语句,也就是单子,系统都是有意放在循环结束,也就是程序最后才考虑执行的,那么我变量改变了也没有意义了,那么,我是不是只能用多账户执行多策略了呢? 用多账户策略一一对应,这样获取的真实持仓就不互相影响了
|
-- 作者:jinzhe -- 发布时间:2016/8/10 11:16:04 -- 还没找出问题,用户不要先下结论,程序代码是从上计算到下的,你这样想,需要用debugout这样的调试函数来调试,不能光靠看的
variable是图表的全局变量,后台用globalvariable或者extgbdata。 你先用globalvariable试试看
上面extgbdata的问题,用户按照我讲的试过了吗? [此贴子已经被作者于2016-8-10 11:16:45编辑过]
|
-- 作者:QQ56048933 -- 发布时间:2016/8/10 11:28:05 -- 解决了,原来就是一个globalvariable的问题 但是又出了新的问题,我3个一模一样对应品种也一模一样的策略(代码变量都一样), 我开始执行,先勾选其中一个,策略执行1次,是对的。 但是当我勾选第二个策略的时候,第一个策略被多重新执行了1次(又开仓了,证明所有东西都又初始化了), 这时候策略1执行2次,策略2执行1次,总共3次 当我再勾选第三个策略执行的时候,之前的两个策略又分别都重新执行了一次,这时候策略1执行3次,2两次,3执行1次 这个是什么问题呢,是不是策略一样所以互相干扰了,我是不是应该把同一策略用不同命名,或者变量都换了,结构不变呢
|
-- 作者:jinzhe -- 发布时间:2016/8/10 11:31:19 -- 这个属于开关策略了,关闭交易再启动会重置globalvariable的变量的。和extgbdata会保存是不一样的 |