以文本方式查看主题 - 金字塔客服中心 - 专业程序化交易软件提供商 (http://weistock.com/bbs/index.asp) -- 公式模型编写问题提交 (http://weistock.com/bbs/list.asp?boardid=4) ---- 有关全局变量使用的几个困惑 (http://weistock.com/bbs/dispbbs.asp?boardid=4&id=64823) |
-- 作者:滚雪球 -- 发布时间:2014/5/9 10:37:47 -- 有关全局变量使用的几个困惑 一开始在图表交易系统使用VARIABLE来作为全局变量,后来改成了后台轮询,发现VARIABLE定义的全局变量不行了,每次都被初始化成了0, 网上查了一下说后台要使用EXTGBDATA,EXTGBDATASET来取值赋值,改了一下正常了。看了编译时的警告帖子 http://www.weistock.com/bbs/dispbbs.asp?boardid=10&Id=48570 貌似不太推荐使用这种方式,推荐使用GLOBALVARIABLE, 由于后台没法评测,我就在图表系统下将VARIABLE改成GLOBALVARIABLE试了一下,发现改了之后彻底失效,我的程序大概是这样 (逐K线,仅刷最后一根K线运行) VARIABLE:MAXWIN=0; //GLOBALVARIABLE:MAXWIN=0; .... IF MAXWIN<WIN THEN BEGIN
MAXWIN:=WIN; END 使用MAXWIN记录开仓以来的最大盈利,WIN表示当前盈利,如果当前盈利大于之前的最大盈利就给MAXWIN赋一个新值 现在的问题是: 1. VARIABLE和GLOBALVARIABLE到底什么区别?为什么VARIABLE工作正常的用GLOBALVARIABLE就不能正常工作? 2. 后台程序编译的时候金字塔也没有提示说VARIABLE不能用,那VARIABLE到底能不能用于后台,轮询? 到底是是因为后台还是因为轮询影响了VARIABLE的正常工作? 3. EXTGBDATA,EXTGBDATASET我看到有两种使用形势,一种就是 EXTGBDATA(\'MAXWIN\'),这种变量名加了单引号,貌似无需 申明就可以直接使用,还有一种方式是EXTGBDATA(MAXWIN),没有单引号,之前要给MAXWIN:=xxx赋值,相当于隐性的申明了一下, 如果不这样隐性的申明是否需要使用VARIABLE:MAXWIN=0 这样来申明?这些帮助文件里面也没写。 4. GLOBALVARIABLE和EXTGBDATA,EXTGBDATASET说是运行效果一样,但我在评测的时候试了一下GLOBALVARIABLE不能正常工作 因此没进一步研究,但EXTGBDATA,EXTGBDATASET运行正常,我感觉这两者好像并不一样。我想问GLOBALVARIABLE是专用于后台吗? |
-- 作者:lichenghu -- 发布时间:2014/5/9 10:56:02 -- http://www.weistock.com/WeisoftHelp/zbgs003.htm 看下全局变量说明
2,后台是只刷新最新的K线,所以VARIABLE定义的全局变量每次刷新都会重新初始化,导致不能记录历史运行情况
3,字符变量,一定要加单引号的。从来没听说过不加单引号的用法
|
-- 作者:滚雪球 -- 发布时间:2014/5/9 11:14:03 -- 不加单引号的用法确实有,见金字塔提供的海龟后台模型的例子 |
-- 作者:lichenghu -- 发布时间:2014/5/9 11:18:42 -- 看下人家的变量定义,已经定义为字符串变量了 STRENTRYBARPOS:=STRCAT(STKLABEL,\'ENTRYBARPOS\') [此贴子已经被作者于2014/5/9 11:19:06编辑过]
|
-- 作者:滚雪球 -- 发布时间:2014/5/9 11:19:40 -- 加了单引号,EXTGBDATA,EXTGBDATASET是否就无需申明全局变量? |
-- 作者:lichenghu -- 发布时间:2014/5/9 11:22:11 -- 一个是申明,一个是取值。和加单引号有啥关系? EXTGBDATA(\'A\')//取得单值全局变量A EXTGBDATASET(\'A\',1OOO);//定义单指全局变量A,值为1000 |
-- 作者:滚雪球 -- 发布时间:2014/5/9 11:31:40 -- 我大概知道了 EXTGBDATASET在赋值的时候就算是定义了,因此不需要额外的申明 金字塔自带的后台移动止损止盈的例子把我搞晕了 //该模型为简单示范模型,用户需根据自己交易经验,修改完善后再实际应用!!! //该模型运行于后台程序化模式 ZH1:\'1000\'; PZ1:\'IF00\'; VARIABLE:A=0; -----------------------------------这一句其实完全没有必要,对吧? //条件判断 MA5:MA(CLOSE,5); MA10:MA(CLOSE,10); CONDBUY:=CROSS(MA5,MA10); CONDSELL:=CROSS(MA10,MA5); //开仓和平仓 TBUY(CONDBUY AND TBUYHOLDINGEX( ZH1,PZ1 ,0 )<10,1,LMT,CLOSE,0,ZH1,PZ1 ); TSELL(CONDSELL,TBUYHOLDINGEX( ZH1,PZ1 ,0 ),MKT,0,ZH1,PZ1); //移动止损模块部分******************************* //A有三种数值状态:1,0,最新价; //当A=1时表示当前有持仓,A=0时表示移动止损执行完毕,A=最新价时用于比较价格是否回落 //将A赋值为1,表示当前有持仓 IF TBUYHOLDINGEX( \'\',\'\' ,0 )>0 AND EXTGBDATA(\'a\' )=0 THEN BEGIN EXTGBDATASET( \'a\',1 ); END //使A始终表示监控开始后的最高价 IF DYNAINFO( 7)>EXTGBDATA(\'a\' ) and EXTGBDATA(\'a\' )>0 THEN BEGIN EXTGBDATASET( \'a\',DYNAINFO( 7)); END //发现价格回落止损,并将A赋值为0表示移动止损动作完成 IF EXTGBDATA(\'a\' )-DYNAINFO( 7)>5*MINDIFF and EXTGBDATA(\'a\' )>0 THEN BEGIN TSELL(1,1,MKT ); EXTGBDATASET( \'a\',0); END //******************************* |
-- 作者:lichenghu -- 发布时间:2014/5/9 11:36:17 -- 没用。回头会改正 |