以文本方式查看主题 - 金字塔客服中心 - 专业程序化交易软件提供商 (http://weistock.com/bbs/index.asp) -- 公式模型编写问题提交 (http://weistock.com/bbs/list.asp?boardid=4) ---- [求助]想提高运行效率,是否应该用循环? (http://weistock.com/bbs/dispbbs.asp?boardid=4&id=169048) |
-- 作者:wonggoo -- 发布时间:2019/3/28 17:04:50 -- [求助]想提高运行效率,是否应该用循环? 因为自定义的变量很多,所以挑出了几个容易判断的变量,比如:①C>O;②C>MA60 and C>MA20;③C>Last_H; 想写成: 1、先判断①是否成立,如果①不成立,则返回最开始,重新判断①是否成立,直到①成立 2、①成立后,才能判断②是否成立,如果②不成立,则返回最开始,重新判断①是否成立(这个算是循环吧); 3、②成立后,才能判断③是否成立,如果③不成立,则返回最开始,重新判断①是否成立; 请教老师,以上条件应该怎么写?这样的逻辑是不是能提升运行效率,谢谢!
|
-- 作者:wonggoo -- 发布时间:2019/3/28 17:22:05 -- 追加一个问题: 上面的条件①不满足时,返回重新判断条件①,按照刚才的思路,公式里后面所有的代码是否就不在运行了,也就是当条件①没有达成时,实际运行的代码,只在判断条件①的前几行代码打转?还是仍然要把后续的代码全部过一遍,才又回到公式的第一行代码?
|
-- 作者:FireScript -- 发布时间:2019/3/29 8:56:35 -- “先判断①是否成立,如果①不成立,则返回最开始,重新判断①是否成立,直到①成立” 返回最开始,重新判断这个是什么逻辑,简单说明下吧。 |
-- 作者:wonggoo -- 发布时间:2019/3/30 9:00:55 -- 假设代码是这样的: ============================================ 1行 AA:=Close>Open; 2行 MA60:=ma(C,60); 3行 BB:=Close>MA60; 4 行if XXX then begin 5行 XXXXXXXXXXXX 6行 XXXXXXXXXXXX ..行 XXXXXXXXXXXX(假设此处很多行代码,得到变量C,且这是行代码大量引用其他指标数据,因此运行效率相对低) ..行 XXXXXXXXXXXX 100行 XXXXXXXXXXXX 101行 end 102行 Last_H:=XXX; 103行 CC:=Close>Last_H; 104行 Open_Cond:AA and BB and CC and DD and EE and FF;//开仓条件 ================================================================ 假设做本地预警,标的有500只股票,固定轮询模式(假设30秒询一次),每30秒都要把上述104行代码从上到下运行一遍的话,效率很低; 想实现的是: 1、判断第1行 AA:=Close>Open是否成立; 如果不成立,就不再运行后面的代码,始终只判断AA是否成立,直到AA成立; 2、如果AA成立了,则继续往下运行,第2、3行代码,判断BB是否成立,如果不成立,就不再运行后面的代码,返回判断AA(代码的最开始); 3、如果BB成立了(BB成立,一定是AA也成立了),则继续往下运行后面的代码,第4-104行代码判断CC是否成立,如果不成立,就不再运行后面的代码(也就是不判断Open_Cond),返回判断AA(代码的最开始); 4、如果CC成立了,则判断Open_Cond是否成立 ,如果Open_Cond不成立(这里不返回从AA开始判断),继续判断 Open_Cond;除非出现CC不成立,则返回判断AA; 我猜想的是,如果500个预警标的,30秒轮询,其中有450只都不满足AA,则这450只始终只在运行判断第1行条件;而剩下50只标的,有40只不满足BB,也变成返回只判断运行第1行条件;最后只剩下10只标的,会每30秒都把所有代码运行一遍,这样效率就高了。总的来时,就是500个标的里,绝大部分都只运行了代码的很小一部分,很少标的运行大部分代码。 就想实现这个怎么写,谢谢老师,我是个小白,不知道描述清楚没?
|
-- 作者:wonggoo -- 发布时间:2019/3/30 9:01:32 -- 假设代码是这样的: ============================================ 1行 AA:=Close>Open; 2行 MA60:=ma(C,60); 3行 BB:=Close>MA60; 4 行if XXX then begin 5行 XXXXXXXXXXXX 6行 XXXXXXXXXXXX ..行 XXXXXXXXXXXX(假设此处很多行代码,得到变量C,且这是行代码大量引用其他指标数据,因此运行效率相对低) ..行 XXXXXXXXXXXX 100行 XXXXXXXXXXXX 101行 end 102行 Last_H:=XXX; 103行 CC:=Close>Last_H; 104行 Open_Cond:AA and BB and CC and DD and EE and FF;//开仓条件 ================================================================ 假设做本地预警,标的有500只股票,固定轮询模式(假设30秒询一次),每30秒都要把上述104行代码从上到下运行一遍的话,效率很低; 想实现的是: 1、判断第1行 AA:=Close>Open是否成立; 如果不成立,就不再运行后面的代码,始终只判断AA是否成立,直到AA成立; 2、如果AA成立了,则继续往下运行,第2、3行代码,判断BB是否成立,如果不成立,就不再运行后面的代码,返回判断AA(代码的最开始); 3、如果BB成立了(BB成立,一定是AA也成立了),则继续往下运行后面的代码,第4-104行代码判断CC是否成立,如果不成立,就不再运行后面的代码(也就是不判断Open_Cond),返回判断AA(代码的最开始); 4、如果CC成立了,则判断Open_Cond是否成立 ,如果Open_Cond不成立(这里不返回从AA开始判断),继续判断 Open_Cond;除非出现CC不成立,则返回判断AA; 我猜想的是,如果500个预警标的,30秒轮询,其中有450只都不满足AA,则这450只始终只在运行判断第1行条件;而剩下50只标的,有40只不满足BB,也变成返回只判断运行第1行条件;最后只剩下10只标的,会每30秒都把所有代码运行一遍,这样效率就高了。总的来时,就是500个标的里,绝大部分都只运行了代码的很小一部分,很少标的运行大部分代码。 就想实现这个怎么写,谢谢老师,我是个小白,不知道描述清楚没?
|
-- 作者:wonggoo -- 发布时间:2019/3/30 9:09:23 -- 以下是引用FireScript在2019/3/29 8:56:35的发言: “先判断①是否成立,如果①不成立,则返回最开始,重新判断①是否成立,直到①成立” 返回最开始,重新判断这个是什么逻辑,简单说明下吧。 假设代码是这样的: ============================================ 1行 AA:=Close>Open; 2行 MA60:=ma(C,60); 3行 BB:=Close>MA60; 4 行if XXX then begin 5行 XXXXXXXXXXXX 6行 XXXXXXXXXXXX ..行 XXXXXXXXXXXX(假设此处很多行代码,得到变量C,且这是行代码大量引用其他指标数据,因此运行效率相对低) ..行 XXXXXXXXXXXX 100行 XXXXXXXXXXXX 101行 end 102行 Last_H:=XXX; 103行 CC:=Close>Last_H; 104行 Open_Cond:AA and BB and CC and DD and EE and FF;//开仓条件 ================================================================ 假设做本地预警,标的有500只股票,固定轮询模式(假设30秒询一次),每30秒都要把上述104行代码从上到下运行一遍的话,效率很低; 想实现的是: 1、判断第1行 AA:=Close>Open是否成立; 如果不成立,就不再运行后面的代码,始终只判断AA是否成立,直到AA成立; 2、如果AA成立了,则继续往下运行,第2、3行代码,判断BB是否成立,如果不成立,就不再运行后面的代码,返回判断AA(代码的最开始); 3、如果BB成立了(BB成立,一定是AA也成立了),则继续往下运行后面的代码,第4-104行代码判断CC是否成立,如果不成立,就不再运行后面的代码(也就是不判断Open_Cond),返回判断AA(代码的最开始); 4、如果CC成立了,则判断Open_Cond是否成立 ,如果Open_Cond不成立(这里不返回从AA开始判断),继续判断 Open_Cond;除非出现CC不成立,则返回判断AA; 我猜想的是,如果500个预警标的,30秒轮询,其中有450只都不满足AA,则这450只始终只在运行判断第1行条件;而剩下50只标的,有40只不满足BB,也变成返回只判断运行第1行条件;最后只剩下10只标的,会每30秒都把所有代码运行一遍,这样效率就高了。总的来时,就是500个标的里,绝大部分都只运行了代码的很小一部分,很少标的运行大部分代码。 就想实现这个怎么写,谢谢老师,我是个小白,不知道描述清楚没? |
-- 作者:FireScript -- 发布时间:2019/4/1 9:47:49 -- 我明白你的意思了。AA BB CC 如果AA不成立后面不再进行判断,直到AA成立是吗? AA:=Close>Open; if aa then begin MA60:=ma(C,60); BB:=Close>MA60; if bb then begin ..... end end 可以这样把这个条件放在后面代码的外部嵌套下。
|
-- 作者:wonggoo -- 发布时间:2019/4/1 19:53:18 -- 回复:(FireScript) 我明白你的意思了。AA&nbs... 明白了,老师,谢谢你! 我还发了另一个问题,麻烦老师也解答一下 =================================== 创建的自定义板块指数,只有日线级别可以正常显示大量历史K线; 分钟级别的只能显示当日的K线 求教自定义板块指数,如何加载历史上的所有分钟级别的K线?比如5分钟级别的。 |
-- 作者:FireScript -- 发布时间:2019/4/2 9:49:04 -- 这个版块指数其他周期只能分笔数据生成,你本地如果没有分笔数据那是不行的。 |
-- 作者:wonggoo -- 发布时间:2019/4/2 17:03:46 -- 回复:(FireScript) 这个版块指数其他周期只能... 哦,知道了,谢谢! |