以文本方式查看主题

-  金字塔客服中心 - 专业程序化交易软件提供商  (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
--  
 没用。回头会改正