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

📄 cci(20) divergence indicator.afl

📁 一个更精度的平滑涵数, 可用于股票交易系统.用于Amibroker 平台
💻 AFL
📖 第 1 页 / 共 2 页
字号:
//------------------------------------------------------------------------------
//
//  Formula Name:    CCI(20) Divergence Indicator
//  Author/Uploader: Dennis Skoblar 
//  E-mail:          DennisAndLisa@sbcglobal.net
//  Date/Time Added: 2006-02-12 09:28:43
//  Origin:          Divergence Indicator for CCI(20)
//  Keywords:        
//  Level:           semi-advanced
//  Flags:           indicator
//  Formula URL:     http://www.amibroker.com/library/formula.php?id=586
//  Details URL:     http://www.amibroker.com/library/detail.php?id=586
//
//------------------------------------------------------------------------------
//
//  This is a diveregence indeicator for the CCI(20)...I did not write this
//  excellent program and take no credit for it. I just modified the params a
//  bit to work with the cci. Thank you to the author for the excellent work!
//
//------------------------------------------------------------------------------

/*
  FileName: Mod - Osc-Price Divergence31
  October 25, 2005
  Version 1.0
  ====================================
  Use with MACD or Stochastics
  program detects and plots trendlines on oscillators
  generates price divergence data
  ====================================
  Program is built as an include module
  Program does not return anything. It plots the divergence area.
  The global variables below are available to controlling code
  ===============================================================
  - Modify divergence detection to account for continuation cases properly
  - Currently case #18 useed for continuation
*/

// Parameters needed to be defined before calling this module

 Issue   = CCI(20);
 Middle  = 0;

//Middle: MACD=0, Stoc=50, RSI=50

Div_Version = 32;
Pattern =  Diverge = "";

//Parameters
Trendlines     = Param("Trendlines",3,0,3,1);
TradeON        = Param("TradeON",1,0,1,1);
Diag_Trace     = Param("Diag_Trace",0,0,1,1);
Alerts         = Param("Alerts",0,0,1,1);

function ParameterSetup(Osc_Issue)
{
//Variables are defined here if they are assigned values in more than one location
global Pattern, Diverge, PlotDiverge;
global PlotOver1, PLotOver2, Line1, Line2;
global Backtest, explore;
global Sel_BarIndex, Sel_Osc_Issue;


pattern        = "";
diverge        = "";
PlotDiverge    = 0;

Plotover1 = Plotover2 = Line1 = Line2 = 0;

Backtest       = Status("action") == 5;
Explore        = Status("action") == 4;

Sel_OscIssue        = IIf(TradeON==1,LastValue(Osc_Issue),SelectedValue(Osc_Issue));
Sel_BarIndex        = IIf(TradeON==1,LastValue(BarIndex()),SelectedValue(BarIndex()));


// verify this segment
if (Backtest ==1)
{
TradeON = 0;
Sel_OscIssue = Osc_Issue;
Sel_BarIndex = BarIndex();

}


} // end ParameterSetup





// ****************************************************************************************** //
//                                        Functions
//
//Determine Peaks  - Bearish Reversal
function DetectLastHigh(Osc_Issue)
{
global LastHigh, LastHighBars, TurnDn_OK, Sel_TurnDn_OK;

TurnDn_OK       = False;
Sel_TurnDn_OK   = False;
Def_Peak1       = 0;
Def_Peak2       = 0;
LastHigh        = 0;
LastHighBars    = 0;

Def_Peak1       = Osc_Issue < Ref(Osc_Issue,-1) AND Ref(Osc_Issue,-1) > Ref(Osc_Issue,-2) AND Osc_Issue < Ref(Osc_Issue,-2);
Def_Peak2       = Osc_Issue < Ref(Osc_Issue,-1) AND Ref(Osc_Issue,-1) < Ref(Osc_Issue,-2) AND Ref(Osc_Issue,-2) > Ref(Osc_Issue,-3) 
					 AND Osc_Issue < Ref(Osc_Issue,-3);						
TurnDn_OK       = Def_Peak1 OR Def_Peak2;
Sel_TurnDn_OK   = IIf(TradeON==1,LastValue(TurnDn_OK),SelectedValue(TurnDn_OK));


HighBar1        = IIf(Def_Peak1==1,1,0);
HighBar2        = IIf(Def_Peak2==1,1,0);
HighBar         = IIf(HighBar1==1,3,4);

LastHigh        = HHV(Osc_Issue,HighBar);
LastHighBars    = HHVBars(Osc_issue,HighBar);


_TRACE("Sel_TurnDn_OK "  + WriteVal(Sel_TurnDn_OK));

if (Diag_Trace==1)
{
_TRACE("Detect LastHigh - " + WriteVal(LastHigh,1.2) + " Def Peak1 " + WriteVal(Def_Peak1,1.0)
				+ " Def Peak2 " + WriteVal(Def_Peak2,1.0) + "  TurnDn " + WriteVal(TurnDn_OK,1.0));
_TRACE("Detect LastHigh - Osc " + WriteVal(Osc_Issue,1.2) +  "   Ref Osc -2 " + WriteVal(Ref(Osc_Issue,-2))
				+ "   Ref Osc -3 " + WriteVal(Ref(Osc_Issue,-3)));
}
return  Sel_TurnDn_OK;
} // end DetectLastHigh



function DetectBearishReversal(Osc_Issue,Middle)
{
global SDiv_Code, BT_SDiv_Code, Bear_Diverge;

SDiv_Code = BT_SDiv_Code = Bear_Diverge = 0;

Sel_TurnDn_OK   = DetectLastHigh(Osc_Issue);
_TRACE("Bear Reversal - Enter Bear Diverge");

if (Sel_TurnDn_OK ==1 OR Backtest==1)
{
//Find Current Peak
FirstBar_CurrGroup   = BarsSince(Cross(Osc_Issue,Middle))+1;
CurrPeak             = HHV(Osc_Issue,FirstBar_Currgroup);
CurrPeakBars         = HHVBars(Osc_Issue,FirstBar_Currgroup)+0;
Sel_CurrPeak         = IIf(TradeON==1,LastValue(CurrPeak),SelectedValue(CurrPeak));
_TRACE("Bear Reversal 02-0 - CPeak " + WriteVal(Sel_CurrPeak,1.2));

//Determine Prior Peak
//Distances computed relative to selected bar
i=0;
_TRACE("Bear Reversal 00 - start of loop  ------- ");
do
{
i++;
LastBar_PriorGroup       = Sel_BarIndex-ValueWhen(Cross(Middle,Osc_Issue),BarIndex(),i);
FirstBar_PriorGroup      = Sel_BarIndex-ValueWhen(Cross(Osc_Issue,Middle),BarIndex(),i+1);

Sel_LastBar_PG           = IIf(TradeON==1,LastValue(LastBar_PriorGroup),SelectedValue(LastBar_PriorGroup));
Sel_FirstBar_PG          = IIf(TradeON==1,LastValue(FirstBar_PriorGroup),SelectedValue(FirstBar_PriorGroup));

//Lines below need the selected variable to function correctly
Peak_PriorGroup          = Ref(HHV(Osc_Issue,Sel_FirstBar_PG - Sel_LastBar_PG+1),-Sel_LastBar_PG+1);
PeakBars_PriorGroup      = Ref(HHVBars(Osc_Issue,Sel_FirstBar_PG - Sel_LastBar_PG+1),-Sel_LastBar_PG+1);

Sel_LastBar_PriorGroup   = IIf(TradeON==1,LastValue(LastBar_PriorGroup),SelectedValue(LastBar_PriorGroup));
Sel_PeakBars_PriorGroup  = IIf(TradeON==1,LastValue(PeakBars_PriorGroup),SelectedValue(PeakBars_PriorGroup));
Sel_Peak_PriorGroup      = IIf(TradeON==1,LastValue(Peak_PriorGroup),SelectedValue(Peak_PriorGroup));

Final_Bars               = Sel_PeakBars_PriorGroup + Sel_LastBar_PriorGroup;


// Diagnostic
_TRACE("Bear Reversal - loop 01  - i= " + WriteVal(i,1.0) + " FB_PrGr " + WriteVal(Sel_FirstBar_PG,1.0) + "  LB_PrGr " + WriteVal(Sel_LastBar_PG,1.0));
_TRACE("Bear Reversal - loop 02 - CPeak " + WriteVal(Sel_CurrPeak,1.2));
_TRACE("Bear Reversal - loop 03 - Pk_PG " + WriteVal(Sel_Peak_PriorGroup,1.2) + " Pk_PGBars "  + WriteVal(Sel_PeakBars_PriorGroup,1.0) + " F Bars " + WriteVal(Final_Bars));
_TRACE("Bear Reversal - loop 04 - While1= " + WriteVal((SelectedValue(Peak_PriorGroup)-Middle),1.2) + "  Compare= " + WriteVal(((SelectedValue(CurrPeak)-Middle) / 3),1.2));

} while (((Sel_Peak_PriorGroup-Middle) < (Sel_CurrPeak-Middle) / 3) AND i<10);


_TRACE("Bear Reversal 05 - end of loop  ------- ");


PriorPeak            = Peak_PriorGroup;
PriorPeakBars        = Final_Bars;

Sel_LastHigh       = IIf(TradeON==1,LastValue(LastHigh),SelectedValue(LastHigh));
Sel_CurrPeak       = IIf(TradeON==1,LastValue(CurrPeak),SelectedValue(CurrPeak));
Sel_PriorPeak      = IIf(TradeON==1,LastValue(PriorPeak),SelectedValue(PriorPeak));
Sel_LastHighBars   = IIf(TradeON==1,LastValue(LastHighBars),SelectedValue(LastHighBars));
Sel_CurrPeakBars   = IIf(TradeON==1,LastValue(CurrPeakBars),SelectedValue(CurrPeakBars));
Sel_PriorPeakBars  = IIf(TradeON==1,LastValue(PriorPeakBars),SelectedValue(PriorPeakBars));

//Needed for Backtest Arrays
SR1    = CurrPeak > PriorPeak AND LastHigh == CurrPeak;                         //Curr Peak Higher - Divergence not possible
SR2    = CurrPeak < PriorPeak AND LastHigh == CurrPeak;                         //Curr Peak Lower
SR3    = Osc_Issue > Middle AND CurrPeak > PriorPeak AND LastHigh < CurrPeak;   //Curr Peak Higher - Last High Lower
SR4    = Osc_Issue > Middle AND CurrPeak < PriorPeak AND LastHigh < CurrPeak;   //Curr Peak Lower  - Best
SR5    = LastHigh  < Middle   AND LastHigh < CurrPeak AND SR4==0 AND SR3==0;    //Continuation signal with Osc_Issue < Middle


//Needed for display
Sel_SR1    = IIf(TradeON==1,LastValue(SR1),SelectedValue(SR1));
Sel_SR2    = IIf(TradeON==1,LastValue(SR2),SelectedValue(SR2));
Sel_SR3    = IIf(TradeON==1,LastValue(SR3),SelectedValue(SR3));
Sel_SR4    = IIf(TradeON==1,LastValue(SR4),SelectedValue(SR4));
Sel_SR5    = IIf(TradeON==1,LastValue(SR5),SelectedValue(SR5));


//Determine Price Divergence
if (Sel_SR1==1)
{
Bear_Diverge = 0;
SDiv_Code    = 11;
Diverge      = "";
Pattern      = "Higher High";
}

if (Sel_SR2==1)
{
Curr_HighPrice     = HHV(High,5);
Prior_PeakPrice    = Ref(HHV(High,6),-(Sel_PriorPeakBars-3));
Sel_CHighPrice     = IIf(TradeON==1,LastValue(Curr_HighPrice),SelectedValue(Curr_HighPrice));
Sel_PPeakPrice     = IIf(TradeON==1,LastValue(Prior_PeakPrice),SelectedValue(Prior_PeakPrice));
Sel_Bear_Diverge   = Sel_CHighPrice >= Sel_PPeakPrice;

if (Sel_Bear_Diverge==1)
{
Bear_Diverge = 1;
SDiv_Code    = 13;
Diverge      = "Bearish";
Pattern      = "Lower High";
}
else
{
Bear_Diverge = 0;
SDiv_Code    = 12;
Diverge      = "";
Pattern      = "Lower High";
}
}


if (Sel_SR3==1)
{
_TRACE("Bear Reversal - SR3 - True");
Curr_HighPrice   = HHV(High,5);
Curr_PeakPrice   = Ref(HHV(High,6),-(Sel_CurrPeakBars-3));
Sel_CHighPrice   = IIf(TradeON==1,LastValue(Curr_HighPrice),SelectedValue(Curr_HighPrice));
Sel_CPeakPrice   = IIf(TradeON==1,LastValue(Curr_PeakPrice),SelectedValue(Curr_PeakPrice));
Sel_Bear_Diverge = Sel_CHighPrice >= Sel_CPeakPrice;


if (Sel_Bear_Diverge==1)
{
Bear_Diverge = 1;
SDiv_Code    = 15;
Diverge      = "Bearish";
Pattern      = "Higher High";
}
else
{

Bear_Diverge = 0;
SDiv_Code    = 14;
Diverge      = "";
Pattern      = "Higher High";
}
}

if (Sel_SR4==1)
{
_TRACE("Bear Reversal - SR4 - True");
Curr_HighPrice   = HHV(High,5);
Curr_PeakPrice   = Ref(HHV(High,6),-(Sel_CurrPeakBars-3));
Sel_CHighPrice   = IIf(TradeON==1,LastValue(Curr_HighPrice),SelectedValue(Curr_HighPrice));
Sel_CPeakPrice   = IIf(TradeON==1,LastValue(Curr_PeakPrice),SelectedValue(Curr_PeakPrice));
Sel_Bear_Diverge = Sel_CHighPrice >= Sel_CPeakPrice;

if (Sel_Bear_Diverge==1)
{
Bear_Diverge = 1;
SDiv_Code    = 17;
Diverge      = "Bearish";
Pattern      = "Lower High";
}
else
{
Bear_Diverge = 0;
SDiv_Code    = 16;
Diverge      = "";
Pattern      = "Lower High";
}
}  // end  Sel_Bear_Diverge




if (Sel_SR5==1)
{
Bear_Diverge = 0;
SDiv_Code    = 18;
Diverge      = "";
Pattern      = "Continuation";
}


BT_SDiv_Code = IIf(SR1==1,11,
               IIf(SR2==1 AND Bear_Diverge==0,12,IIf(SR2==1 AND Bear_Diverge==1,13,
               IIf(SR3==1 AND Bear_Diverge==0,14,IIf(SR3==1 AND Bear_Diverge==1,15,
               IIf(SR4==1 AND Bear_Diverge==0,16,IIf(SR4==1 AND Bear_Diverge==1,17,
               IIf(SR5==1 AND SR4==0 AND SR3==0,18,0))))))));

if (Diag_trace)
{
_TRACE("Bear Reversal #00 - Div_Code " + WriteVal(SDiv_Code,1.0) + " --  SR1 " + WriteVal(Sel_SR1,1.0)
             + " SR2 " + WriteVal(Sel_SR2,1.0) + " SR3 " + WriteVal(Sel_SR3,1.0) + " SR4 " + WriteVal(Sel_SR4,1.0));
_TRACE("Bear Reversal #00 - LastHigh " +  WriteVal(Sel_LastHigh,1.2) + " CurrPeak " +  WriteVal(Sel_CurrPeak,1.2)
                        + " PriorPeak " +  WriteVal(Sel_PriorPeak,1.2) );
}

if (Backtest == 0)
{
//Assign Values to coordinates
y10=Sel_CurrPeak;
y11=Sel_LastHigh; 
x10=BarCount - 1 - Sel_CurrPeakBars - (LastValue(BarIndex()) - Sel_BarIndex);
x11=BarCount - 1 - Sel_LastHighBars - (LastValue(BarIndex()) - Sel_BarIndex);
Line1  = LineArray( x10, y10, x11, y11, 0 );

y20=Sel_PriorPeak;
y21=Sel_CurrPeak;
x20=BarCount - 1 - SelectedValue(Final_Bars)  - (LastValue(BarIndex())- Sel_BarIndex);
//x20=BarCount - 1 - Sel_PriorPeakBars  - (LastValue(BarIndex())- Sel_BarIndex);
x21=BarCount - 1 - Sel_CurrPeakBars   - (LastValue(BarIndex())- Sel_BarIndex);
Line2 = LineArray( x20, y20, x21, y21, 0 );

//Compute area to paint, based on MACD / Stochastic
if (Middle==50)
{
Area_MaxValue = 100;
PlotOver2 = IIf(BarIndex()  >= Sel_BarIndex  - (x21-x20)-(x11-x10) -1 AND
			    	BarIndex() <= Sel_BarIndex  - (x11-x10),Area_MaxValue,0);
PlotOver1 = IIf(BarIndex()  >= Sel_BarIndex  - (x11-x10) -1 AND BarIndex() <= Sel_BarIndex,Area_MaxValue,0);


if (SelectedValue(SDiv_Code)==15)
{
//Limit the blue bar for divergence to 2nd half of area for code 15
PlotDiverge = IIf(BarIndex() >= Sel_BarIndex - (x11-x10) -1
                        AND BarIndex() <= Sel_BarIndex AND Diverge=="Bearish",10,0);
}

if (SelectedValue(SDiv_Code)==13 OR SelectedValue(SDiv_Code)==17)
{
PlotDiverge = IIf(BarIndex() >= Sel_BarIndex - (x21-x20)-(x11-x10) -1
                        AND BarIndex() <= Sel_BarIndex AND Diverge=="Bearish",10,0);
}

}
else
{
Area_MinValue = Max(y10,y20);
PlotOver2 = IIf(BarIndex()  >= Sel_BarIndex  - (x21-x20)-(x11-x10) -1 AND
			    	BarIndex() <= Sel_BarIndex  - (x11-x10),Area_MinValue,0);
PlotOver1 = IIf(BarIndex()  >= Sel_BarIndex  - (x11-x10) -1 AND BarIndex() <= Sel_BarIndex,Area_MinValue,0);
}

} // end if backtest


if (Diag_Trace==1)
{
_TRACE("Bear Reversal #0 - Backtest " + WriteVal(Backtest,1.0));
_TRACE("Bear Reversal #1 - Sel_TurnDn_OK " + WriteVal(Sel_TurnDn_OK,1.0));
_TRACE("Bear Reversal #2 - CurrPeak " + WriteVal(Sel_CurrPeak,1.2) + "  CPBars " + WriteVal(Sel_CurrPeakBars,1.0)
                        + "  DivCode  " + WriteVal(SDiv_Code,1.0));
_TRACE("Bear Reversal #3 - LB_PGroup " + WriteVal(Sel_LastBar_PG,1.0) + "  FB_PGroup " + WriteVal(Sel_FirstBar_PG,1.0));
_TRACE("Bear Reversal #4 - Pk_PGroup " + WriteVal(PriorPeak,1.2) + "  PB_PG " + WriteVal(PriorPeakBars,1.0));
_TRACE("Bear Reversal #5 - xy1: x10=" + WriteVal(x10,1.0) + " y10=" + WriteVal(y10,1.2)
                       + "   x11=" + WriteVal(x11,1.0) + " y11=" + WriteVal(y11,1.2));
_TRACE("Bear Reversal $6 - xy2: x20=" + WriteVal(x20,1.0) + " y20=" + WriteVal(y20,1.2)
                       + "   x21=" + WriteVal(x21,1.0) + " y21=" + WriteVal(y21,1.2));
_TRACE("Bear Reversal - end ================================================ ");

} // end  Diag_Trace
} // end  Sel_TurnDn_OK
//  Add code for troughs


else
{
SDiv_Code    = 10;
}
return Sel_TurnDn_OK;
} //end DetectBearishReversal



//Determine Troughs
function DetectLastLow(Osc_Issue)
{
global LastLow, LastLowBars, TurnUp_OK, Sel_TurnUp_OK;

TurnUp_OK      = False;
Sel_TurnUp_OK  = False;
LastLow        = 0;
LastLowBars    = 0;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -