在后台交易模拟中发现Variable全局变量好像有问题,做一个测试程序:后台交易运行,固定时间间隔5秒。
Variable: Myholding=0;
DEBUGFILE('C:\test.txt','VS:%.0f',Myholding);
IF ISLASTBAR THEN
BEGIN
IF Myholding=0 THEN
BEGIN
Myholding:=1;
DEBUGFILE('C:\test.txt','Myholding:%.0f',Myholding);
END
END
按照我的理解,在Myholding:=1后,应该保持为1。但实际测试文件的结果如下:
2010-07-28 11:12:00.265 VS:0
2010-07-28 11:12:00.265 Myholding:1
2010-07-28 11:12:05.734 VS:0
2010-07-28 11:12:05.734 Myholding:1
2010-07-28 11:12:10.718 VS:0
2010-07-28 11:12:10.718 Myholding:1
2010-07-28 11:12:15.718 VS:0
2010-07-28 11:12:15.718 Myholding:1
2010-07-28 11:12:20.734 VS:0
2010-07-28 11:12:20.734 Myholding:1
2010-07-28 11:12:25.718 VS:0
2010-07-28 11:12:25.718 Myholding:1
2010-07-28 11:12:30.734 VS:0
2010-07-28 11:12:30.734 Myholding:1
2010-07-28 11:12:35.718 VS:0
2010-07-28 11:12:35.734 Myholding:1
能请教一下是怎么回事?Variable定义的全局变量为什么被不停地初始化了呢?
Variable: Myholding=0;
每次执行一次循环检测时,都会被初始化一次,如果你需要变量一致记住,需要使用全局变量数据库,保存变量状态,请参考EXTGBDATA,EXTGBDATASET
那和下面您在其他帖子里的描述不一样啊??
全局变量有两种,一种是在公式里的,每次执行都被初始化一次的,这里的每次执行指的是每次金字塔执行公式系统的运行,即从1周期到BARCOUNT的过程。
比如一个变量这样声明:
variable:maxprofit=0;
他只会在第一个周期被初始化赋值为0,其他周期均不会对此变量进行赋值,比如:
variable:maxprofit=0;
IF BARPOS = 2 THEN
MAXPROFIT := 10;
IF BARPOS = 10 THEN
MAXPROFIT := 30;
AA:MAXPROFIT;
通过AA的显示曲线,用户应该会明白全局变量的用途
金字塔还有一种全局变量,可以保存数据到全局变量数据库中,具体参考 EXTGBDATASET 和 EXTGBDATA 函数的调用
怎么不一样了?每次执行一次循环信号检测,都需要重新初始化公式系统
啊!后台交易,每次循环都会初始化公式!又明白了一点后台交易的机理。谢谢!
不过,有关软件运行机理方面的东西希望能够有集中介绍。
代码工作在图表自动交易模式下
当出现开仓后,开仓价格相比,最大损失超过2%止损
当出现盈利后,与最大盈利价格相比,回落到60%幅度后止赢离场}
MA1:=MA(CLOSE,5);
MA2:=MA(CLOSE,30);
variable:maxprofit=0;//有仓位时最大获利幅度
//开仓
IF CROSS(MA1,MA2) THEN
BEGIN
BUY(1,1);
maxprofit:=0;
END
//平仓
SELL(CROSS(MA2,MA1),0);
//判断当前持仓状态下的最大盈利
win:=0;
win2:=0;
if holding > 0 and enterbars > 0 then
begin
win:=(c-enterprice)/enterprice*100; //记录最大盈利
if win > maxprofit then
maxprofit:=win;
win2:=(maxprofit-win)/maxprofit*100; //最大盈利后的回调幅度
end
//出现浮动亏损比如2%平仓
止损多:SELL(win < -2,0);
// 出现最高盈利后,回落到盈利的60%平仓出场
止赢多:SELL(win2 >= 60 and openprofit > 0, 0);
//开仓
IF CROSS(MA2,MA1) THEN
BEGIN
BUYSHORT(1,1);
maxprofit:=0;
END
//平仓
SELLSHORT(CROSS(MA1,MA2),0);
//判断当前持仓状态下的最大盈利
win:=0;
win2:=0;
if holding < 0 and enterbars > 0 then
begin
win:=(enterprice-c)/enterprice*100; //记录最大盈利
if win > maxprofit then
maxprofit:=win;
win2:=(maxprofit-win)/maxprofit*100; //最大盈利后的回调幅度
end
//出现浮动亏损比如2%平仓
止损空:SELLSHORT(win < -2,0);
// 出现最高盈利后,回落到盈利的60%平仓出场
止赢空:SELLSHORT(win2 >= 60 and openprofit > 0, 0);
这是帮主的一个例子,按照前边的说法,每一次循环全局变量就初始化一次,所以,这里使用全局变量实际交易无法使用???
可以的.
楼主可参考论坛里variable相关的帖子,以助理解!