请问如何编辑下面的function QQE_TR,Ambroker 里的QQE指标源码以下:
_SECTION_BEGIN("QQE");
// QQE (Quantative Qualitative Estimation)
QQE_Periods = Param("Period", 14, 3, 30, 1 );
QQE_SF = Param("Smoothing factor", 5, 1, 30, 1 );
QQE_RSI_MA = EMA(RSI(QQE_Periods),QQE_SF);
QQE_ATR_RSI = abs(Ref(QQE_RSI_MA,-1)-QQE_RSI_MA);
QQE_MA_ATR_RSI = EMA(QQE_ATR_RSI, 2*QQE_Periods-1);
QQE_DAR = EMA(QQE_MA_ATR_RSI, 2*QQE_Periods-1)*4.236;
QQE_DAR_Fast = EMA(QQE_MA_ATR_RSI, 2*QQE_Periods-1)*2.618;
function QQE_TR(RSIMA, DARFACTOR)
{
result[ 0 ] = 0;
for( i = 1; i < BarCount; i++ )
{
if (RSIMA[i] < result[i-1])
{
result[i]=RSIMA[i]+DARFACTOR[i];
if ((RSIMA[i-1] < result[i-1]) AND (result[i] > result[i-1]))
{
result[i] = result[i-1];
}
}
else
{
if (RSIMA[i] > result[i-1])
{
result[i]=RSIMA[i]-DARFACTOR[i];
if ((RSIMA[i-1] > result[i-1]) AND (result[i] < result[i-1]))
{
result[i] = result[i-1];
}
}
}
}
return result;
}
QQE_FastSignal = QQE_TR(QQE_RSI_MA,QQE_DAR_Fast);
QQE_SlowSignal = QQE_TR(QQE_RSI_MA,QQE_DAR);
Plot(QQE_RSI_MA,"QQE"+ _PARAM_VALUES(),ParamColor("QQE color", colorRed ), ParamStyle("QQE style",styleThick));
Plot(QQE_FastSignal, "FastSignal", ParamColor("FastSignal color", colorOrange ), ParamStyle("FastSignal style",styleDashed) );
Plot(QQE_SlowSignal, "SlowSignal", ParamColor("SlowSignal color", colorBlue ), ParamStyle("SlowSignal style",styleDashed) );
Buy = Cross(QQE_RSI_MA, QQE_SlowSignal);
Sell = Cross(QQE_SlowSignal, QQE_RSI_MA);
Short=Sell;
Cover=Buy;
shape = Buy * shapeUpArrow + Sell * shapeDownArrow;
PlotShapes( shape, IIf( Buy, colorGreen, colorRed ), 0, QQE_RSI_MA );
_SECTION_END();
使用通达信编译部分以下,由于通达信没有循环语句,所以寄望于金字塔,卡在如何在金字塔里编译自定义函数——function QQE_TR(RSIMA, DARFACTOR) 。
QQE_Periods:=14;
QQE_SF:=5;
LC:=REF(CLOSE,1);
RSI(QQE_Periods):=SMA(MAX(CLOSE-LC,0),QQE_Periods,1)/SMA(ABS(CLOSE-LC),QQE_Periods,1)*100;
RSIMA:= EMA(RSI(QQE_Periods),QQE_SF);
ATRRSI:= abs(Ref(RSIMA,-1)-QQE_RSI_MA);
MAATRRSI:= EMA(ATRRSI, 2*QQE_Periods-1);
DAR:= EMA(MAATRRSI, 2*QQE_Periods-1)*4.236;
DAR_Fast:= EMA(MAATRRSI, 2*QQE_Periods-1)*2.618;
下面就是自定义函数:数组result[ i ]与RSIMA[i]比较,然后分别获值:result[i]=RSIMA[i]+DARFACTOR[i],result[i]=RSIMA[i]-DARFACTOR[i],且在设定条件下result[i] = result[i-1]。。。
function QQE_TR(RSIMA, DARFACTOR)
{
result[ 0 ] = 0;
for( i = 1; i < BarCount; i++ )
{
if (RSIMA[i] < result[i-1])
{
result[i]=RSIMA[i]+DARFACTOR[i];
if ((RSIMA[i-1] < result[i-1]) AND (result[i] > result[i-1]))
{
result[i] = result[i-1];
}
}
else
{
if (RSIMA[i] > result[i-1])
{
result[i]=RSIMA[i]-DARFACTOR[i];
if ((RSIMA[i-1] > result[i-1]) AND (result[i] < result[i-1]))
{
result[i] = result[i-1];
}
}
}
}
return result;
}
然后输出以下三条线就是 QQE指标了,
FastSignal:= QQE_TR(RSIMA,QQE_DAR_Fast);
SlowSignal:= QQE_TR(RSIMA,QQE_DAR);
RSIMA;