⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 macd and histogram divergence detection.afl

📁 一个更精度的平滑涵数, 可用于股票交易系统.用于Amibroker 平台
💻 AFL
📖 第 1 页 / 共 2 页
字号:

//------------------------------------
// 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 + -