//------------------------------------------------------------------------
// 简称: ADX_Indicator
// 名称: ADX指标(平均趋向指数)
// 类别: 公式应用
// 类型: 内建应用
//------------------------------------------------------------------------
Params
Numeric Length(14); // ADX计算周期
Numeric Smooth(14); // ADX平滑周期
Numeric ADX_Level(25); // ADX强弱分界线
Vars
Series<Numeric> TR; // 真实波幅
Series<Numeric> PlusDM; // +DM
Series<Numeric> MinusDM; // -DM
Series<Numeric> PlusDI; // +DI
Series<Numeric> MinusDI; // -DI
Series<Numeric> DX; // 趋向指数
Series<Numeric> ADX; // 平均趋向指数
Series<Numeric> SmoothedTR;
Series<Numeric> SmoothedPlusDM;
Series<Numeric> SmoothedMinusDM;
Events
OnReady()
{
// 完全模仿KDJ的设置
SetBackBarMaxCount(1 + Max(Length, Smooth));
}
OnBar(ArrayRef<Integer> indexs)
{
Range[0:DataSourceSize() - 1]
{
// ========== 1. 计算TR ==========
Numeric HL = High - Low;
Numeric HC = Abs(High - Close[1]);
Numeric LC = Abs(Low - Close[1]);
TR = Max(HL, Max(HC, LC));
// ========== 2. 计算DM ==========
Numeric upMove = High - High[1];
Numeric downMove = Low[1] - Low;
if(upMove > downMove && upMove > 0)
{
PlusDM = upMove;
MinusDM = 0;
}
else if(downMove > upMove && downMove > 0)
{
PlusDM = 0;
MinusDM = downMove;
}
else
{
PlusDM = 0;
MinusDI = 0;
}
// ========== 3. 平滑TR和DM ==========
if(CurrentBar == 0)
{
SmoothedTR = TR;
SmoothedPlusDM = PlusDM;
SmoothedMinusDM = MinusDM;
}
else
{
SmoothedTR = SmoothedTR[1] * (Length - 1) / Length + TR;
SmoothedPlusDM = SmoothedPlusDM[1] * (Length - 1) / Length + PlusDM;
SmoothedMinusDM = SmoothedMinusDM[1] * (Length - 1) / Length + MinusDM;
}
// ========== 4. 计算DI ==========
if(SmoothedTR > 0)
{
PlusDI = 100 * SmoothedPlusDM / SmoothedTR;
MinusDI = 100 * SmoothedMinusDM / SmoothedTR;
}
else
{
PlusDI = 0;
MinusDI = 0;
}
// ========== 5. 计算DX和ADX ==========
Numeric DI_Sum = PlusDI + MinusDI;
Numeric DI_Diff = Abs(PlusDI - MinusDI);
if(DI_Sum > 0)
{
DX = 100 * DI_Diff / DI_Sum;
}
else
{
DX = 0;
}
// 计算ADX
if(CurrentBar < Smooth)
{
ADX = Average(DX, CurrentBar + 1);
}
else
{
ADX = (ADX[1] * (Smooth - 1) + DX) / Smooth;
}
// ========== 6. 绘图(完全模仿KDJ) ==========
// 只绘制有效的值
if(ADX <> InvalidNumeric)
{
PlotNumeric("ADX", ADX);
}
if(PlusDI <> InvalidNumeric)
{
PlotNumeric("+DI", PlusDI);
}
if(MinusDI <> InvalidNumeric)
{
PlotNumeric("-DI", MinusDI);
}
// 水平参考线
PlotNumeric("Ref1", 20);
PlotNumeric("Ref2", 80);
}
}
ADX变成一条线,K线也变小了,帮我看看问题出在哪里
设置成副图, 在公式编辑界面的左下角下来菜单,把主图改成副图