大家好,我想记录macd金叉跟死叉之间的最高价的值,但是我写的这段代码,记录下来的值是错误的,大伙帮忙看看哪里出了问题,谢谢
Params
Numeric FastLength(12);
Numeric SlowLength(26);
Numeric MACDLength(9);
Vars
Series<Numeric> MACDDiff;
Series<Numeric> AvgMACD;
Series<Numeric> MACDValue;
Series<Bool> MAUP;
Series<Bool> MADOWN;
Series<Numeric> MKD;
Series<Numeric> MKK;
Series<Numeric> MAHIGH;
Series<Numeric> i;
Series<Numeric> MK;
Events
OnBar(ArrayRef<Integer> indexs)
{
MACDDiff = XAverage( Close, FastLength ) - XAverage( Close, SlowLength ) ;
AvgMACD = XAverage(MACDDiff,MACDLength);
MACDValue = 2 * (MACDDiff - AvgMACD);
PlotNumeric("MACDDiff",MACDDiff);
PlotNumeric("MACDDEA",AvgMACD);
If (MACDValue >= 0)
PlotAuto("MACD",MACDValue,0,Red,Enum_Bar);
Else
PlotAuto("MACD",MACDValue,0,Green,Enum_Bar);
PlotNumeric("零线",0);
MAUP = CrossOver(MACDDiff,AvgMACD);
MADOWN = CrossUnder(MACDDiff,AvgMACD);
If(MAUP)
{
MKD = CurrentBar;
}
If(MADOWN)
{
MKK = CurrentBar;
}
For i = MKD To MKK
{
MAHIGH = Max(MAHIGH,High[i]);
}
If(MADOWN)
{
MAHIGH = 0;
}
Commentary("MAHIGH = " + Text(MAHIGH));
}
快速浏览一眼代码,然后简短说一下问题吧
这个算法设计的就有问题,不知道你自己有没有验算过
我举一个实例
打比方说,现在图表第30根bar发生金叉,按照你的算法逻辑,那就是mkd记录未29
然后第50根bar发生死叉,按照你的算法逻辑,mkk记录49
假设现在是第51根bar,按照你的for循环算法,循环变量i从29到49
执行的算法是,MAHIGH = Max(MAHIGH,High[i]);这里我就看不懂了
也就是你会比较从high[29]到high[49]这20根k线的最高价。这对吗?
你难道不是应该比较high[1]到high[21]这20根bar的最高价吗?
站在第51根bar来看,难道不是回溯21根的第30根bar是金叉,回溯1根的第50根bar是死叉吗?
怎么跑出来的29和49?这算法有仔细动脑想过吗??
但凡自己带一个实例进去看看也都知道算出来的不对吧?
代码分析建议投稿。
老兄,等到投稿回复,黄花菜都凉了😭
代码分析本来就是要花费很多精力和时间去处理,实在是忙不过来。
而且正常来说,代码诊断分析能力应该是要自己去养成的,要学会通过输出语句去打断点,做诊断,这些应该是自己要做的工作。
谢谢老师,已经搞清楚了