再请Wesley前辈!
前辈您好,
受您的影响我在做一个机械交易系统,
现在需要将一个飞狐公式转为MT的
我现在写好了,但从MT上调试不出来,不知道错在哪里,请前辈帮忙校对一下!小弟多谢了!
/*[[
Name := ama
Author := Copyright ?2004, MetaQuotes Software Corp.
Link := http://www.metaquotes.net/
Separate Window := No
First Color := Blue
First Draw Type := Line
First Symbol := 217
Use Second Data := No
Second Color := Red
Second Draw Type := Line
Second Symbol := 218
Direction:=CLOSE - REF( CLOSE , N ) ;
XX:=ABS( CLOSE - REF( CLOSE , 1 ) ) ;
Volatility:=SUM( XX , N ) ;
ER:=ABS( Direction / Volatility ) ;
FastC:= 2 / ( p + 1 ) ;
SlowC:= 2 / ( q + 1 ) ;
SSC:=ER * ( FastC - SlowC ) + SlowC ;
Constant :=SSC * SSC ;
AMA:DMA(C, Constant);
FFilter:=( K / 100 ) * Std( AMA - REF( AMA , 1 ) , N ) ;
XA:=IF( AMA<REF( AMA , 1 ) , AMA , 0 ) ;
XN:=BarsLast( XA>0 ) ;
AMALow :=REF( AMA , XN ) ;
YA:=IF( AMA>REF( AMA , 1 ) , AMA , 0 ) ;
YN:=BarsLast( YA>0 ) ;
AMAHigh :=REF( AMA , YN ) ;
RR:=IF( AMAHigh - AMA > FFilter , -1 , 0 ) ;
TT:=IF( AMA - AMALow > FFilter , 1 , RR ) ;
PartLine(TT=1,AMA) ;
PartLine(TT= -1,AMA) ;
PartLine(TT= 0,AMA) ;
]]*/
Variable : shift(0);
defines: n(10),p(2),Q(30),K(15);
Variable: direction(0),xx(0),volatility(0),er(0),fastc(0),slowc(0),ssc(0),constant(0),stdama(0),amax(0);
Variable: ama(0),ffilter(0),xa(0),XN(0),xnshift(0),amalow(0),ya(0),yn(0),ynshift(0),amahigh(0),rr(0),tt(0);
SetLoopCount(0);
//变量参数
//n 10 ,p 2 ,Q 30, K 15
For shift=Bars-1 Downto 0 Begin
//Direction:=CLOSE - REF( CLOSE , N ) ;
direction=Close-close[shift-N];
//XX:=ABS( CLOSE - REF( CLOSE , 1 ) ) ;
xx=abs(close-close[shift-1]);
//Volatility:=SUM( XX , N ) ;
for i = n downto 1
{
volatility = volatility + xx[shift-i]
} ;
//ER:=ABS( Direction / Volatility ) ;
er=abs(direction/volatility);
//FastC:= 2 / ( p + 1 ) ;
fastc=2/(p+1);
//SlowC:= 2 / ( q + 1 ) ;
slowc=2/(q+1);
//SSC:=ER * ( FastC - SlowC ) + SlowC ;
ssc=er*(fastc-slowc)+slowc;
//Constant :=SSC * SSC ;
constant=ssc*ssc;
//AMA:DMA(C, Constant);
//DMA(X,A) 动态移动平均
//算法:若 Y=DMA(X,A) 则有 Y=A*X+(1-A)*Y',其中Y'表示上一周期Y值,A必须小于1,
ama=constant*Close+(1-constant)*ama[shift-1];
//FFilter:=( K / 100 ) * Std( AMA - REF( AMA , 1 ) , N ) ;
//STD(X,N)估算标准差。
//用途:返回X的N日估算标准差
//算法:STD(X,N) = SQRT(DEVSQ(X,N)/(N-1))
//DEVSQ(X,N)数据偏差平方和。
//算法:Y=∑(Xi-Z), i=1->N, Z=MA(X,N)
amax=ama-ama[shift-1];
for i=n down to 1
{
stdama=stdama+amax[shift,i]-iMA(N,mode_sma,0)
};
ffilter=(k/100)*sqrt(stdama/n-1) ;
//XA:=IF( AMA<REF( AMA , 1 ) , AMA , 0 ) ;
if ama<ama[shift-1] then xa=ma
else xa=0;
//XN:=BarsLast( XA>0 ) ;
//BARSLAST(X) 上一次条件成立到当前的周期数。
//用法:
//BARSLAST(X):上一次X不为0到现在的天数
if xa>0 then xnshift=shift;
xn=shift-xnshift;
//AMALow :=REF( AMA , XN ) ;
amalow=ama[shift-xn];
//YA:=IF( AMA>REF( AMA , 1 ) , AMA , 0 ) ;
if ama>ama[shift-1] then ya=ama
else ya=0;
//YN:=BarsLast( YA>0 ) ;
if ya>0 then ynshift=shift;
yn=shift-ynshift;
//AMAHigh :=REF( AMA , YN ) ;
amahigh=ama[shift-yn];
//RR:=IF( AMAHigh - AMA > FFilter , -1 , 0 ) ;
if amahigh-ama>ffilter then rr=-1
else rr=0;
//TT:=IF( AMA - AMALow > FFilter , 1 , RR ) ;
if ama-amalow>ffilter then tt=1
else tt=rr;
//PartLine(TT=1,AMA) ; 红
if tt=1 then SetIndexValue(shift, ama);
//PartLine(TT= -1,AMA) ;绿
if tt=-1 then SetIndexValue2(shift, ama);
//PartLine(TT= 0,AMA) ;白
End;
发表于:2004-10-24 14:40只看该作者
2楼
用法很多错了啊
韬客社区www.talkfx.co
发表于:2004-10-24 16:16只看该作者
3楼
这个AMA以前做过,但是,我在MT上是作不出来的了,当时,我认为是MT平台不支持运算
太多数据,因为MT里面的函数运算不强,要改为陷套循环,才能表达AMA的用意,最后,我不搞了.原因是,第一,AMA的效果跟简单的10天均线差不多;第二,这个指标也用到了未来数据;如果你希望搞,我给些个人的建议你,第一,把AMA好好理解,简单化,不翻译飞狐公式,按照自己的想法,自己一边写,一边调试出来;第二,写好了,记得,它就是一个入市信号,记得,利润永远与风险同在;最后,写好了,给我学习一下.[em75]
韬客外汇论坛TALKFOREX.COM