📄 macd and histogram divergence detection.afl
字号:
//------------------------------------
// Positive MACD Histogram divergences
//------------------------------------
// Get array containing when positive and negative and positive
// crossovers occured
HistPosCrossover = Cross( HistInd, 0 ) ;
HistNegCrossover = Cross( 0, HistInd ) ;
BarsSinceNegCross = BarsSince( HistNegCrossover );
BarsSincePosCross = BarsSince( HistPosCrossover );
// Get arrays containing for each element, when the MACD-H lowest
// values occur, within the specified number of bars
HistLowBars = LLVBars( HistInd, MACDDivMinWidth );
// Get array defining if the MACD-H previous bar was the minimum
// AND if that MACD-H value was < 0 or > 0
HistMinCond = HistLowBars > 0 AND
BarsSinceNegCross >= HistLowBars AND
Ref(HistLowBars,-1) == 0 AND
Ref(HistInd,-1) < 0;
// Get array containing MACD-H low bar values where lows
// occured, all other bars filled with 0
HistLowVal = IIf( HistMinCond , Ref(HistInd,-1), 0 );
// Get array containing MACD-H low bar value at bar where MACD-H
// low occured, all other bars filled with preceding MACD-H
// low value (chandelier)
HistLowSteps = ValueWhen( Ref(HistMinCond,0), Ref(HistInd,-1), 1 );
// Get array containing differences between MACD-H low bar value and the value
// at previous MACD-H zero positive crossing
// HistLowDiffs = HistLowSteps - ValueWhen( HistPosCrossover, HistLowSteps, 1 );
HistLowDiffs = HistLowSteps - Ref(HistLowSteps,-1);
// Get array containing MACD-H min value when MACD-H < 0, all other
// bars filled with 0
BarsSincePrevNegCross = ValueWhen( HistNegCrossover,
Ref(BarsSinceNegCross ,-1), 1 );
BarsSinceWideNegCross = IIf( HistInd < 0 AND
BarsSincePosCross - BarsSinceNegCross <
HistMinWidth,
BarsSincePrevNegCross + BarsSinceNegCross + 1,
BarsSinceNegCross );
HistMinSteps = IIf( !BarsSinceWideNegCross,
HistInd,
LLV( HistInd , BarsSinceWideNegCross + 1) );
// Get array containing differences in MACD-H max bar values
HistMinDiffs = IIf( HistInd < 0,
HistMinSteps - Ref(HistMinSteps,-1),
0);
// Get minumum from previous MACD-H negative wave
// Plot( ValueWhen( HistNegCrossover, Ref(HistMinSteps,-1), 1 ),"PrevHistMinSteps-1", colorGreen );
// Plot( ValueWhen( HistNegCrossover, Ref(HistMinSteps,-1), 2 ),"PrevHistMinSteps-1", colorGreen );
PrevHistMinSteps = IIf( HistInd < 0 AND
BarsSincePosCross - BarsSinceNegCross <
HistMinWidth,
ValueWhen( HistNegCrossover,
Ref(HistMinSteps,-1), 2 ),
ValueWhen( HistNegCrossover,
Ref(HistMinSteps,-1), 1 ) );
// Get array containing price low bar values where lows
// occured, all other bars filled with huge number
PriceHistLowVal = IIf( HistMinCond,
Ref(LLV(L,MACDDivMinWidth),-1),
2000000 );
// Get array containing local price low bar value at bar
// where MACD-H low occured, all other bars filled with preceding
// price low value (chandelier)
PriceHistLowSteps = ValueWhen( Ref(HistMinCond ,0),
LLV(L,MACDDivMinWidth) );
// Get array containing differences in price low bar values
PriceHistLowDiffs = PriceHistLowSteps - Ref(PriceHistLowSteps,-1);
// Get array containing price low minimum value when MACD-H < 0,
// all other bars filled with 0
PriceHistMinSteps = IIf( !BarsSinceNegCross,
L,
LLV( L , BarsSinceNegCross) );
// Get minimum from previous MACD-H negative wave
PrevPriceHistMinSteps = IIf( BarsSincePosCross - BarsSinceNegCross <
HistMinWidth,
ValueWhen( HistNegCrossover,
Ref(PriceHistMinSteps,-1), 2 ),
ValueWhen( HistNegCrossover,
Ref(PriceHistMinSteps,-1), 1 ) );
// Divergence signal
HistPosDivergence = // HistLowDiffs > 0 AND
// AND PriceHistLowDiffs < 0
HistMinSteps > PrevHistMinSteps
AND PriceHistMinSteps < PrevPriceHistMinSteps
AND HistLowVal < 0
AND VolumeMABool
AND C > 1.0
;
//------------------------------------
// Negative MACD Histogram divergences
//------------------------------------
// Get arrays containing for each element, when the MACD-H highest values
// occur, within the specified number of bars
HistHighBars = HHVBars( HistInd, MACDDivMinWidth );
// Get array defining if the MACD-H previous bar was the maximum,
// AND if that MACD-H value was < 0 OR > 0
HistMaxCond = HistHighBars > 0
AND BarsSincePosCross >= HistHighBars
AND Ref(HistHighBars,-1) == 0
AND Ref(HistInd,-1) > 0
;
// Get array containing MACD-H high bar values where highs
// occured, all other bars filled with 0
HistHighVal = IIf( HistMaxCond, Ref(HistInd,-1), 0);
// Get array containing MACD-H high bar value at bar where MACD-H
// high occured, all other bars filled with preceding MACD-H
// high value (chandelier)
HistHighSteps = ValueWhen( Ref(HistMaxCond,0),
Ref(HistInd,-1), 1 );
// Get array containing differences in MACD-H high bar values
HistHighDiffs = HistHighSteps - Ref(HistHighSteps,-1);
// Get array containing MACD-H max value when MACD-H > 0, all other
// bars filled with 0
BarsSincePrevPosCross = ValueWhen( HistPosCrossover,
Ref(BarsSincePosCross ,-1), 1 );
BarsSincePrevNegCross = ValueWhen( HistNegCrossover,
Ref(BarsSinceNegCross ,-1), 1 );
BarsSinceWidePosCross = IIf( HistInd > 0 AND
BarsSinceNegCross - BarsSincePosCross <
HistMinWidth,
BarsSincePrevPosCross + BarsSincePosCross + 1,
BarsSincePosCross );
HistMaxSteps = IIf( !BarsSinceWidePosCross,
HistInd,
HHV( HistInd , BarsSinceWidePosCross + 1) );
// Get array containing differences in MACD-H max bar values
HistMaxDiffs = IIf( HistInd > 0,
HistMaxSteps - Ref(HistMaxSteps,-1),
0);
// Get high from pevious MACD-H positive wave
PrevHistMaxSteps = IIf( HistInd > 0 AND
BarsSinceNegCross - BarsSincePosCross <
HistMinWidth,
ValueWhen( HistPosCrossover,
Ref(HistMaxSteps,-1), 2 ),
ValueWhen( HistPosCrossover,
Ref(HistMaxSteps,-1), 1 ) );
// Get array containing MACD-H high bar values where highs
// occured, all other bars filled with 0
PriceHistHighVal = IIf( HistMaxCond,
Ref(HHV(H,MACDDivMinWidth),-1),
0);
// Get array containing local price high bar value at bar
// where MACD-H high occured, all other bars filled with preceeding
// price high value (chandelier)
PriceHistHighSteps = ValueWhen( Ref(HistMaxCond,0),
HHV(H,MACDDivMinWidth) );
// Get array containing differences in price high bar values
PriceHistHighDiffs = PriceHistHighSteps - Ref(PriceHistHighSteps,-1);
// Get array containing MACD-H max value when MACD-H > 0, all other
// bars filled with 0
PriceHistMaxSteps = IIf( !BarsSincePosCross,
H,
HHV( H , BarsSincePosCross) );
// Get high from pevious MACD-H positive wave
PrevPriceHistMaxSteps = IIf( BarsSinceNegCross - BarsSincePosCross <
HistMinWidth,
ValueWhen( HistPosCrossover,
Ref(PriceHistMaxSteps,-1), 2 ),
ValueWhen( HistPosCrossover,
Ref(PriceHistMaxSteps,-1), 1 ) );
// Divergence signal
HistNegDivergence = // HistHighDiffs < 0 AND
// AND PriceHistHighDiffs > 0
HistMaxSteps < PrevHistMaxSteps
AND PriceHistMaxSteps > PrevPriceHistMaxSteps
AND HistHighVal > 0
AND VolumeMABool
AND C > 1.0
;
//-----------------------
// MACD crossover signals
//-----------------------
PosCrossover = Cross( DayHist, 0 )
AND DayBuyBool
AND VolumeMABool
AND C > 1.0
;
NegCrossover = Cross( 0, DayHist )
AND DaySellBool
AND VolumeMABool
AND C > 1.0
;
// Plot signals
PlotShapes( IIf( HistPosDivergence , shapeSmallUpTriangle, shapeNone ),
colorBlue, 0, 0 , -12 );
PlotShapes( IIf( HistNegDivergence , shapeSmallDownTriangle, shapeNone ),
colorBlue, 0, 0, -12 );
PlotShapes( IIf( MACDPosDivergence , shapeUpArrow , shapeNone ),
colorBlue, 0, Graph1, -12 );
PlotShapes( IIf( MACDNegDivergence , shapeDownArrow, shapeNone ),
colorBlue, 0, Graph1, -12 );
PlotShapes( IIf( PosCrossover , shapeSmallCircle, shapeNone ),
colorBlue, 0, Graph1 , 0 );
PlotShapes( IIf( NegCrossover , shapeSmallCircle, shapeNone ),
colorBlue, 0, Graph1 , 0 );
Filter = HistPosDivergence
OR HistNegDivergence
OR PosCrossover
OR NegCrossover
OR MACDPosDivergence
OR MACDNegDivergence
;
if( Sector = SectorID( 0 ) >= 0 )
{
Sector = SectorID( 1 );
Industry = IndustryID( 1 );
}
else
{
Sector = "MG";
Industry = "MG";
}
AddColumn( 32, "H-PD", formatChar, colorDefault,
IIf(Filter && HistPosDivergence,colorBrightGreen,colorDefault) );
AddColumn( 32, "M-PD", formatChar, colorDefault,
IIf(Filter && MACDPosDivergence,colorBrightGreen,colorDefault) );
AddColumn( 32, "M-PC", formatChar, colorDefault,
IIf(Filter && PosCrossover,colorBrightGreen,colorDefault) );
AddColumn( 32, "H-ND", formatChar, colorDefault,
IIf(Filter && HistNegDivergence,colorRed,colorDefault) );
AddColumn( 32, "M-ND", formatChar, colorDefault,
IIf(Filter && MACDNegDivergence,colorRed,colorDefault) );
AddColumn( 32, "M-NC", formatChar, colorDefault,
IIf(Filter && NegCrossover,colorRed,colorDefault) );
AddTextColumn( Sector , "Sector" );
AddTextColumn( Industry , "Industry" );
_SECTION_END();
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -