PureBytes Links
Trading Reference Links
|
Dude, that's a mountain of code you've cobbled together. Makes my head hurt looking at it. Maybe you
should start with something a bit simpler.. G
vin wrote:
> --- In amibroker@xxxxxxxxxxxxxxx, "vin" <vins1432000@xxx> wrote:
>
> i want to use this formula for eod for next day buy sell but i am
> getting problem how to work with this. also i want buy & sell alert
> with buy price & sell price along wth buy sell arrorowsin graph.
> kindly help me this formula in all level correct it if its wrong. also
> backtest, exploration, also create text alert for buy & sell signal
> genarates.
>
> formula is here
>
>
> // **************************
> // BEING EXPLORATION CODE
> // **************************
>
> // -- what will be our lookback range for the hh and ll?
> nBars = Param("Number of bars", 12, 5, 40);
> bTrace = Param("Include trace output", 1, 0, 1);
> nNoPivsInSetup = Param("No. Pivs in Setup", 4, 3, 4, 1);
> bShowTCZ = Param("Show TCZ", 1, 0, 1);
> nMinBarsBtwPivs = Param("Min. number of bars btw. pivots", 1, 1, 10, 1);
> nMinPctBtwPivs = Param("Min. percent diff. btw. pivots", .05, .04, .2,
> .01);
> bLastBarCanBePiv = Param("Last bar can be a pivot", 1, 0, 1);
> retrcTolerance = .01;
> tczTolerance = .005;
> nNumBarsToScan = 120;
>
> // -- added from exploration version 20040204
> nExploreBarIdx = 0;
> nExploreDate = 0;
> nCurDateNum = 0;
> DN = DateNum();
> DT = DateTime();
>
> // -- key exploration variables
> bTCZLong = Buy =False;
> bTCZShort = Sell =False;
> nAnchorPivIdx = 0;
>
> ADX8 = ADX(8);
>
> // 1 - INDICATOR, 2 - COMMENTARY, 3 - SCAN,
> // 4 - EXPLORATION, 5 - BACKTEST / Optimize
> if(Status("action")==1) {
> bDraw = True;
> bUseLastVis = Param("Use last visible bar", 1, 0, 1);
> } else {
> bDraw = False;
> bUseLastVis = False;
> bTrace = False;
> nExploreDate = Status("rangetodate");
> for (i=LastValue(BarIndex());i>=0;i--) {
> nCurDateNum = DN[i];
> if (nCurDateNum == nExploreDate) {
> nExploreBarIdx = i;
> }
> }
> // -- if(Status("action")==1...
> }
>
> GraphXSpace=7;
>
> // -- basic candle chart
> // -- if this appears inside if block, strange
> // drawing results!
> PlotOHLC(Open, High, Low, Close,
> "BIdx = " + BarIndex() +
> "\n" + "O = " + O + "\n"+"H = "+ H + "\n"+"L = " + L
> + "\n"+"C ",
> colorBlack, styleCandle);
>
> if (bDraw) {
> Plot(MA(C, 21), "21 bar MA", colorAqua,
> styleLine+styleNoRescale+styleNoLabel);
> Plot(MA(C, 55), "55 bar MA", colorGreen,
> styleLine+styleNoRescale+styleNoLabel);
> //Plot(MA(C, 233), "233 bar MA", colorDarkRed,
> // styleLine+styleNoRescale+styleNoLabel);
> }
>
> // -- Create 0-initialized arrays the size of barcount
> aHPivs = H - H;
> aLPivs = L - L;
> aHPivHighs = H - H;
> aLPivLows = L - L;
> aHPivIdxs = H - H;
> aLPivIdxs = L - L;
> aAddedHPivs = H - H;
> aAddedLPivs = L - L;
> aLegVol = H - H;
> aRetrcVol = H - H;
>
> nHPivs = 0;
> nLPivs = 0;
>
> lastHPIdx = 0;
> lastLPIdx = 0;
> lastHPH = 0;
> lastLPL = 0;
> curPivBarIdx = 0;
>
> // -- looking back from the current bar, how many bars
> // back were the hhv and llv values of the previous
> // n bars, etc.?
> aHHVBars = HHVBars(H, nBars);
> aLLVBars = LLVBars(L, nBars);
> aHHV = HHV(H, nBars);
> aLLV = LLV(L, nBars);
>
> // -- Initialize value of curTrend
> nLastVisBar = LastValue(
> Highest(IIf(Status("barvisible"), BarIndex(), 0)));
>
> curBar = IIf(nlastVisBar > 0 AND bUseLastVis, nlastVisBar,
> IIf(Status("action")==4 AND nExploreBarIdx > 0, nExploreBarIdx,
> LastValue(BarIndex())));
>
> curTrend = "";
> if (aLLVBars[curBar] < aHHVBars[curBar])
> curTrend = "D";
> else
> curTrend = "U";
>
> // -- Loop through bars. Search for
> // entirely array-based approach
> // in future version
> /* *******************
> Find main pivots
> ******************* */
>
> // -- Make sure there are enough bars!
> if (curBar >= nNumBarsToScan) {
> for (i=0; i<nNumBarsToScan; i++) {
>
> // -- value of curBar dependent on two parameters
> curBar = IIf(nlastVisBar > 0 AND bUseLastVis,
> nlastVisBar-i,
> IIf(Status("action")==4 AND nExploreBarIdx > 0,
> nExploreBarIdx-i,
> LastValue(BarIndex())-i));
>
> // -- Have we identified a pivot? If trend is down...
> if (aLLVBars[curBar] < aHHVBars[curBar]) {
>
> // ... and had been up, this is a trend change
> if (curTrend == "U") {
> curTrend = "D";
> // -- Capture pivot information
> curPivBarIdx = curBar - aLLVBars[curBar];
> aLPivs[curPivBarIdx] = 1;
> aLPivLows[nLPivs] = L[curPivBarIdx];
> aLPivIdxs[nLPivs] = curPivBarIdx;
> nLPivs++;
> }
> // -- or current trend is up
> } else {
> if (curTrend == "D") {
> curTrend = "U";
> curPivBarIdx = curBar - aHHVBars[curBar];
> aHPivs[curPivBarIdx] = 1;
> aHPivHighs[nHPivs] = H[curPivBarIdx];
> aHPivIdxs[nHPivs] = curPivBarIdx;
> nHPivs++;
> }
> // -- If curTrend is up...else...
> }
>
> // -- loop through bars
> }
> }
> /* *******************
> Found main pivots
> ******************* */
>
> /* *************************
> Finding missed pivot(s)
> ************************* */
>
> // -- Start at last bar. Reestablish curBar
> curBar =
> IIf(nlastVisBar > 0 AND bUseLastVis,
> nlastVisBar,
> IIf(Status("action")==4 AND nExploreBarIdx > 0,
> nExploreBarIdx,
> LastValue(BarIndex()))
> );
>
> // -- Make sure I found at least two of each above.
> if (nHPivs >= 2 AND nLPivs >= 2) {
>
> lastLPIdx = aLPivIdxs[0];
> lastLPL = aLPivLows[0];
>
> lastHPIdx = aHPivIdxs[0];
> lastHPH = aHPivHighs[0];
>
> nLastHOrLPivIdx = Max(lastLPIdx, lastHPIdx);
>
> nAddPivsRng = curBar - nLastHOrLPivIdx;
> aLLVAfterLastPiv = LLV(L, nAddPivsRng);
> nLLVAfterLastPiv = aLLVAfterLastPiv[curBar];
> aLLVIdxAfterLastPiv = LLVBars(L, nAddPivsRng);
> nLLVIdxAfterLastPiv = curBar - aLLVIdxAfterLastPiv[curBar];
> aHHVAfterLastPiv = HHV(H, nAddPivsRng);
> nHHVAfterLastPiv = aHHVAfterLastPiv[curBar];
> aHHVIdxAfterLastPiv = HHVBars(H, nAddPivsRng);
> nHHVIdxAfterLastPiv = curBar - aHHVIdxAfterLastPiv[curBar];
>
> // -- Later want to add last high pivot only if
> // not in buy mode from last and still in trade
>
> /*
> Note - I'm only interested in adding pivots if I'm in
> a higher-highs or lower-lows scenario
> */
>
>
> // -- OK, let's start where the last high pivot occurs after the
> // last Low pivot
> if (lastHPIdx > lastLPIdx) {
>
> /* There are at least two possibilities here. One is that
> the previous high was higher, indicating that this is a
> possible short retracement or one in the making.
> The other is that the previous high was lower, indicating
> that this is a possible long retracement in the working.
> However, both depend on opposing pivots. E.g., if I find
> higher highs, what if I have lower lows?
>
> If the highs are descending, then I can consider:
> - a lower low, and leave it at that
> - a higher high and higher low
> - a lower low and another lower high
> */
> if (aHPivHighs[0] < aHPivHighs[1]) {
>
> if (nLLVAfterLastPiv < aLPivLows[0] AND
> (nLLVIdxAfterLastPiv - lastHPIdx - 1) >= nMinBarsBtwPivs
> AND nLLVIdxAfterLastPiv != curBar ) {
>
> // -- OK, we'll add this as a pivot.
> // Mark it for plotting...
> aLPivs[nLLVIdxAfterLastPiv] = 1;
> aAddedLPivs[nLLVIdxAfterLastPiv] = 1;
>
> // ...and then rearrange elements in the
> // pivot information arrays
> for (j=0; j<nLPivs; j++) {
> aLPivLows[nLPivs-j] = aLPivLows[nLPivs-(j+1)];
> aLPivIdxs[nLPivs-j] = aLPivIdxs[nLPivs-(j+1)];
> }
> aLPivLows[0] = nLLVAfterLastPiv;
> aLPivIdxs[0] = nLLVIdxAfterLastPiv;
> nLPivs++;
>
> // -- Test whether to add piv given last piv is high
> // AND we have lower highs
> }
>
> // -- Here, the last piv is a high piv, and we have
> // higher-highs. The most likely addition is a
> // Low piv that is a retracement.
> } else {
>
> if (nLLVAfterLastPiv > aLPivLows[0] AND
> (nLLVIdxAfterLastPiv - lastHPIdx - 1) >= nMinBarsBtwPivs
> AND nLLVIdxAfterLastPiv != curBar ) {
>
> // -- OK, we'll add this as a pivot.
> // Mark it for plotting...
> aLPivs[nLLVIdxAfterLastPiv] = 1;
> aAddedLPivs[nLLVIdxAfterLastPiv] = 1;
>
> // ...and then rearrange elements in the
> // pivot information arrays
> for (j=0; j<nLPivs; j++) {
> aLPivLows[nLPivs-j] = aLPivLows[nLPivs-(j+1)];
> aLPivIdxs[nLPivs-j] = aLPivIdxs[nLPivs-(j+1)];
> }
> aLPivLows[0] = nLLVAfterLastPiv;
> aLPivIdxs[0] = nLLVIdxAfterLastPiv;
> nLPivs++;
>
> // -- Test whether to add piv given last piv is high
> // AND we have lower highs
> }
> // -- The last piv is a high and we have higher highs
> // OR lower highs
> }
>
> /* ****************************************************************
> Still finding missed pivot(s). Here, the last piv is a low piv.
> **************************************************************** */
> } else {
>
> // -- First case, lower highs
> if (aHPivHighs[0] < aHPivHighs[1]) {
>
> if (nHHVAfterLastPiv < aHPivHighs[0] AND
> (nHHVIdxAfterLastPiv - lastLPIdx - 1) >= nMinBarsBtwPivs
> AND nHHVIdxAfterLastPiv != curBar ) {
>
> // -- OK, we'll add this as a pivot.
> // Mark that for plotting
> aHPivs[nHHVIdxAfterLastPiv] = 1;
> aAddedHPivs[nHHVIdxAfterLastPiv] = 1;
>
> // ...and then rearrange elements in the
> // pivot information arrays
> for (j=0; j<nHPivs; j++) {
> aHPivHighs[nHPivs-j] = aHPivHighs[nHPivs-(j+1)];
> aHPivIdxs[nHPivs-j] = aHPivIdxs[nhPivs-(j+1)];
> }
> aHPivHighs[0] = nHHVAfterLastPiv;
> aHPivIdxs[0] = nHHVIdxAfterLastPiv;
> nHPivs++;
>
> // -- Test whether to add piv given last piv is high
> // AND we have lower highs
> }
>
> // -- Second case when last piv is a low piv, higher highs
> // Most likely addition is high piv that is a retracement.
> // Considering adding a high piv as long as it is higher
> } else {
>
> // -- Where I have higher highs,
> if (nHHVAfterLastPiv > aHPivHighs[0] AND
> (nHHVIdxAfterLastPiv - lastLPIdx - 1) >= nMinBarsBtwPivs
> AND nHHVIdxAfterLastPiv != curBar ) {
>
> // -- OK, we'll add this as a pivot.
> // Mark it for plotting...
> aHPivs[nHHVIdxAfterLastPiv] = 1;
> aAddedHPivs[nHHVIdxAfterLastPiv] = 1;
>
> // ...and then rearrange elements in the
> // pivot information arrays
> for (j=0; j<nHPivs; j++) {
> aHPivHighs[nHPivs-j] = aHPivHighs[nHPivs-(j+1)];
> aHPivIdxs[nHPivs-j] = aHPivIdxs[nhPivs-(j+1)];
> }
> aHPivHighs[0] = nHHVAfterLastPiv;
> aHPivIdxs[0] = nHHVIdxAfterLastPiv;
> nHPivs++;
>
> // -- Test whether to add piv given last piv is high
> // AND we have lower highs
> }
>
> }
>
> }
>
> // -- If there are at least two of each
> }
>
> /* ****************************************
> // -- Done with finding pivots
> ***************************************** */
>
> if (bDraw) {
>
> // -- OK, let's plot the pivots using arrows
> PlotShapes(
> IIf(aHPivs==1, shapeDownArrow, shapeNone),
> colorRed, 0, High, Offset=-15);
> PlotShapes(
> IIf(aAddedHPivs==1, shapeDownArrow, shapeNone),
> colorDarkRed, 0, High, Offset=-15);
> PlotShapes(
> IIf(aLPivs==1, shapeUpArrow , shapeNone),
> colorGreen, 0, Low, Offset=-15);
> PlotShapes(
> IIf(aAddedLPivs==1, shapeUpArrow , shapeNone),
> colorDarkGreen, 0, Low, Offset=-15);
> }
>
>
> /* ****************************************
> // -- Done with discovering and plotting pivots
> ***************************************** */
>
> // -- I'm going to want to look for possible retracement
> risk = 0;
> profInc = 0;
> nLeg0Pts = 0;
> nLeg0Bars = 0;
> nLeg0Vol = 0;
> nLeg1Pts = 0;
> nLeg1Bars = 0;
> nLeg1Vol = 0;
> nLegBarsDiff = 0;
> nRtrc0Pts = 0;
> nRtrc0Bars = 0;
> nRtrc0Vol = 0;
> nRtrc1Pts = 0;
> nRtrc1Bars = 0;
> nRtrc1Vol = 0;
>
> minRtrc = 0;
> maxRtrc = 0;
> minLine = 0;
> maxLine = 0;
> triggerLine = 0;
> firstProfitLine = 0;
> triggerInc = 0;
> triggerPrc = 0;
> firstProfitPrc = 0;
> retrcPrc = 0;
> retrcBar = 0;
> retrcBarIdx = 0;
> retrcRng = 0;
> aRetrcPrc = H-H;
> aRetrcPrcBars = H-H;
> aRetrcClose = C;
> retrcClose = 0;
>
> // -- Do TCZ calcs. Arrangement of pivs very specific
> // for this setup.
> if (nHPivs >= 2 AND
> nLPivs >=2 AND
> aHPivHighs[0] > aHPivHighs[1] AND
> aLPivLows[0] > aLPivLows[1]) {
>
> tcz500 =
> (aHPivHighs[0] -
> (.5 * (aHPivHighs[0] - aLPivLows[1])));
>
> tcz618 =
> (aHPivHighs[0] -
> (.618 * (aHPivHighs[0] - aLPivLows[1])));
>
> tcz786 =
> (aHPivHighs[0] -
> (.786 * (aHPivHighs[0] - aLPivLows[0])));
>
> retrcRng = curBar - aHPivIdxs[0];
> aRetrcPrc = LLV(L, retrcRng);
> retrcPrc = aRetrcPrc[curBar];
> aRetrcPrcBars = LLVBars(L, retrcRng);
> retrcBarIdx = curBar - aRetrcPrcBars[curBar];
> retrcClose = aRetrcClose[retrcBarIdx];
>
> // -- bTCZLong setup?
> bTCZLong = (
>
> // -- Are retracement levels arranged in
> // tcz order?
> tcz500 >= (tcz786 * (1 - tczTolerance))
> AND
> // .681 is below .786 for long setups
> tcz618 <= (tcz786 * (1 + tczTolerance))
> AND
>
> // -- Is the low in the tcz range
> // -- Is the close >= low of tcz range
> // and low <= high of tcz range
> retrcClose >= ((1 - retrcTolerance) * tcz618)
> AND
> retrcPrc <= ((1 + retrcTolerance) * tcz500)
> );
>
> // -- risk would be high of signal bar minus low of zone
> //risk = 0;
>
> // -- lower highs and lower lows
> } else if (nHPivs >= 2 AND nLPivs >=2
> AND aHPivHighs[0] < aHPivHighs[1]
> AND aLPivLows[0] < aLPivLows[1]) {
>
> tcz500 =
> (aHPivHighs[1] -
> (.5 * (aHPivHighs[1] - aLPivLows[0])));
>
> tcz618 =
> (aHPivHighs[0] -
> (.618 * (aHPivHighs[1] - aLPivLows[0])));
>
> tcz786 =
> (aHPivHighs[0] -
> (.786 * (aHPivHighs[0] - aLPivLows[0])));
>
> retrcRng = curBar - aLPivIdxs[0];
> aRetrcPrc = HHV(H, retrcRng);
> retrcPrc = aRetrcPrc[curBar];
> aRetrcPrcBars = HHVBars(H, retrcRng);
> retrcBarIdx = curBar - aRetrcPrcBars[curBar];
> retrcClose = aRetrcClose[retrcBarIdx];
>
> bTCZShort = (
> // -- Are retracement levels arranged in
> // tcz order?
>
> // .500 is below .786 for short setups
> tcz500 <= (tcz786 * (1 + tczTolerance))
> AND
> // .681 is above .786 for short setups
> tcz618 >= (tcz786 * (1 - tczTolerance))
> AND
>
> // -- Is the close <= high of tcz range
> // and high >= low of tcz range
> retrcClose <= ((1 + retrcTolerance) * tcz618)
> AND
> retrcPrc >= ((1 - retrcTolerance) * tcz500)
> );
>
> // -- Risk would be top of zone - low of signal bar
> //risk = 0;
> }
>
> Filter = (bTCZShort OR bTCZLong);
> AddColumn(C, "Close");
> AddColumn(IIf(bTCZLong, 76, 83), "L/S", formatChar);
>
> // **************************
> // END EXPLORATION CODE
> // **************************
>
> // **************************
> // BEGIN INDICATOR CODE
> // **************************
>
> // -- what will be our lookback range for the hh and ll?
> nBars = Param("Number of bars", 12, 5, 40);
> bTrace = Param("Include trace output", 1, 0, 1);
> nNoPivsInSetup = Param("No. Pivs in Setup", 4, 3, 4, 1);
> bShowTCZ = Param("Show TCZ", 1, 0, 1);
> nMinBarsBtwPivs = Param("Min. number of bars btw. pivots", 1, 1, 10, 1);
> nMinPctBtwPivs = Param("Min. percent diff. btw. pivots", .05, .04, .2,
> .01);
> bLastBarCanBePiv = Param("Last bar can be a pivot", 1, 0, 1);
> retrcTolerance = .01;
> tczTolerance = .005;
> nNumBarsToScan = 120;
>
> // -- added from exploration version 20040204
> nExploreBarIdx = 0;
> nExploreDate = 0;
> nCurDateNum = 0;
> DN = DateNum();
> DT = DateTime();
>
> // -- key exploration variables
> bTCZLong = Buy = False;
> bTCZShort = Sell = False;
> nAnchorPivIdx = 0;
>
> ADX8 = ADX(8);
>
> // 1 - INDICATOR, 2 - COMMENTARY, 3 - SCAN,
> // 4 - EXPLORATION, 5 - BACKTEST / Optimize
> if(Status("action")==1) {
> bDraw = True;
> bUseLastVis = Param("Use last visible bar", 1, 0, 1);
> } else {
> bDraw = False;
> bUseLastVis = False;
> bTrace = False;
> nExploreDate = Status("rangetodate");
> for (i=LastValue(BarIndex());i>=0;i--) {
> nCurDateNum = DN[i];
> if (nCurDateNum == nExploreDate) {
> nExploreBarIdx = i;
> }
> }
> // -- if(Status("action")==1...
> }
>
> GraphXSpace=7;
>
> // -- basic candle chart
> // -- if this appears inside if block, strange
> // drawing results!
> PlotOHLC(Open, High, Low, Close,
> "BIdx = " + BarIndex() +
> "\n" + "O = " + O + "\n"+"H = "+ H + "\n"+"L = " + L
> + "\n"+"C ",
> colorBlack, styleCandle);
>
> if (bDraw) {
> Plot(MA(C, 21), "21 bar MA", colorAqua,
> styleLine+styleNoRescale+styleNoLabel);
> Plot(MA(C, 55), "55 bar MA", colorGreen,
> styleLine+styleNoRescale+styleNoLabel);
> //Plot(MA(C, 233), "233 bar MA", colorDarkRed,
> // styleLine+styleNoRescale+styleNoLabel);
> }
>
> // -- Create 0-initialized arrays the size of barcount
> aHPivs = H - H;
> aLPivs = L - L;
> aHPivHighs = H - H;
> aLPivLows = L - L;
> aHPivIdxs = H - H;
> aLPivIdxs = L - L;
> aAddedHPivs = H - H;
> aAddedLPivs = L - L;
> aLegVol = H - H;
> aRetrcVol = H - H;
>
> nHPivs = 0;
> nLPivs = 0;
>
> lastHPIdx = 0;
> lastLPIdx = 0;
> lastHPH = 0;
> lastLPL = 0;
> curPivBarIdx = 0;
>
> // -- looking back from the current bar, how many bars
> // back were the hhv and llv values of the previous
> // n bars, etc.?
> aHHVBars = HHVBars(H, nBars);
> aLLVBars = LLVBars(L, nBars);
> aHHV = HHV(H, nBars);
> aLLV = LLV(L, nBars);
>
> // -- Initialize value of curTrend
> nLastVisBar = LastValue(
> Highest(IIf(Status("barvisible"), BarIndex(), 0)));
>
> curBar = IIf(nlastVisBar > 0 AND bUseLastVis, nlastVisBar,
> IIf(Status("action")==4 AND nExploreBarIdx > 0, nExploreBarIdx,
> LastValue(BarIndex())));
>
> curTrend = "";
> if (aLLVBars[curBar] < aHHVBars[curBar])
> curTrend = "D";
> else
> curTrend = "U";
>
> // -- Loop through bars. Search for
> // entirely array-based approach
> // in future version
> /* *******************
> Find main pivots
> ******************* */
>
> // -- Make sure there are enough bars!
> if (curBar >= nNumBarsToScan) {
> for (i=0; i<nNumBarsToScan; i++) {
>
> // -- value of curBar dependent on two parameters
> curBar = IIf(nlastVisBar > 0 AND bUseLastVis,
> nlastVisBar-i,
> IIf(Status("action")==4 AND nExploreBarIdx > 0,
> nExploreBarIdx-i,
> LastValue(BarIndex())-i));
>
> // -- Have we identified a pivot? If trend is down...
> if (aLLVBars[curBar] < aHHVBars[curBar]) {
>
> // ... and had been up, this is a trend change
> if (curTrend == "U") {
> curTrend = "D";
> // -- Capture pivot information
> curPivBarIdx = curBar - aLLVBars[curBar];
> aLPivs[curPivBarIdx] = 1;
> aLPivLows[nLPivs] = L[curPivBarIdx];
> aLPivIdxs[nLPivs] = curPivBarIdx;
> nLPivs++;
> }
> // -- or current trend is up
> } else {
> if (curTrend == "D") {
> curTrend = "U";
> curPivBarIdx = curBar - aHHVBars[curBar];
> aHPivs[curPivBarIdx] = 1;
> aHPivHighs[nHPivs] = H[curPivBarIdx];
> aHPivIdxs[nHPivs] = curPivBarIdx;
> nHPivs++;
> }
> // -- If curTrend is up...else...
> }
>
> // -- loop through bars
> }
> }
> /* *******************
> Found main pivots
> ******************* */
>
> /* *************************
> Finding missed pivot(s)
> ************************* */
>
> // -- Start at last bar. Reestablish curBar
> curBar =
> IIf(nlastVisBar > 0 AND bUseLastVis,
> nlastVisBar,
> IIf(Status("action")==4 AND nExploreBarIdx > 0,
> nExploreBarIdx,
> LastValue(BarIndex()))
> );
>
> // -- Make sure I found at least two of each above.
> if (nHPivs >= 2 AND nLPivs >= 2) {
>
> lastLPIdx = aLPivIdxs[0];
> lastLPL = aLPivLows[0];
>
> lastHPIdx = aHPivIdxs[0];
> lastHPH = aHPivHighs[0];
>
> nLastHOrLPivIdx = Max(lastLPIdx, lastHPIdx);
>
> nAddPivsRng = curBar - nLastHOrLPivIdx;
> aLLVAfterLastPiv = LLV(L, nAddPivsRng);
> nLLVAfterLastPiv = aLLVAfterLastPiv[curBar];
> aLLVIdxAfterLastPiv = LLVBars(L, nAddPivsRng);
> nLLVIdxAfterLastPiv = curBar - aLLVIdxAfterLastPiv[curBar];
> aHHVAfterLastPiv = HHV(H, nAddPivsRng);
> nHHVAfterLastPiv = aHHVAfterLastPiv[curBar];
> aHHVIdxAfterLastPiv = HHVBars(H, nAddPivsRng);
> nHHVIdxAfterLastPiv = curBar - aHHVIdxAfterLastPiv[curBar];
>
> // -- Later want to add last high pivot only if
> // not in buy mode from last and still in trade
>
> /*
> Note - I'm only interested in adding pivots if I'm in
> a higher-highs or lower-lows scenario
> */
>
>
> // -- OK, let's start where the last high pivot occurs after the
> // last Low pivot
> if (lastHPIdx > lastLPIdx) {
>
> /* There are at least two possibilities here. One is that
> the previous high was higher, indicating that this is a
> possible short retracement or one in the making.
> The other is that the previous high was lower, indicating
> that this is a possible long retracement in the working.
> However, both depend on opposing pivots. E.g., if I find
> higher highs, what if I have lower lows?
>
> If the highs are descending, then I can consider:
> - a lower low, and leave it at that
> - a higher high and higher low
> - a lower low and another lower high
> */
> if (aHPivHighs[0] < aHPivHighs[1]) {
>
> if (nLLVAfterLastPiv < aLPivLows[0] AND
> (nLLVIdxAfterLastPiv - lastHPIdx - 1) >= nMinBarsBtwPivs
> AND nLLVIdxAfterLastPiv != curBar ) {
>
> // -- OK, we'll add this as a pivot.
> // Mark it for plotting...
> aLPivs[nLLVIdxAfterLastPiv] = 1;
> aAddedLPivs[nLLVIdxAfterLastPiv] = 1;
>
> // ...and then rearrange elements in the
> // pivot information arrays
> for (j=0; j<nLPivs; j++) {
> aLPivLows[nLPivs-j] = aLPivLows[nLPivs-(j+1)];
> aLPivIdxs[nLPivs-j] = aLPivIdxs[nLPivs-(j+1)];
> }
> aLPivLows[0] = nLLVAfterLastPiv;
> aLPivIdxs[0] = nLLVIdxAfterLastPiv;
> nLPivs++;
>
> // -- Test whether to add piv given last piv is high
> // AND we have lower highs
> }
>
> // -- Here, the last piv is a high piv, and we have
> // higher-highs. The most likely addition is a
> // Low piv that is a retracement.
> } else {
>
> if (nLLVAfterLastPiv > aLPivLows[0] AND
> (nLLVIdxAfterLastPiv - lastHPIdx - 1) >= nMinBarsBtwPivs
> AND nLLVIdxAfterLastPiv != curBar ) {
>
> // -- OK, we'll add this as a pivot.
> // Mark it for plotting...
> aLPivs[nLLVIdxAfterLastPiv] = 1;
> aAddedLPivs[nLLVIdxAfterLastPiv] = 1;
>
> // ...and then rearrange elements in the
> // pivot information arrays
> for (j=0; j<nLPivs; j++) {
> aLPivLows[nLPivs-j] = aLPivLows[nLPivs-(j+1)];
> aLPivIdxs[nLPivs-j] = aLPivIdxs[nLPivs-(j+1)];
> }
> aLPivLows[0] = nLLVAfterLastPiv;
> aLPivIdxs[0] = nLLVIdxAfterLastPiv;
> nLPivs++;
>
> // -- Test whether to add piv given last piv is high
> // AND we have lower highs
> }
> // -- The last piv is a high and we have higher highs
> // OR lower highs
> }
>
> /* ****************************************************************
> Still finding missed pivot(s). Here, the last piv is a low piv.
> **************************************************************** */
> } else {
>
> // -- First case, lower highs
> if (aHPivHighs[0] < aHPivHighs[1]) {
>
> if (nHHVAfterLastPiv < aHPivHighs[0] AND
> (nHHVIdxAfterLastPiv - lastLPIdx - 1) >= nMinBarsBtwPivs
> AND nHHVIdxAfterLastPiv != curBar ) {
>
> // -- OK, we'll add this as a pivot.
> // Mark that for plotting
> aHPivs[nHHVIdxAfterLastPiv] = 1;
> aAddedHPivs[nHHVIdxAfterLastPiv] = 1;
>
> // ...and then rearrange elements in the
> // pivot information arrays
> for (j=0; j<nHPivs; j++) {
> aHPivHighs[nHPivs-j] = aHPivHighs[nHPivs-(j+1)];
> aHPivIdxs[nHPivs-j] = aHPivIdxs[nhPivs-(j+1)];
> }
> aHPivHighs[0] = nHHVAfterLastPiv;
> aHPivIdxs[0] = nHHVIdxAfterLastPiv;
> nHPivs++;
>
> // -- Test whether to add piv given last piv is high
> // AND we have lower highs
> }
>
> // -- Second case when last piv is a low piv, higher highs
> // Most likely addition is high piv that is a retracement.
> // Considering adding a high piv as long as it is higher
> } else {
>
> // -- Where I have higher highs,
> if (nHHVAfterLastPiv > aHPivHighs[0] AND
> (nHHVIdxAfterLastPiv - lastLPIdx - 1) >= nMinBarsBtwPivs
> AND nHHVIdxAfterLastPiv != curBar ) {
>
> // -- OK, we'll add this as a pivot.
> // Mark it for plotting...
> aHPivs[nHHVIdxAfterLastPiv] = 1;
> aAddedHPivs[nHHVIdxAfterLastPiv] = 1;
>
> // ...and then rearrange elements in the
> // pivot information arrays
> for (j=0; j<nHPivs; j++) {
> aHPivHighs[nHPivs-j] = aHPivHighs[nHPivs-(j+1)];
> aHPivIdxs[nHPivs-j] = aHPivIdxs[nhPivs-(j+1)];
> }
> aHPivHighs[0] = nHHVAfterLastPiv;
> aHPivIdxs[0] = nHHVIdxAfterLastPiv;
> nHPivs++;
>
> // -- Test whether to add piv given last piv is high
> // AND we have lower highs
> }
>
> }
>
> }
>
> // -- If there are at least two of each
> }
>
> /* ****************************************
> // -- Done with finding pivots
> ***************************************** */
>
> if (bDraw) {
>
> // -- OK, let's plot the pivots using arrows
> PlotShapes(
> IIf(aHPivs==1, shapeDownArrow, shapeNone),
> colorRed, 0, High, Offset=-15);
> PlotShapes(
> IIf(aAddedHPivs==1, shapeDownArrow, shapeNone),
> colorDarkRed, 0, High, Offset=-15);
> PlotShapes(
> IIf(aLPivs==1, shapeUpArrow , shapeNone),
> colorGreen, 0, Low, Offset=-15);
> PlotShapes(
> IIf(aAddedLPivs==1, shapeUpArrow , shapeNone),
> colorDarkGreen, 0, Low, Offset=-15);
> }
>
>
> /* ****************************************
> // -- Done with discovering and plotting pivots
> ***************************************** */
>
> // -- I'm going to want to look for possible retracement
> risk = 0;
> profInc = 0;
> nLeg0Pts = 0;
> nLeg0Bars = 0;
> nLeg0Vol = 0;
> nLeg1Pts = 0;
> nLeg1Bars = 0;
> nLeg1Vol = 0;
> nLegBarsDiff = 0;
> nRtrc0Pts = 0;
> nRtrc0Bars = 0;
> nRtrc0Vol = 0;
> nRtrc1Pts = 0;
> nRtrc1Bars = 0;
> nRtrc1Vol = 0;
>
> minRtrc = 0;
> maxRtrc = 0;
> minLine = 0;
> maxLine = 0;
> triggerLine = 0;
> firstProfitLine = 0;
> triggerInc = 0;
> triggerPrc = 0;
> firstProfitPrc = 0;
> retrcPrc = 0;
> retrcBar = 0;
> retrcBarIdx = 0;
> retrcRng = 0;
> aRetrcPrc = H-H;
> aRetrcPrcBars = H-H;
> aRetrcClose = C;
> retrcClose = 0;
>
> // -- Do TCZ calcs. Arrangement of pivs very specific
> // for this setup.
> if (nHPivs >= 2 AND
> nLPivs >=2 AND
> aHPivHighs[0] > aHPivHighs[1] AND
> aLPivLows[0] > aLPivLows[1]) {
>
> tcz500 =
> (aHPivHighs[0] -
> (.5 * (aHPivHighs[0] - aLPivLows[1])));
>
> tcz618 =
> (aHPivHighs[0] -
> (.618 * (aHPivHighs[0] - aLPivLows[1])));
>
> tcz786 =
> (aHPivHighs[0] -
> (.786 * (aHPivHighs[0] - aLPivLows[0])));
>
> retrcRng = curBar - aHPivIdxs[0];
> aRetrcPrc = LLV(L, retrcRng);
> aRetrcPrcBars = LLVBars(L, retrcRng);
>
> retrcPrc = aRetrcPrc[curBar];
> retrcBarIdx = curBar - aRetrcPrcBars[curBar];
> retrcClose = aRetrcClose[retrcBarIdx];
>
> // -- bTCZLong setup?
> bTCZLong = (
>
> // -- Are retracement levels arranged in
> // tcz order?
>
> // .500 is above .786 for long setups
> tcz500 >= (tcz786 * (1 - tczTolerance))
> AND
> // .681 is below .786 for long setups
> tcz618 <= (tcz786 * (1 + tczTolerance))
> AND
>
> // -- Is the low in the tcz range
> // -- Is the close >= low of tcz range
> // and low <= high of tcz range
> retrcClose >= ((1 - retrcTolerance) * tcz618)
> AND
> retrcPrc <= ((1 + retrcTolerance) * tcz500)
> );
>
> // -- risk would be high of signal bar minus low of zone
> //risk = 0;
>
> // -- lower highs and lower lows
> } else if (nHPivs >= 2 AND nLPivs >=2
> AND aHPivHighs[0] < aHPivHighs[1]
> AND aLPivLows[0] < aLPivLows[1]) {
>
> tcz500 =
> (aHPivHighs[1] -
> (.5 * (aHPivHighs[1] - aLPivLows[0])));
>
> tcz618 =
> (aHPivHighs[0] -
> (.618 * (aHPivHighs[1] - aLPivLows[0])));
>
> tcz786 =
> (aHPivHighs[0] -
> (.786 * (aHPivHighs[0] - aLPivLows[0])));
>
> retrcRng = curBar - aLPivIdxs[0];
> aRetrcPrc = HHV(H, retrcRng);
> retrcPrc = aRetrcPrc[curBar];
> aRetrcPrcBars = HHVBars(H, retrcRng);
> retrcBarIdx = curBar - aRetrcPrcBars[curBar];
> retrcClose = aRetrcClose[retrcBarIdx];
>
> bTCZShort = (
> // -- Are retracement levels arranged in
> // tcz order?
>
> // .500 is below .786 for short setups
> tcz500 <= (tcz786 * (1 + tczTolerance))
> AND
> // .681 is above .786 for short setups
> tcz618 >= (tcz786 * (1 - tczTolerance))
> AND
>
> // -- Is the close <= high of tcz range
> // and high >= low of tcz range
> retrcClose <= ((1 + retrcTolerance) * tcz618)
> AND
> retrcPrc >= ((1 - retrcTolerance) * tcz500)
> );
>
> // -- Risk would be top of zone - low of signal bar
> //risk = 0;
> }
>
> // -- Show zone if present
> if (bTCZShort OR bTCZLong) {
>
> // -- Be prepared to see symmetry
> if (bTCZShort) {
> if (aLPivIdxs[0] > aHPivIdxs[0]) {
> // -- Valuable, useful symmetry information
> nRtrc0Pts = aHPivHighs[0] - aLPivLows[1];
> nRtrc0Bars = aHPivIdxs[0] - aLPivIdxs[1] + 1;
> nRtrc1Pts = retrcPrc - aLPivLows[0];
> nRtrc1Bars = retrcBarIdx - aLPivIdxs[0] + 1;
> } else {
> nRtrc0Pts = aHPivHighs[1] - aLPivLows[1];
> nRtrc0Bars = aHPivIdxs[1] - aLPivIdxs[1] + 1;
> nRtrc1Pts = aHPivHighs[0] - aLPivLows[0];
> nRtrc1Bars = aHPivIdxs[0] - aLPivIdxs[0] + 1;
> }
> } else { // bLongSetup
> if (aLPivIdxs[0] > aHPivIdxs[0]) {
> nRtrc0Pts = aHPivHighs[0] - aLPivLows[1];
> nRtrc0Bars = aHPivIdxs[0] - aLPivIdxs[1] + 1;
> nRtrc1Pts = retrcPrc - aLPivLows[0];
> nRtrc1Bars = retrcBarIdx - aLPivIdxs[0] + 1;
> } else {
> nRtrc0Pts = aHPivHighs[1] - aLPivLows[0];
> nRtrc0Bars = aLPivIdxs[0] - aHPivIdxs[1] + 1;
> nRtrc1Pts = aHPivHighs[0] - aLPivLows[0];
> nRtrc1Bars = aLPivIdxs[0] - aHPivIdxs[0] + 1;
> }
> }
>
> if (bShowTCZ) {
> Plot(
> LineArray( IIf(bTCZLong, aHPivIdxs[0], aLPivIdxs[0]),
> tcz500, curBar, tcz500 , 0),
> "tcz500", colorPaleBlue, styleLine);
> Plot(
> LineArray( IIf(bTCZLong, aHPivIdxs[0], aLPivIdxs[0]),
> tcz618, curBar, tcz618, 0),
> "tcz618", colorPaleBlue, styleLine);
> Plot(
> LineArray( IIf(bTCZLong, aHPivIdxs[0], aLPivIdxs[0]),
> tcz786, curBar, tcz786, 0),
> "tcz786", colorTurquoise, styleLine);
> }
>
> // -- if (bShowTCZ)
> }
>
> if (bDraw) {
> Title = Name() + " (" + StrLeft(FullName(), 10) +
> ") ATR: " + NumToStr(ATR(1), 4.2) + " ( " +
> NumToStr((C - Ref(C, -1)), 4.2) + " / " +
> NumToStr((((C - Ref(C, -1)) / Ref(C, -1)) * 100), 2.1) + "% ) " +
> WriteVal( SelectedValue( DateTime() ), formatDateTime) +
> " \nO: " + Open +
> ", \nH: " + High +
> ", \nL: " + Low +
> ", \nC: " + Close + ", \n" +
> // "Risk: " + WriteVal(risk, 2.1) + "% \n" +
> "Rtrc 0/1 Pts: " + WriteVal(nRtrc0Pts, 2.1) + "/" +
> WriteVal(nRtrc1Pts, 2.1) + " \n" +
> "Rtrc 0/1 Bars: " + WriteVal(nRtrc0Bars, 2.0) + "/" +
> WriteVal(nRtrc1Bars, 2.0);
> }
>
> // **************************
> // END INDICATOR CODE
> // **************************
>
> //Filter = (bTCZShort OR bTCZLong) AND C > $2 AND C < $20;
>
> Buy = Cover = Filter ;
> Sell = Short = aAddedHPivs;
> Buy = ExRem(Buy,Sell);
> Sell = ExRem(Sell,Buy);
> AddColumn(C, "Close");
> //AddColumn(IIf(bTCZLong, 76, 83), "L/S", formatChar);
>
> ////////////////////////
> num = Param("trend",3,1,6,1);
>
> FirstVisibleBar = Status( "FirstVisibleBar" );
> Lastvisiblebar = Status("LastVisibleBar");
>
> for( b = Firstvisiblebar + num; b <= Lastvisiblebar AND b < BarCount -
> num; b++)
> {
> i = num;
> ml = 0;
> mu = 0;
> while( i > 0 )
> {
> if (L[b] <= L[b-i] && L[b] <= L[b+i] )
> {
> ml++;
> }
> if (H[b] >= H[b-i] && H[b] >= H[b+i] )
> {
> mu++;
> }
> i--;
> }
> if ( ml == num )
> {
> PlotText("\n***\n",b,L[b],colorGreen);
> }
> if ( mu == num )
> {
> PlotText("***\n",b,H[b],colorRed);
> }
> }
>
> _SECTION_BEGIN("Alert Output As Quick Rewiev");
> //========================= QUICK VIEW [alert]
> =============================
> //==============================================================================
> //××× Period at finding changes at stocks price
> ××××××××××××××××××××××××××××
> x =-90;
> eDay =-1;
> eWeek =-5;
> eMonth =-20;
> eQTR =-60;
> eYEAR =-260;
> user =x;
> //××× HLEDANÁ DÉLKA
> ××××××××××××××××××××××××××××××××××××××××××××××××××××××××
> qvCAS = eDay; // There enter lenght period
> !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
> //××× PODMÍNKY
> ×××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××
> qvCE =C;
> qvHLEDANE =Ref(C,qvCAS);
> qvBODY =qvCE-qvHLEDANE;
> qvPROCENTA =100*(qvCE-qvHLEDANE)/qvHLEDANE;
> //××× EXPLORE
> ××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××
> Filter = C;
> AddTextColumn(Name(),"Ticker",2, IIf( MarketID()==0,5,4));
> AddColumn(qvHLEDANE,"Prev.Price",1.2);
> AddColumn(C,"Price",1.2,IIf(C<1,11,IIf(C>=1 AND C<3,12,IIf(C>=3 AND
> C<20,1,0))));
> ;
> AddColumn(qvBODY,"Change in $",1.2,2
> ,IIf(qvBODY>=0.001,5,IIf(qvBODY==0,9,4 )));
> AddColumn(qvPROCENTA,"Change in %",1.2,2
> ,IIf(qvPROCENTA>=0.001,5,IIf(qvPROCENTA==0,9,4 )));//××× ALERT
> ××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××
> Buy = qvPROCENTA>0;
> Cover= qvProcenta==0;
> Sell = qvPROCENTA<0;
> AlertIf( Buy,"",WriteVal(qvPROCENTA,1.2),1,1,0 );
> AlertIf( Sell,"",WriteVal(qvPROCENTA,1.2),2,1,0 );
> AlertIf( Cover,"",WriteVal(qvPROCENTA,1.2),0,1,0 );
> //××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××
>
> _SECTION_END();
>
> _SECTION_BEGIN("Application of Ehler filter");
> // ehler filter based on acclerartion and speed
> // x - input
> // n - length of FIR
> // w - exponential weight of passed acceleration and speed
> // f - weighting factor between acceleration and speed
> function Ehler1( x, V, n, w,f)
> {y=x;
> // acceleration + speed
> a = x-2*Ref(x,-1) + Ref(x,-2);
> s = f*(x-Ref(x,-1));
> q=AMA(V*(abs(a)+abs(s))/x,w);
>
> for( i = n-1; i < BarCount; i++ )
> {
> sy=0;sw=0;
> for (j=i-n+1; j<i+1; j++)
> {sy = sy + q[j]*x[j];
> sw = sw + q[j];
> }
> y[i]=sy/sw;
> }
> return y;
> }
> w=Param("w",0.62,0.05,0.99,0.01);
> n=Param("n",8,1,42,1);
> f=Param("f",-0.3,-10,10,0.1);
> f=10^f;
> eh=Ehler1(C,V,n,w,f);
> Plot( Close, "Price", colorBlack, styleCandle );
> Plot( eh, "Ehler", colorBlack );
> Plot( MA(C,n), "MA", colorBlue );
>
> _SECTION_END();
>
> _SECTION_BEGIN("ATR Study");
> //* ATR Study: */
>
> Exclude = MA(V,50)<200 ;
> MaxGraph = 12;
> Graph0 = C;
> Graph0Color = 1;
> Graph0Style = 64;
>
> BuyOffSet = 18;//Optimize("BuyOffSet",18,15,20,1);
> SellOffset = BuyOffSet;//Optimize("SellOffset",2,2,14,2);
> RegLength = 5;//Optimize("RegLength",5, 2,11,2);
> BuyATRPeriod = 2;//Optimize("BuyATRPeriod",2,2,5,1);
> SellATRPeriod = BuyATRPeriod;//Optimize("SellATRPeriod",4,2,11,2);
> ATRMultiplier = 1;//Optimize("ATRMultiplier",1,0.7,1.25,.05);
>
>
> Graph8 = HHV(H-ATRMultiplier*ATR(BuyATRPeriod),BuyOffset); /* RED */
> Graph9 = LLV(L+ATRMultiplier*ATR(SellATRPeriod),SellOffset); /* GREEN */
>
> Graph8Style=Graph9Style = 5;
> Graph9Color= 5; /* 5 is green */
> Graph8Color = 4; /* 4 is red */
>
> ticker = 0.0;//Optimize("Tickerk",0,0,1,0.125);
>
> Buy = Cover = Cross(C,Graph8) AND C>Graph9 AND LinRegSlope(EMA(C,17),2)>0;
> Sell = Short = Cross(Graph8,C) AND LinRegSlope(C,2)<0;
> Buy = ExRem(Buy,Sell);
> Sell = ExRem(Sell,Buy);
> BuyStop = Ref(Graph8,-1)+ ticker;
> BuyPrice = Max(BuyStop,Low);
> SellStop= Ref(Graph8,-1); //IIf(Cross(Graph8,C),Ref(Graph8,-1),0);
> SellPrice = Min( SellStop, High )- ticker;
>
> //ApplyStop(2,3,Optimize("TrailingStop",15,0,20,5),1);
>
> Filter= (Buy OR Sell) ;
> NumColumns = 8;
> Column0 = IIf(Buy==1,1,IIf(Sell==1,-1,0) );
> Column0Format = 1.0;
> Column0Name = "Long/Sell";
> Column1 = C;
> Column1Name = "Close ";
> Column1Format = 1.2;
> Column2 = MA(V,17);
> Column2Name = "17 Ma Vol ";
> Column2Format = 1.0;
> Column3 = MA(C,17)/MA(C,50);
> Column3Name = "% 17/50 ";
> Column3Format = 1.2;
> Column3Format = 1.2;
> Column4= MA(C,17);
> Column4Name="17 C ma";
> Column4Format = 1.2;
> Column5= MA(C,50);
> Column5Name="50 C ma";
> Column5Format = 1.2;
>
> Column6= BuyPrice;
> Column6Name="BuyPrice";
> Column6Format = 1.2;
> Column7= SellPrice;
> Column7Name="Sellprice";
> Column7Format = 1.2;
> _SECTION_END();
>
> _SECTION_BEGIN("Bull Fear _ Bear Fear");
> // BBFEAR.AFL v 0.001 24/01/2002
> // Bull Fear / Bear Fear with DX Trading System
> // Developed by Jef
> // Published in http://www.nt-tech.com.au/guppy/
> // Coded by Marek Chlopek, January 2002
>
>
> //
> ****************************************************************************************
> // INITIALIZATION OF EXPLORATION IN AMIBROKER
> //
> ****************************************************************************************
> Filter = 1;
> NumColumns = 5;
> Column0 = O; Column0Name = "O"; Column0Format = 1.2;
> Column1 = H; Column1Name = "H"; Column1Format = 1.2;
> Column2 = L; Column2Name = "L"; Column2Format = 1.2;
> Column3 = C; Column3Name = "C"; Column3Format = 1.2;
> Column4 = V; Column4Name = "V"; Column4Format = 1.0;
>
> // END OF "INITIALIZATION OF EXPLORATION IN AMIBROKER" SECTION
>
>
> //
> ****************************************************************************************
> // MAIN CODE
> //
> ****************************************************************************************
> Opt1 = Optimize("DX Level", 16, 10, 30, 1);
> Opt2 = Optimize("Period", 15, 10, 50, 1); // n
>
> n = Opt2;
> BullFear = (HHV(High,n) - LLV(High,n))/2 + LLV(High,n);
> BearFear = (HHV(Low,n) - LLV(Low,n))/2 + LLV(Low,n);
>
> // Exploration in Amibroker
> AddColumn(BullFear, "BullFear", format=1.2);
> AddColumn(BearFear, "BearFear", format=1.2);
>
> // END OF "MAIN CODE" SECTION
>
>
> //
> ****************************************************************************************
> // TRADING SYSTEM ENTRY FORMULAS
> //
> ****************************************************************************************
> Buy = Cover = Cross(Close, BullFear) AND ADX(10) > Opt1;
> Short = Sell = Cross(BearFear, Close);
>
> // Exploration in Amibroker
> AddColumn(Buy, "Buy", format=1.0);
> AddColumn(Short, "Short", format=1.0);
> //AddColumn(BuyPrice, "BuyPrice", format=1.2);
> //AddColumn(ShortPrice, "ShortPrice", format=1.2);
>
> // END OF "TRADING SYSTEM ENTRY FORMULAS" SECTION
>
>
> //
> ****************************************************************************************
> // TRADING SYSTEM EXIT FORMULAS
> //
> ****************************************************************************************
> Sell = Short;
> Cover = Buy;
>
> // Exploration in Amibroker
> AddColumn(Sell, "Sell", format=1.0);
> AddColumn(Cover, "Cover", format=1.0);
> //AddColumn(SellPrice, "SellPrice", format=1.2);
> //AddColumn(CoverPrice, "CoverPrice", format=1.2);
>
> // END OF "TRADING SYSTEM EXIT FORMULAS" SECTION
>
>
> //
> ****************************************************************************************
> // TRADING SYSTEM EXCESSIVE ENTRY/EXIT SIGNALS REMOVING FORMULAS
> //
> ****************************************************************************************
> Buy = ExRem(Buy, Sell);
> Sell = ExRem(Sell, Buy);
> Short = ExRem(Short, Cover);
> Cover = ExRem(Cover, Short);
>
> // END OF "TRADING SYSTEM EXCESSIVE ENTRY/EXIT SIGNALS REMOVING
> FORMULAS" SECTION
>
>
> //
> ****************************************************************************************
> // GRAPHIC PRESENTATION IN AMIBROKER
> //
> ****************************************************************************************
> MaxGraph = 3;
> Graph0 = C; Graph0Style = 4; Graph0Color = 1;
> Graph1 = BullFear; Graph1Style = 1; Graph1Color = 5;
> Graph2 = BearFear; Graph2Style = 1; Graph2Color = 4;
>
> Title = Name()
> + " - C (Black) = " + WriteVal(Graph0, 1.2)
> + ", BullFear (Green) = " + WriteVal(Graph1, 1.2)
> + ", BearFear (Red) = " + WriteVal(Graph2, 1.2);
>
> // END OF "GRAPHIC PRESENTATION IN AMIBROKER" SECTION
>
>
> //
> ****************************************************************************************
> // END OF CODE (BBFEAR.AFL)
> //
> ****************************************************************************************
> /**/
> _SECTION_END();
>
> _SECTION_BEGIN("Pivot Point and Support and Resistance Points");
> //------------------------------------------------------------------------------
> //
> // Formula Name: Pivot Point and Support and Resistance Points
> // Author/Uploader: Anthony Faragasso
> // E-mail: ajf1111@xxx
> // Date/Time Added: 2002-04-25 09:04:53
> // Origin:
> // Keywords:
> // Level: basic
> // Flags: commentary
> // Formula URL: http://www.amibroker.com/library/formula.php?id=186
> // Details URL: http://www.amibroker.com/library/detail.php?id=186
> //
> //------------------------------------------------------------------------------
> //
> // Guru Commentary, provides Pivot and support and resistance
> //
> // points for the Next trading day.
> //
> //------------------------------------------------------------------------------
>
> /* Pivot points and Support and Resistance Points*/
> /* for next day trading*/
> /* coded by Anthony Faragasso */
>
>
> MaxGraph =8;
>
> p = (H+L+C)/3;
> r1 = (2*p)-L;
> s1 = (2*p)-H;
> r2 = p +(r1 - s1);
> s2 = p -(r2 - s1);
>
> Graph0=p;
> Graph1=r1;
> Graph2 = s1;
> Graph3= r2;
> Graph4 = s2;
>
> Graph0Style = Graph1Style = Graph2Style = Graph3Style = Graph4Style =
> 16 + 8;
> Graph0Color = 2;
> Graph1Color = Graph2Color = 8;
> Graph3Color = Graph4Color = 6;
>
> Graph5 = Close;
> Graph5Color = 3;
> Graph5Style = 128;
> "";
> "------------------------------------------------------------------------------------------------------------";
> " PIVOT POINTS AND SUPPORT AND RESISTANCE POINTS ";
> "------------------------------------------------------------------------------------------------------------";
> "";
> "MARKET BEING EVALUATED : " + Title = Name() + " DATE : " + Date();
> "";
> "TODAY'S CLOSE WAS : "+"( " +WriteVal(Close,format=1.2)+" )";
> "----------------------------------------------------------------------------------------------------------------------";
> " ******* THESE POINTS ARE VALID FOR NEXT TRADING DAY ******";
> "-----------------------------------------------------------------------------------------------------------------------";
> "RESISTENCE POINT 2 : ----------------" +WriteVal(Graph3,format=1.2);
> "";
> "RESISTENCE POINT 1 : ----------------" +WriteVal(Graph1,format=1.2);
> "";
> " --------------------------------------------------------"+
> "("+WriteVal(Graph0,format=1.2)+")" +" PIVOT POINT--------";
> "";
> "SUPPORT POINT 1 : ----------------------" +WriteVal(Graph2,format=1.2);
> "";
> "SUPPORT POINT 2 : ----------------------" +WriteVal(Graph4,format=1.2);
> _SECTION_END();
>
> _SECTION_BEGIN("Auto Analysis Key Reversal");
> //------------------------------------------------------------------------------
> //
> // Formula Name: Auto Analysis Key Reversal
> // Author/Uploader: Larry Lovrencic
> // E-mail: lvl@xxx
> // Date/Time Added: 2001-09-04 01:51:44
> // Origin:
> // Keywords: key reversal automatic analysis
> // Level: basic
> // Flags: exploration
> // Formula URL: http://www.amibroker.com/library/formula.php?id=109
> // Details URL: http://www.amibroker.com/library/detail.php?id=109
> //
> //------------------------------------------------------------------------------
> //
> // Find Key Reversals using automatic analysis
> //
> //------------------------------------------------------------------------------
>
> /*Key Reversals Automatic Analysis
> by Larry Lovrencic*/
>
> Buy=O<Ref(C,-1) AND L<Ref(L,-1) AND C>Ref(H,-1);
> Sell=O>Ref(C,-1) AND H>Ref(H,-1) AND C<Ref(L,-1);
> _SECTION_END();
>
> _SECTION_BEGIN("Positive ROC Exploration");
> //------------------------------------------------------------------------------
> //
> // Formula Name: Positive ROC Exploration
> // Author/Uploader: Mubashar Virk
> // E-mail: mavirk@xxx
> // Date/Time Added: 2006-10-03 14:36:47
> // Origin: ROC
> // Keywords: ROC
> // Level: basic
> // Flags: exploration
> // Formula URL: http://www.amibroker.com/library/formula.php?id=730
> // Details URL: http://www.amibroker.com/library/detail.php?id=730
> //
> //------------------------------------------------------------------------------
> //
> // Hi there guys and ladies, I have a Positive ROC exploration for
> all you
> // tight-traders and beginners. It may give you some good picks for
> the next
> // day. Needless to say you must study the securities by using William,
> // Chaikin, and Bollinger's. Also try to put your own filtration
> values for
> // ROC and Volume as mine are too tight. May the Profit be with you all.
> //
> //------------------------------------------------------------------------------
>
> P = ((H + L + C) / 3);
> R1 = ((2 * P) - L);
> S1 = ((2 * P) - H);
> R2 = ((P - S1) + R1);
> S2 = (P - (R1 - S1));
>
> Filter = ROC( C, 1 ) > 0.25 AND V > 29999;
>
> AddColumn( V, "Volume",1 );
> AddColumn( C, "Close" );
> AddColumn( Ref (C, -1), "Last Close");
> AddColumn( C - Ref( C, -1), "Change");
> AddColumn( ROC( C, 1 ), "ROC" );
> AddColumn (RSI(), "RSI",1.2);
> AddColumn( r2, "R 2", 1.2);
> AddColumn( r1, "R 1", 1.2);
> AddColumn( P, "Pivot", 1.2);
> AddColumn( S1, "S 1", 1.2);
> AddColumn( S2, "S 2", 1.2);
> _SECTION_END();
>
> _SECTION_BEGIN("Price Persistency");
> //------------------------------------------------------------------------------
> //
> // Formula Name: Price Persistency
> // Author/Uploader: Anthony Faragasso
> // E-mail: ajf1111@xxx
> // Date/Time Added: 2002-12-29 18:20:39
> // Origin:
> // Keywords:
> // Level: basic
> // Flags: exploration
> // Formula URL: http://www.amibroker.com/library/formula.php?id=245
> // Details URL: http://www.amibroker.com/library/detail.php?id=245
> //
> //------------------------------------------------------------------------------
> //
> // Interested in measuring a short-term Trend ?
> //
> // Price persistency is the number of days that a market continues to
> close
> // either up or down. It's another term for a market run. The
> usefulness of
> // Price Persistency is based on the theory of runs..It is the idea that,
> // given the market has moved in a particular direction for ( n )
> days, the
> // likelihood it will either continue..or not...can be estimated and
> used in a
> // profitable trading system....
> //
> //------------------------------------------------------------------------------
>
> //Price Persistency Exploration
> //Interpreted from January,2002, TASC, page 44
> //article by Gordon Gustafson on Price Persistency
> //Coded by Anthony Faragasso, 12/31/01
> //Version 1.00
>
> /*****Bars in the test*****************/
> bars=Cum(1);
> /**************************************/
> Day1up=C > Ref(C,-1);
> Day1Dn=C < Ref(C,-1);
> /**************************************/
>
> Day2up=C > Ref(C,-1) AND Ref(C,-1) > Ref(C,-2);
> Day2Dn=C < Ref(C,-1) AND Ref(C,-1) < Ref(C,-2);
>
> /***********************************************/
> Day3up=C > Ref(C,-1) AND Ref(C,-1) > Ref(C,-2) AND Ref(C,-2) > Ref(C,-3);
> Day3Dn=C < Ref(C,-1) AND Ref(C,-1) < Ref(C,-2) AND Ref(C,-2) < Ref(C,-3);
> /**********************************************/
>
> Day4up=C > Ref(C,-1) AND Ref(C,-1)>Ref(C,-2)AND Ref(C,-2)>Ref(C,-3)
> AND Ref(C,-3) > Ref(C,-4);
> Day4Dn=C < Ref(C,-1) AND Ref(C,-1)<Ref(C,-2)AND Ref(C,-2)<Ref(C,-3)
> AND Ref(C,-3) < Ref(C,-4);
> /**********************************************/
>
> Day5up=C > Ref(C,-1) AND Ref(C,-1)>Ref(C,-2)AND Ref(C,-2)>Ref(C,-3)AND
> Ref(C,-3) > Ref(C,-4) AND Ref(C,-4) > Ref(C,-5);
> Day5Dn=C < Ref(C,-1) AND Ref(C,-1)<Ref(C,-2)AND Ref(C,-2)<Ref(C,-3)AND
> Ref(C,-3) < Ref(C,-4) AND Ref(C,-4) < Ref(C,-5);
> /************************************************/
>
> Day6up=C > Ref(C,-1) AND Ref(C,-1)> Ref(C,-2)AND
> Ref(C,-2)>Ref(C,-3)AND Ref(C,-3) > Ref(C,-4) AND Ref(C,-4) > Ref(C,-5)
> AND Ref(C,-5) > Ref(C,-6);
> Day6Dn=C < Ref(C,-1) AND Ref(C,-1)< Ref(C,-2)AND Ref(C,-2)<
> Ref(C,-3)AND Ref(C,-3) < Ref(C,-4)AND Ref(C,-4) < Ref(C,-5) AND
> Ref(C,-5) < Ref(C,-6);
> /***********************************************/
>
> Day7up=C > Ref(C,-1) AND Ref(C,-1)> Ref(C,-2)AND
> Ref(C,-2)>Ref(C,-3)AND Ref(C,-3) > Ref(C,-4) AND Ref(C,-4) >
> Ref(C,-5)AND Ref(C,-5)>Ref(C,-6) AND Ref(C,-6) > Ref(C,-7);
> Day7Dn=C < Ref(C,-1) AND Ref(C,-1)< Ref(C,-2)AND Ref(C,-2)<
> Ref(C,-3)AND Ref(C,-3) < Ref(C,-4)AND Ref(C,-4) < Ref(C,-5)AND
> Ref(C,-5)< Ref(C,-6)AND Ref(C,-6) < Ref(C,-7);
> /*********************************************/
>
> Day8up=C > Ref(C,-1) AND Ref(C,-1)> Ref(C,-2)AND
> Ref(C,-2)>Ref(C,-3)AND Ref(C,-3) > Ref(C,-4) AND Ref(C,-4) >
> Ref(C,-5)AND Ref(C,-5)>Ref(C,-6)AND Ref(C,-6) > Ref(C,-7) AND
> Ref(C,-7) > Ref(C,-8);
> Day8Dn=C < Ref(C,-1) AND Ref(C,-1)< Ref(C,-2)AND Ref(C,-2)<
> Ref(C,-3)AND Ref(C,-3) < Ref(C,-4)AND Ref(C,-4) < Ref(C,-5)AND
> Ref(C,-5)< Ref(C,-6)AND Ref(C,-6) < Ref(C,-7)AND Ref(C,-7) < Ref(C,-8);
> /**********************************************/
>
> Day9up=C > Ref(C,-1) AND Ref(C,-1)> Ref(C,-2)AND
> Ref(C,-2)>Ref(C,-3)AND Ref(C,-3) > Ref(C,-4) AND Ref(C,-4) >
> Ref(C,-5)AND Ref(C,-5)>Ref(C,-6)AND Ref(C,-6) > Ref(C,-7)AND Ref(C,-7)
>> Ref(C,-8) AND Ref(C,-8) > Ref(C,-9);
> Day9Dn=C < Ref(C,-1) AND Ref(C,-1)< Ref(C,-2)AND Ref(C,-2)<
> Ref(C,-3)AND Ref(C,-3) < Ref(C,-4)AND Ref(C,-4) < Ref(C,-5)AND
> Ref(C,-5)< Ref(C,-6)AND Ref(C,-6) < Ref(C,-7)AND Ref(C,-7) < Ref(C,-8)
> AND Ref(C,-8) < Ref(C,-9);
> /**********************************************/
>
> Day10up=C > Ref(C,-1) AND Ref(C,-1)> Ref(C,-2)AND
> Ref(C,-2)>Ref(C,-3)AND Ref(C,-3) > Ref(C,-4) AND Ref(C,-4) >
> Ref(C,-5)AND Ref(C,-5)>Ref(C,-6)AND Ref(C,-6) > Ref(C,-7)AND Ref(C,-7)
>> Ref(C,-8)AND Ref(C,-8)> Ref(C,-9) AND Ref(C,-9) > Ref(C,-10);
> Day10Dn=C < Ref(C,-1) AND Ref(C,-1)< Ref(C,-2)AND Ref(C,-2)<
> Ref(C,-3)AND Ref(C,-3) < Ref(C,-4)AND Ref(C,-4) < Ref(C,-5)AND
> Ref(C,-5)< Ref(C,-6)AND Ref(C,-6) < Ref(C,-7)AND Ref(C,-7) <
> Ref(C,-8)AND Ref(C,-8) < Ref(C,-9) AND Ref(C,-9) < Ref(C,-10);
> /************************************************/
>
> tot1dayUp=LastValue(Cum(Day1up));tot1dayDn=LastValue(Cum(Day1Dn));
> tot2dayUp=LastValue(Cum(Day2up));tot2dayDn=LastValue(Cum(Day2Dn));
> tot3dayUp=LastValue(Cum(Day3up));tot3dayDn=LastValue(Cum(Day3Dn));
> tot4dayUp=LastValue(Cum(Day4up));tot4dayDn=LastValue(Cum(Day4Dn));
> tot5dayUp=LastValue(Cum(Day5up));tot5dayDn=LastValue(Cum(Day5Dn));
> tot6dayUp=LastValue(Cum(Day6up));tot6dayDn=LastValue(Cum(Day6Dn));
> tot7dayUp=LastValue(Cum(Day7up));tot7dayDn=LastValue(Cum(Day7Dn));
> tot8dayUp=LastValue(Cum(Day8up));tot8dayDn=LastValue(Cum(Day8Dn));
> tot9dayUp=LastValue(Cum(Day9up));tot9dayDn=LastValue(Cum(Day9Dn));
> tot10dayUp=LastValue(Cum(Day10up));tot10dayDn=LastValue(Cum(Day10Dn));
>
> /*********Percentages for Up or Down as a % of total bars *************/
> totpct1dayup=tot1dayUp/(Cum(1))*100;
> totpct1dayDn=tot1dayDn/(Cum(1))*100;
> totpct2dayUp=tot2dayUp/(Cum(1))*100;
> totpct2dayDn=tot2dayDn/(Cum(1))*100;
> totpct3dayUp=tot3dayUp/(Cum(1))*100;
> totpct3dayDn=tot3dayDn/(Cum(1))*100;
> totpct4dayUp=tot4dayUp/(Cum(1))*100;
> totpct4dayDn=tot4dayDn/(Cum(1))*100;
> totpct5dayUp=tot5dayUp/(Cum(1))*100;
> totpct5dayDn=tot5dayDn/(Cum(1))*100;
> totpct6dayUp=tot6dayUp/(Cum(1))*100;
> totpct6dayDn=tot6dayDn/(Cum(1))*100;
> totpct7dayUp=tot7dayUp/(Cum(1))*100;
> totpct7dayDn=tot7dayDn/(Cum(1))*100;
> totpct8dayUp=tot8dayUp/(Cum(1))*100;
> totpct8dayDn=tot8dayDn/(Cum(1))*100;
> totpct9dayUp=tot9dayUp/(Cum(1))*100;
> totpct9dayDn=tot9dayDn/(Cum(1))*100;
> totpct10dayUp=tot10dayUp/(Cum(1))*100;
> totpct10dayDn=tot10dayDn/(Cum(1))*100;
>
> /*******************************************************/
> /**********Percent up or down / previous up or
> down***********************/
>
> Pct2dayUp=(tot2dayUp/tot1dayup)*100;
> Pct2dayDn=(tot2dayDn/tot1dayDn)*100;
> pct3dayUp=(tot3dayUp/tot2dayup)*100;
> pct3dayDn=(tot3dayDn/tot2dayDn)*100;
> pct4dayUp=(tot4dayUp/tot3dayUp)*100;
> pct4dayDn=(tot4dayDn/tot3dayDn)*100;
> pct5dayUp=(tot5dayUp/tot4dayUp)*100;
> pct5dayDn=(tot5dayDn/tot4dayDn)*100;
> pct6dayUp=(tot6dayUp/tot5dayUp)*100;
> pct6dayDn=(tot6dayDn/tot5dayDn)*100;
> pct7dayUp=(tot7dayUp/tot6dayUp)*100;
> pct7dayDn=(tot7dayDn/tot6dayDn)*100;
> pct8dayUp=(tot8dayUp/tot7dayUp)*100;
> pct8dayDn=(tot8dayDn/tot7dayDn)*100;
> pct9dayUp=(tot9dayUp/tot8dayUp)*100;
> pct9dayDn=(tot9dayDn/tot8dayDn)*100;
> pct10dayUp=(tot10dayUp/tot9dayUp)*100;
> pct10dayDn=(tot10dayDn/tot9dayDn)*100;
>
>
> Filter=1;
> /***Current State of the Closes******/
> stateUp=BarsSince(C < Ref(C,-1));
> stateDown=BarsSince(C > Ref(C,-1));
> AddColumn(stateUp,"currentUp");
> AddColumn(statedown,"CurrentDown");
>
> /***Close is equal to previous close*****/
> AddColumn(Cum(C == Ref(C,-1)),"Close==PrevClose",1);
>
> /***Days in a row ,whether up or down ( A Run )********/
> //1 day
>
> AddColumn(tot1dayUp,"1dayUp",1);AddColumn(tot1dayDn,"1dayDn",1);AddColumn(0,"%Up/PrevUp");AddColumn(0,"%Dn/PrevDn");AddColumn(totpct1dayUp,"%Up[bars]");AddColumn(totpct1dayDn,"%Dn[bars]");
> //2 days
> AddColumn(tot2dayUp,"2dayUp",1);AddColumn(tot2dayDn,"2dayDn",1);AddColumn(pct2dayUp,"%Up/prevUp");AddColumn(pct2dayDn,"%Dn/prevDn");AddColumn(totpct2dayUp,"%Up[bars]");AddColumn(totpct2dayDn,"%Dn[bars]");
> //3 days
> AddColumn(tot3dayUp,"3dayUp",1);AddColumn(tot3dayDn,"3dayDn",1);AddColumn(pct3dayUp,"%Up/prevUp");AddColumn(pct3dayDn,"%Dn/prevDn");AddColumn(totpct3dayUp,"%Up[bars]");AddColumn(totpct3dayDn,"%Dn[bars]");
> //4 days
> AddColumn(tot4dayUp,"4dayUp",1);AddColumn(tot4dayDn,"4dayDn",1);AddColumn(pct4dayup,"%Up/prevUp");AddColumn(pct4dayDn,"%Dn/prevDn");AddColumn(totpct4dayUp,"%Up[bars]");AddColumn(totpct4dayDn,"%Dn[bars]");
> //5 days
> AddColumn(tot5dayUp,"5dayUp",1);AddColumn(tot5dayDn,"5dayDn",1);AddColumn(pct5dayup,"%Up/prevUp");AddColumn(pct5dayDn,"%Dn/prevDn");AddColumn(totpct5dayUp,"%Up[bars]");AddColumn(totpct5dayDn,"%Dn[bars]");
> //6 days
> AddColumn(tot6dayUp,"6dayUp",1);AddColumn(tot6dayDn,"6dayDn",1);AddColumn(pct6dayUp,"%Up/prevUp");AddColumn(pct6dayDn,"%Dn/prevDn");AddColumn(totpct6dayUp,"%Up[bars]");AddColumn(totpct6dayDn,"%Dn[bars]");
> //7 days
> AddColumn(tot7dayUp,"7dayUp",1);AddColumn(tot7dayDn,"7dayDn",1);AddColumn(pct7dayUp,"%Up/prevUp");AddColumn(pct7dayDn,"%Dn/prevDn");AddColumn(totpct7dayUp,"%Up[bars]");AddColumn(totpct7dayDn,"%Dn[bars]");
> //8 days
> AddColumn(tot8dayUp,"8dayUp",1);AddColumn(tot8dayDn,"8dayDn",1);AddColumn(pct8dayUp,"%Up/prevUp");AddColumn(pct8dayDn,"%Dn/PrevDn");AddColumn(totpct8dayUp,"%Up[bars]");AddColumn(totpct8dayDn,"%Dn[bars]");
> //9 days
> AddColumn(tot9dayUp,"9dayUp",1);AddColumn(tot9dayDn,"9dayDn",1);AddColumn(pct9dayUp,"%Up/prevUp");AddColumn(pct9dayDn,"%Dn/prevDn");AddColumn(totpct9dayUp,"%Up[bars]");AddColumn(totpct9dayDn,"%Dn[bars]");
> //10 days
> AddColumn(tot10dayUp,"10dayUp",1);AddColumn(tot10dayDn,"10dayDn",1);AddColumn(pct10dayUp,"%Up/prevUp");AddColumn(pct10dayDn,"%Dn/prevDn");AddColumn(totpct10dayUp,"%Up[bars]");AddColumn(totpct10dayDn,"%Dn[bars]");
>
> AddColumn(bars,"bars",1);
> _SECTION_END();
>
> _SECTION_BEGIN("Trend exploration with multiple timeframes");
> //------------------------------------------------------------------------------
> //
> // Formula Name: Trend exploration with multiple timeframes
> // Author/Uploader: Marcus Davidsson
> // E-mail: davidsson_marcus@xxx
> // Date/Time Added: 2006-09-30 20:31:21
> // Origin:
> // Keywords: exploration, trend, moving average
> // Level: medium
> // Flags: exploration
> // Formula URL: http://www.amibroker.com/library/formula.php?id=724
> // Details URL: http://www.amibroker.com/library/detail.php?id=724
> //
> //------------------------------------------------------------------------------
> //
> // I started experimenting with Tradestations Radarscreen
> //
> // when it struck me that Amibroker have the same function
> "Exploration" but
> // 100000$ much cheaper.
> //
> // The formula is quite simple just load it in to Amibroker
> //
> // and go to automatic analysis and push explore.
> //
> // The formula will scan multiple moving averages and draw conclusions
> // regarding overall trend phase, strenght etc. Enjoy!
> //
> //------------------------------------------------------------------------------
>
> /*Use daily data! You could use data with
> higher time resolution but then you have
> to include a timeframe parameters
> since 10 periods will become
> 10 minutes (if you have one Minute data)*/
>
> //////////////////////////////////////////////////////////////
>
> Filter = 1; // all symbols and quotes accepted.
> DTL=140; // DTL = Define Trend Long
> DTM=60; // DTM = Define Trend Medium
> DTS=8; // DTS = Define Trend Short
>
> //////////////////////////////////////////////////////////////
>
> TL=LinRegSlope(MA(C, DTL),2); // TL = Trend Long
> TM=LinRegSlope(MA(C, DTM),2); // TM = Trend Medium
> TS=LinRegSlope(MA(C, DTS),2); // TS = Trend Short
>
> TLL=IIf(LinRegSlope(MA(C, DTL),2) > 0,True, False);
> TMM=IIf(LinRegSlope(MA(C, DTM),2) > 0,True, False);
> TSS=IIf(LinRegSlope(MA(C, DTS),2) > 0,True, False);
>
> TLLL=
> WriteIf(TL>0 AND TL<0.3,"+",
> WriteIf(TL>=0.3 AND TL<0.6 ,"+ +",
> WriteIf(TL>=0.6,"+ + +",
> WriteIf(TL<0 AND TL>-0.3,"-",
> WriteIf(TL<=-0.3 AND TL>-0.6 ,"- -",
> WriteIf(TL<=-0.6,"- - -",""))))));
>
> TMMM=
> WriteIf(TM>0 AND TM<0.3,"+",
> WriteIf(TM>=0.3 AND TM<0.6 ,"+ +",
> WriteIf(TM>=0.6,"+ + +",
> WriteIf(TM<0 AND TM>-0.3,"-",
> WriteIf(TM<=-0.3 AND TM>-0.6 ,"- -",
> WriteIf(TM<=-0.6,"- - -",""))))));
>
> TSSS=
> WriteIf(TS>0 AND TS<0.3,"+",
> WriteIf(TS>=0.3 AND TS<0.6 ,"+ +",
> WriteIf(TS>=0.6,"+ + +",
> WriteIf(TS<0 AND TS>-0.3,"-",
> WriteIf(TS<=-0.3 AND TS>-0.6 ,"- -",
> WriteIf(TS<=-0.6,"- - -",""))))));
>
> //////////////////////////////////////////////////////////////
>
> AddTextColumn( TLLL, "MA"+-DTL, 1 , colorDefault,
> IIf( TLL==True, colorGreen, colorRed ),-1 );
> AddTextColumn( TMMM, "MA"+-DTM, 1 , colorDefault,
> IIf( TMM==True, colorGreen, colorRed ),-1 );
> AddTextColumn( TSSS, "MA"+-DTS, 1 , colorDefault,
> IIf( TSS==True, colorGreen, colorRed ),-1 );
>
> //////////////////////////////////////////////////////////////
> message=
> WriteIf(TL>=0.3 AND TM>=0.3 AND
> TS>=0.3, "Strong Up Trend",
> WriteIf(TL<=-0.3 AND TM<=-0.3 AND
> TS<=-0.3, "Strong Down Trend",
> WriteIf(TLL==True AND TMM==True AND
> TSS==True,"Up Trend",
> WriteIf(TLL==False AND TMM==False AND
> TSS==False,"Down Trend", "No Trend"))));
>
>
> AddTextColumn( message, "Overall Trend", 1 ,
> colorDefault,IIf(TLL==True AND TMM==True AND
> TSS==True, colorGreen,
> IIf(TLL==False AND TMM==False AND
> TSS==False, colorRed, colorDefault )),-1 );
>
> //////////////////////////////////////////////////////////////
>
> x = IIf(Cross(LinRegSlope(MA(C, DTL),2),0) OR
> Cross(0, LinRegSlope(MA(C, DTL),2) ), True, False);
> y = BarIndex()-ValueWhen(x==True, BarIndex(),1);
>
> Phase=WriteIf(Y>=400,"Mature",WriteIf(Y>100 AND
> Y<400, "Progress", WriteIf(Y<=100, "Initial", "")));
> //AddColumn( y, "Trend Phase", 1 , colorDefault, -1);
> AddTextColumn( Phase, "Trend Phase", 1 , colorDefault, -1);
>
> //////////////////////////////////////////////////////////////
> Comments=
> WriteIf(Y>=400,"Mature trend with risk of bubble",
> WriteIf(y<400 AND TLL==True AND TMM==True AND TSS==True,
> "Keep on coming baby $",
> WriteIf(y<15 AND TLL==True AND TMM==True AND TSS==True OR
> TLL==False AND TMM==False AND TSS==False,
> "Are you going to grow up and become a big boy?",
> WriteIf(y<400 AND TLL==False AND TMM==False AND TSS==False,
> "Keep on coming baby $$",
> WriteIf(TLL==True AND TMM==True AND TSS==False OR
> TLL==False AND TMM==False AND TSS==True,
> "Risk for short term reversal",
> WriteIf(TLL==True AND TMM==False AND TSS==True OR
> TLL==False AND TMM==True AND TSS==False,
> "trading range-avoid",
> "live to trade another day"))))));
>
> AddTextColumn( Comments, "Comments", 1 ,
> colorDefault,colorDefault,-1 );
>
>
> //////////////////////////////////////////////////////////////
> _SECTION_END();
>
> //------------------------------------------------------------------------------
> //
> // Formula Name: Auto-Optimization Framework
> // Author/Uploader: Dave Merrill
> // E-mail:
> // Date/Time Added: 2003-10-22 11:58:47
> // Origin:
> // Keywords: optimize,auto-optimize,backtest
> // Level: advanced
> // Flags: system,exploration,function
> // Formula URL: http://www.amibroker.com/library/formula.php?id=304
> // Details URL: http://www.amibroker.com/library/detail.php?id=304
> //
> //------------------------------------------------------------------------------
> //
> // this is a backtest framework that continously and automatically
> optimizes
> // settings for a trading rule you provide. it chooses settings that
> measure
> // best over a selectable lookback period. this re-optimization can
> be done
> // every bar, at a user-definable interval, or once at the start of
> trading.
> // it requires AFL editing to use; instructions are provided.
> //
> //------------------------------------------------------------------------------
>
> //////////////////////////////////////////////////////////////////////////
> // INTRO
> //////////////////////////////////////////////////////////////////////////
> /*
>
> ------------------------------------------------------------------------
> Auto-Optimization Framework
> v 1.0 (hah) 10/20/03 Dave Merrill (email: dmerrill at usa dot net)
> thanks to Tomasz Janeczko for AmiBroker, and everyone in the AmiBroker
> groups at Yahoo
> comments, suggestions, bug reports etc are most welcome
> ------------------------------------------------------------------------
>
>
> WHAT DOES THIS DO?
>
> you've probably done walk-forward optimizations, where you optimize a
> trading system over some time period, then trade with those settings
> for a while, optimize again at some later date, trade on, etc.. in
> fact, this is like real life, unless you assume your initial settings
> will be optimal forever and you'll never change them.
>
> this code is a backtest framework that does this continously and
> automatically. you provide a trading rule, and it constantly optimizes
> the parameters for it, always using the settings that measure best
> over a selectable lookback period. this re-optimization can be done
> every bar, at a user-definable interval, or once at the start of trading.
>
> one interesting fact is that so far, almost no trading rules I've
> tested are very profitable when managed this way, with any framework
> settings I've tried. the ones that are are far from universally
> successful over various stocks and time frames. I find this very
> interesting and quite puzzling, as is well documented on the AB group.
> maybe there are bugs that cause this; please let me know about any you
> find. maybe the equity evaluation function or other framework
> behaviors could be improved; please let me know if you come up with
> great changes. maybe it's just not a very effective method; if you can
> explain to me why this is so, please do!
>
> and lastly, if you find any hugely profitable uses for this thing, or
> other interesting insights from poking around with it, PLEASE let me
> in on 'em! (:-)
>
>
> IMPORTANT USAGE NOTE!!!!
>
> parts of this code belong to the framework itself, and shouldn't be
> modified in normal use. other parts you need to edit, to select the
> specific trading rule you want to test, and establish settings for how
> the framework will operate.
>
> all sections are clearly labelled as editable or not. it's in your
> best interest not to change the ones that say NOT EDITABLE, at least
> to start with.
>
>
> DON'T BE IMTIMIDATED
>
> though this is pretty long, it's actually not that complicated, either
> to use or in its internals. it's broken down into sections, most of
> which you don't need to even look at. if I could hide the no-touchy
> bits away I would (:-). also, a lot of it is explanation, not code,
> and a lot of the code is a collection of sample trading rules.
>
>
> INSTRUCTIONS
>
> 1) add trading rule(s) you want to test to the CUSTOM TRADING RULES
> section. see comments there for how your rules will be called, and
> what they need to do. some examples are provided. you can have as many
> rules here as you want, but only one can be in use at a time. step 3
> below controls which one is active.
>
> 2) if those rules require other custom functions, add them to the
> CUSTOM UTILITY FUNCTIONS section.
>
> 3) edit the framework function BuySellRule(), at the start of the
> FRAMEWORK CONFIGURATION section, to call the trading rule you want to
> test now.
>
> 4) edit the SetParameterRanges() call, next in the FRAMEWORK
> CONFIGURATION section, to set the ranges over which you want to test
> each of the two optimization parameters. some examples are provided;
> comment out all but the one you want to use.
>
> 5) if desired, edit the rest of the FRAMEWORK CONFIGURATION section,
> to control various aspects of how the framework itself behaves.
>
> 6) set the AA range, stock universes you want to test, and other AA
> settings, then run a Backtest or Portfolio Backtest.
>
> 7) if you want to see the parameters selected and other decisions
> being made under the hood, you can Explore instead of backtest. if
> desired, edit the EXPLORATION section at the end to change the columns
> and bars displayed; some possible extensions and modifications are
> provided. note that exploring doesn't actually trade, it's only a
> readout for your interest.
>
>
> GETTING STARTED
>
> this comes set up to run the included trading rule 'BuySellCCI'.
> backtest it on, say, the NASDAQ Composite Index, to get an idea of how
> it performs (nothing great). explore it to see the parameter values
> the framework selected (the best_p1 column). try changing the
> parameter ranges tested, as described in the instructions above.
>
> BuySellCCI uses a single parameter, requiring only 40 tests to
> optimize. this makes it quicker to run than most two-parameter
> systems, which typically need about 40 x 40 tests or more, depending
> on the number of values you want to test. performance can definitely
> be an issue as the number of tests goes up, and even single parameter
> systems can be pretty slow with a large number of stocks.
>
> in the FRAMEWORK CONFIGURATION section, try changing
> equity_lookback_bars (how far back performance is evaluated during
> optimization) and equity_lookback_frequency (how often optimization is
> done). if you want, you can actually optimize these; possible
> optimization settings are provided. be cautious in interpreting those
> results though. I'd do it more for a quick sense of how things behave
> than to necessarily choose the highest performing settings. at the
> very least, test a variety of stocks and time frames with any settings
> you arrive at, to make sure they're not a fluke.
>
> try some of the other included trading rules, maybe starting with the
> MA/EMA/DEMA/TEMA cross rules. hook them up and select parameter ranges
> to test as described in the instructions above.
>
> try adding your own trading rules, and experiment with optimization
> ranges and equity feedback parameters.
>
> try modifying the performance scoring methods, and adding your own.
>
> */
>
>
> //////////////////////////////////////////////////////////////////////////
> // FRAMEWORK INIT - NOT EDITABLE
> //////////////////////////////////////////////////////////////////////////
>
> Buy = Sell = Short = Cover = 0;
> equity_lookback_bars = equity_lookback_frequency =
> equity_lookback_smoothing = equity_drawdown_discount_pct = 0;
> e = best_e = best_perf_score = best_p1 = best_p2 = 0;
> p1_start = p2_start = 2;
> p1_end = p2_end = 20;
> p1_step = p2_step = 1;
> bar_index = BarIndex();
>
>
> //////////////////////////////////////////////////////////////////////////
> // FRAMEWORK FUNCTIONS - NOT EDITABLE
> //////////////////////////////////////////////////////////////////////////
>
> function SetParameterRanges(p1_start_p, p1_end_p, p1_step_p,
> p2_start_p, p2_end_p, p2_step_p) {
> if(p1_step_p != 0) {
> p1_start = p1_start_p;
> p1_end = p1_end_p;
> p1_step = p1_step_p;
> } else {
> p1_start = p1_end = p1_step = 1;
> }
> if(p2_step_p != 0) {
> p2_start = p2_start_p;
> p2_end = p2_end_p;
> p2_step = p2_step_p;
> } else {
> p2_start = p2_end = p2_step = 1;
> }
> }
> function PerformanceScoreMDDDiscount(e, perf_score) {
> e_max = Highest(e); // peak equity so far
> mdd = Highest(e_max - e); // max drawdown so far
> mdd_fraction = Highest(mdd / e_max); // fraction max drawdown is of
> peak equity
> perf_score = perf_score - (perf_score * mdd_fraction *
> (equity_drawdown_discount_pct/100)); // reduce score by mdd fraction
> scaled by drawdown discount
> return perf_score;
> }
>
>
> //////////////////////////////////////////////////////////////////////////
> // CUSTOM UTILITY FUNCTIONS - EDITABLE
> //////////////////////////////////////////////////////////////////////////
>
> function EMAx(array, period) { // use in place of AB EMA function when
> period needs to be an array
> return AMA(array, 1 / (period + 2));
> }
> function StochTransform(array, period) {
> return
> 100*(array-LLV(array,period))/(HHV(array,period)-LLV(array,period));
> }
> function MeanDev(array, mean, range) {
> result = 0;
> for(i = LastValue(Highest(range)); i < BarCount; i++) {
> result[i] = 0; // the mean is not 'moving' over the range (outside
> the loop)
> tm = mean[i];
> for(j = 0; j < range[i]; j++) {
> result[i] = result[i] + abs(array[i - j] - tm);
> }
> result[i] = result[i] / range[i];
> }
> return result;
> }
> function CCIx(period) { // use in place of AB CCI function when period
> needs to be an array
> // CCI = (TypicalPrice - MA(TypicalPrice, 20)) / (.015 x MeanDeviation)
> SMATP = MA(Avg, period);
> MD = MeanDev(Avg, SMATP, period);
> result = (Avg - SMATP) / (0.015 * MD);
> return result;
> }
> function TradeDivergences(array1, array2) {
> dir1 = IIf(array1 > Ref(array1, -1), 1, IIf(array1 < Ref(array1, -1),
> -1, 0));
> dir2 = IIf(array2 > Ref(array2, -1), 1, IIf(array2 < Ref(array2, -1),
> -1, 0));
> Buy = Cover = (dir1 == 1) AND (dir2 == -1);
> Sell = Short = (dir1 == -1) AND (dir2 == 1);
> }
> function TradeReversalsArith(array, threshold) {
> array = last_hi = last_lo = IIf(IsNull(array), -1, array);
> last_signal[0] = 0;
> Buy = Sell = 0;
> for(i = 1; i < BarCount; i++) {
> Buy[i] = array[i] >= last_lo[i-1] + threshold[i] AND
> last_signal[i-1] != 1 AND array[i-1] != -1;
> Sell[i] = array[i] <= last_hi[i-1] - threshold[i] AND
> last_signal[i-1] != -1 AND array[i-1] != -1;
> last_signal[i] = IIf(Buy[i], 1, IIf(Sell[i], -1, last_signal[i-1]));
> always_track = array[i-1] == -1 OR Buy[i] OR Sell[i];
> last_lo[i] = IIf(always_track OR array[i] < last_lo[i-1], array[i],
> last_lo[i-1]);
> last_hi[i] = IIf(always_track OR array[i] > last_hi[i-1], array[i],
> last_hi[i-1]);
> }
> Short = Sell;
> Cover = Buy;
> }
>
>
> /////////////////////////////////////////////////////////////////////////
> // CUSTOM TRADING RULES - EDITABLE
> /////////////////////////////////////////////////////////////////////////
>
> /*
>
> this is where you put the various trading rules you may want to test.
> only one rule can be in use at a time. select which one actually gets
> used by editing the framework function BuySellRule(), at the start of
> the FRAMEWORK CONFIGURATION section.
>
> all rules should set buy, sell, short and cover, in response to the
> parameters passed to it and whatever logic you want.
>
> your rule will be passed 3 parameters:
> dynamic (true/false) : true if parameters are arrays, not just single
> values; see ABOUT THE 'DYNAMIC' PARAMETER, below
> p1 (number/array) : first optimization parameter
> p2 (number/array) : second optimization parameter
>
> p1 and p2 are the values being optimized on. trading rules can use
> them for any optimizable purpose, MA periods or crossover thresholds
> for example.
>
> during optimization, the rule in use will be called multiple times,
> once with each combination of p1 and p2 being tested. at this time, p1
> and p2 will be simple numeric values, not arrays. once optimal
> settings have been determined for every bar, the rule will be called
> once more, to generate actual trading signals. this time, p1 and p2
> will be arrays, each bar containing the optimal p1 and p2 value for
> that bar.
>
> ABOUT THE 'DYNAMIC' PARAMETER
>
> not all AB functions can take arrays as inputs. for example, MA, TEMA
> and DEMA can use an array as their period, but EMA can't. it's usually
> possible to code an equivalent that can in AFL, but it may be slower,
> or in a DLL, which I didn't want to depend on for this. this speed
> difference can be big, since the trading rule is called many times
> during optimization.
>
> if desired, your rule can include both slower array-capable code for
> use in the final signal-generation phase, and faster,
> non-array-capable code for use during the many optimization tries. if
> you do this, use the 'dynamic' parameter to know which to call. see
> BuySellCCI, below, for an example.
>
> */
>
> function BuySellEMACrossPrice(dynamic, p1, p2) { // p1 = EMA period
> m = EMAx(C, p1);
> Buy = Cover = Cross(C, m);
> Sell = Short = Cross(m, C);
> }
> function BuySellMACross(dynamic, p1, p2) { // p1 = MA1 period, p2 =
> MA2 period increase over MA1 period
> m1 = MA(C, p1);
> m2 = MA(C, p1 + p2);
> Buy = Cover = Cross(m1, m2);
> Sell = Short = Cross(m2, m1);
> }
> function BuySellEMACross(dynamic, p1, p2) { // p1 = MA1 period, p2 =
> MA2 period increase over MA1 period
> m1 = EMAx(C, p1);
> m2 = EMAx(C, p2);
> Buy = Cover = Cross(m1, m2);
> Sell = Short = Cross(m2, m1);
> }
> function BuySellDEMACross(dynamic, p1, p2) { // p1 = MA1 period, p2 =
> MA2 period increase over MA1 period
> m1 = DEMA(C, p1);
> m2 = DEMA(C, p1 + p2);
> Buy = Cover = Cross(m1, m2);
> Sell = Short = Cross(m2, m1);
> }
> function BuySellTEMACross(dynamic, p1, p2) { // p1 = MA1 period, p2 =
> MA2 period increase over MA1 period
> m1 = TEMA(C, p1);
> m2 = TEMA(C, p1 + p2);
> Buy = Cover = Cross(m1, m2);
> Sell = Short = Cross(m2, m1);
> //short = cover = 0; // at least sometimes, short is perf_scoreable,
> but only barely, so RAR drops
> }
> function BuySellCCI(dynamic, p1, p2) { // p1 = CCI period; fixed
> threshold of zero
> if(dynamic) {
> cc = CCIx(p1);
> } else {
> cc = CCI(p1);
> }
> Buy = Cover = Cross(cc, 0);
> Sell = Short = Cross(0, cc);
> }
> function BuySellCCI2(dynamic, p1, p2) { // p1 = CCI period; moveable
> symetrical thresholds, mirrored above and below zero for long and short
> if(dynamic) {
> cc = CCIx(p1);
> } else {
> cc = CCI(p1);
> }
> Buy = Cover = Cross(cc, p2);
> Sell = Short = Cross(-p2, cc);
> }
> function BuySellCCI3(dynamic, p1, p2) { // p1 = CCI period; moveable
> absolute threshold, same numeric level for long and short
> if(dynamic) {
> cc = CCIx(p1);
> } else {
> cc = CCI(p1);
> }
> Buy = Cover = Cross(cc, p2);
> Sell = Short = Cross(p2, cc);
> }
> function BuySellStochCCI(dynamic, p1, p2) { // p1 = CCI period
> cc = CCIx(period);
> cc = StochTransform(cc, period);
> Buy = Cover = Cross(cc, 50);
> Sell = Short = Cross(50, cc);
> }
> function BuySellStoch(dynamic, p1, p2) { // p1 = range, p2 = K & D
> smoothing
> if(dynamic) {
> stoK =
> MA(100*(C-LLV(L,best_p1))/(HHV(H,best_p1)-LLV(L,best_p1)),best_p2);
> stoD = MA(stoK, best_p2);
> } else {
> stoD = StochD(p1, p2, p2);
> stoK = StochK(p1, p2);
> }
> sig = stoD - stoK;
> Buy = Cover = Cross(sig, 0);;
> Sell = Short = Cross(0, sig);
> }
> function BuySellStochDivergence(dynamic, p1, p2) { // p1 = range, p2 =
> K & D smoothing
> if(dynamic) {
> stoK =
> MA(100*(C-LLV(L,best_p1))/(HHV(H,best_p1)-LLV(L,best_p1)),best_p2);
> stoD = MA(stoK, best_p2);
> } else {
> stoD = StochD(p1, p2, p2);
> stoK = StochK(p1, p2);
> }
> TradeDivergences(stoD, stoK);
> }
> function BuySellROC(dynamic, p1, p2) { // p1 = range, p2 = threshold
> sig = ROC(MA(C, p1), 1);
> Buy = Cover = Cross(sig, p2);
> Sell = Short = Cross(p2, sig);
> }
> function BuySellDemandIndex(dynamic, p1, p2) { // p1 = DI & TEMA
> period, p2 = EMA period
> period = 21; //p1; // 21
> period2 = 30; //p2; // 30
> A=(H+L+2*C);
> B=EMAx((HHV(H,2)-LLV(L,2)),21);
> BuyP= /*{BuyPower}*/
> V/EMAx(V,21) * ((A>=Ref(A,-1)) +(A<Ref(A,-1)) / exp((0.375 *
> (A+Ref(A,-1)) /B ) *(Ref(A,-1)-A) / A));
> SellP = /*{SellPressure}*/
> V/EMAx(V,21) * ((A<=Ref(A,-1)) + (A>Ref(A,-1)) / exp((0.375 *
> (A+Ref(A,-1)) / B ) * (A-Ref(A,-1)) / Ref(A,-1)));
> mabp=EMAx(BuyP,period);
> masp=EMAx(SellP,period); // {smooth Selling Pressure}
> divsor=IIf(mabp>masp,mabp,masp); // {BP:SP ratio}
> divend=IIf(mabp<masp,mabp,masp); // {biggest=divisor}
> var2=1-(divend/divsor); // {adjust ratio to plot in}
> var3=IIf((masp>mabp), -var2, var2); // {range -100 to 100}
> var4=var3*100;
> DI = var4;
> DI_TEMA = TEMA(DI, period);
> DI_TEMA_MA = EMAx(DI_TEMA, period2);
> Buy = Cover = Cross(DI_TEMA, 0); // try various crosses of DI,
> DI_TEMA, DI_TEMA_MA and zero
> Sell = Short = Cross(0, DI_TEMA);
> Short = Cover = 0; // improves performance sometimes
> }
> function BuySellMTIReversals(dyanamic, p1, p2) { // p1 = reversal
> threshold; .12 for San Diego Wave timing
> // requires MTI in ticker !!MTI;
> // note that MTI data doesn't go back very far, and was calculated
> differently before some time in early '00
> // adjust test period and keep results in perspective accordingly
> MTI = Foreign("!!MTI", "C", True);
> TradeReversalsArith(MTI, p1);
> }
>
>
> //////////////////////////////////////////////////////////////////////////
> // PERFORMANCE SCORING METHODS - EDITABLE
> //////////////////////////////////////////////////////////////////////////
> // one of these functions will be called to evaluate the performance
> of each parameter combination tried
> // select the one that will be active by editing the framework
> function PerformanceScore
> // it's at the beginning of EQUITY FEEDBACK BEHAVIOR, in the
> FRAMEWORK CONFIGURATION section
> // you can edit these or add your own
> function PerformanceScore1() { // profit per bar
> e = Equity(0, 0);
> if(equity_lookback_bars == 0) { // test all performance to date
> e_ref = e[0];
> } else { // test performance back spec'd number of bars
> e_ref = Ref(e, -equity_lookback_bars);
> }
> perf_score = (e - e_ref) / e_ref; // growth over lookback period
> perf_score = MA(perf_score, IIf(equity_lookback_smoothing >= 1,
> equity_lookback_smoothing, 1)) * 100; // smoothed pct
> perf_score = perf_score * 100 / IIf(equity_lookback_bars == 0,
> Cum(1), equity_lookback_bars); // per 100 bars
> perf_score = PerformanceScoreMDDDiscount(e, perf_score);
> return perf_score;
> }
> function PerformanceScore2() { // net of right-sided bars per bar
> e = Equity(0, 0);
> e_ref = Ref(e, -1);
> e_delta = e - e_ref;
> last_buy_bar = ValueWhen(Buy, bar_index);
> last_sell_bar = ValueWhen(Sell, bar_index);
> last_short_bar = ValueWhen(Short, bar_index);
> last_cover_bar = ValueWhen(Cover, bar_index);
> entry_status = IIf(last_buy_bar > last_sell_bar, 1,
> IIf(last_short_bar > last_cover_bar, -1, 0));
> bar_is_right = IIf(entry_status == 1, e_delta > 0, IIf(entry_status
> == -1, e_delta < 0, 0));
> bar_is_wrong = IIf(entry_status == 1, e_delta < 0, IIf(entry_status
> == -1, e_delta < 0, 0));
> if(equity_lookback_bars == 0) { // test all performance to date
> bars_right = Cum(bar_is_right); // bars long and rising or short and
> falling
> bars_wrong = Cum(bar_is_wrong); // bars long and falling or short
> and rising
> } else { // test performance back spec'd number of bars
> bars_right = Sum(bar_is_right, equity_lookback_bars); // bars long
> and rising or short and falling
> bars_wrong = Sum(bar_is_wrong, equity_lookback_bars); // bars long
> and falling or short and rising
> }
> perf_score = (bars_right - bars_wrong) / bar_index; // net bars
> right per bar
> perf_score = MA(perf_score, IIf(equity_lookback_smoothing >= 1,
> equity_lookback_smoothing, 1)) * 100; // smoothed pct
> perf_score = PerformanceScoreMDDDiscount(e, perf_score);
> return perf_score;
> }
>
>
> //////////////////////////////////////////////////////////////////////////
> // FRAMEWORK CONFIGURATION - EDITABLE
> //////////////////////////////////////////////////////////////////////////
>
> // TRADING RULE: EDIT TO CALL THE CUSTOM RULE YOU WANT TO TEST
> function BuySellRule(dynamic, p1, p2) {
> BuySellCCI(dynamic, p1, p2);
> }
>
> // PARAMETER RANGES TO TEST
> // each of the two parameters, p1 and p2, has start, end and step
> values that control the values tried during optimization
> // you'll probably need to adjust these to the ranges that are useful
> for the active trading rule
> // to set them all at once, call SetParameterRanges(p1_start, p1_end,
> p1_step, p2_start, p2_end, p2_step)
> // if your rule doesn't use p2, use p2_step = 0 to speed up optimization
> // some typical settings are provided below; uncomment and edit the
> one you want to use
> SetParameterRanges(2, 40, 1, 1, 1, 0); // basic single parameter range
> //SetParameterRanges(2, 40, 1, 2, 40, 1); // basic two parameter ranges
> //SetParameterRanges(2, 40, 1, 0, 100, 10); // 2-40 period, 0-100
> threshold
> //SetParameterRanges(.01, .5, .01, 1, 1, 0); // for MTI reversals
>
> // EQUITY FEEDBACK BEHAVIOR
> // parameter values selected by the framework are the ones that
> performed best over a specified time in the past
> // this section controls how this is done
> // two performance metrics are provided, and you can add your own
> // only one can be active at a time
> // edit the function PerformanceScore to call the one you want to use
> // equity_lookback_bars controls how many bars worth of history will
> be examined
> // 0 = examine all performance to date
> // equity_lookback_frequency is the number of bars between optimizations
> // 0 = optimize every bar, -1 = first bar only
> // equity_lookback_smoothing applies an MA to the equity curve before
> picking optimum values
> // minimizes the effect of daily price fluctuations on optimization;
> only matters much when pretty high, multiple months
> // equity_drawdown_discount_pct reduces the performance score by the
> maximum drawdown amount * this percentage
> // at zero, MDD has no effect; at 100, 20% MDD reduces the score by 20%
> function PerformanceScore() {
> return PerformanceScore2();
> }
> equity_lookback_bars = 0; // 126 * Optimize("Equity Lookback", 0, 0,
> 5*2, 1);
> equity_lookback_frequency = 0; //21 * Optimize("Equity Lookback
> Frequency", 0, 0, 12*2, 1);
> equity_lookback_smoothing = 0; //21*6;
> equity_drawdown_discount_pct = 0; //100;
>
> // TRADE ENTRY RESTRICTIONS
> // edit to set minimum price, volume and length of history required to
> enter a trade
> // note that the volume requirement is ignored for mutual funds and
> tickers starting w '!' or '~'
> has_min_vol = (MA(V, 100) > 1000000) OR True;
> is_min_price_long = C > 1;
> is_min_price_short = C > 5;
> has_min_history = bar_index >= (252 * 3); // require 3 years of
> history before trading
>
> // PORTFOLIO MANAGEMENT
> // these settings aren't well tested (:-)
> max_positions = 0; // number of simultaneous positions to hold; zero
> for no portfolio management
> use_ranking = False; // true to rank simultaneous entry signals by
> backtest return in portfolio mode
>
>
> //////////////////////////////////////////////////////////////////////////
> //////////////////////////////////////////////////////////////////////////
> //////////////////////////////////////////////////////////////////////////
> //////////////////// FRAMEWORK ENGINE - NOT EDITABLE //////////////////
> //////////////////////////////////////////////////////////////////////////
> //////////////////////////////////////////////////////////////////////////
> //////////////////////////////////////////////////////////////////////////
>
> // tweak volume entry requirements for things with no volume data
> has_min_vol = has_min_vol
> OR (MarketID(1) == "Mutual funds") OR (StrLeft(Name(), 1) == "!") OR
> (StrLeft(Name(), 1) == "~");
>
> // loop through requested parameter ranges, calculating signals and
> choosing parameter values that score best
> first_bar_index = ValueWhen(Status("FirstBarInRange"), bar_index);
> for(p1 = p1_start; p1 <= p1_end; p1 = p1 + p1_step) {
> for(p2 = p2_start; p2 <= p2_end; p2 = p2 + p2_step) {
>
> // calc buy/sell/short/cover w those settings
> BuySellRule(False, p1, p2);
>
> // apply overall entry restrictions
> Buy = Buy AND is_min_price_long AND has_min_vol;
> Short = Short AND is_min_price_short AND has_min_vol;
>
> // calc performance score w those settings
> perf_score = PerformanceScore();
>
> // track settings w best performance and resulting equity
> if(equity_lookback_frequency == 0) {
> optimize_this_bar = 1;
> } else if(equity_lookback_frequency == -1) {
> optimize_this_bar = Status("FirstBarInRange");
> } else {
> optimize_this_bar = (first_bar_index - bar_index) %
> equity_lookback_frequency == 0;
> }
> is_new_best = IIf(optimize_this_bar AND perf_score >
> best_perf_score, 1, 0);
> best_perf_score = IIf(is_new_best, perf_score, best_perf_score);
> best_p1 = IIf(is_new_best, p1, best_p1);
> best_p2 = IIf(is_new_best, p2, best_p2);
> best_e = IIf(is_new_best, e, best_e);
> best_perf_score = IIf(optimize_this_bar, best_perf_score,
> ValueWhen(optimize_this_bar, best_perf_score));
> best_p1 = IIf(optimize_this_bar, best_p1,
> ValueWhen(optimize_this_bar, best_p1));
> best_p2 = IIf(optimize_this_bar, best_p2,
> ValueWhen(optimize_this_bar, best_p2));
> best_e = IIf(optimize_this_bar, best_e, ValueWhen(optimize_this_bar,
> best_e));
> }
> }
>
> // calc real buy/sell/short/cover w optimal settings
> BuySellRule(True, best_p1, best_p2);
>
> // apply overall entry restrictions
> Buy = Buy AND is_min_price_long AND has_min_vol AND has_min_history;
> Short = Short AND is_min_price_short AND has_min_vol AND has_min_history;
>
> // don't enter, exit now, unless lookback was perf_scoreable
> Buy = Buy AND best_perf_score > 0;
> Short = Short AND best_perf_score > 0;
> Sell = Sell OR best_perf_score <= 0;
> Cover = Cover OR best_perf_score <= 0;
>
> // kill sells and covers before respective entries; cleans up exploration
> Sell = Sell AND Cum(Buy);
> Cover = Cover AND Cum(Short);
>
> // kill dupe signals, for exploration
> Sell = ExRem(Sell, Buy);
> Cover = ExRem(Cover, Short);
>
> // set PostionSize and PositionScore if requested
> if(max_positions > 0) {
> PositionSize = -((100 / max_positions) - 1);
> }
> if(use_ranking) {
> PositionScore = IIf(Buy, best_perf_score, IIf(Short,
> -best_perf_score, 0));
> }
>
>
> //////////////////////////////////////////////////////////////////////////
> // EXPLORATION - EDITABLE IF YOU WANT, BUT USUALLY NOT NECCESSARY
> //////////////////////////////////////////////////////////////////////////
>
> Filter = Buy OR Sell OR Short OR Cover;
> //filter = optimize_this_bar; // to show every bar where optimization
> was done
> //filter = filter or Ref(filter, 1); // to show the day before each
> signal too
> //filter = 1; //to show all bars
>
> AddColumn(bar_index, "Bar Index", 1.0);
> AddColumn(Buy, "buy", 1);
> AddColumn(Sell, "sell", 1);
> AddColumn(Short, "short", 1);
> AddColumn(Cover, "cover", 1);
> AddColumn(optimize_this_bar, "optimize_this_bar", 1.0);
> AddColumn(best_perf_score, "best_perf_score", 1.4);
> AddColumn(best_e, "best_e", 1.0);
> AddColumn(((ValueWhen(Filter OR Status("LastBarInTest"), best_e, 0) -
> best_e) / best_e) * 100, "best_e_pct_change", 1.2);
> AddColumn(best_p1, "best_p1");
> AddColumn(best_p2, "best_p2");
> AddColumn(BarsSince(best_p1 != Ref(best_p1, -1) OR best_p2 !=
> Ref(best_p2, -1)) + 1, "bars_since_settings", 1.0);
> AddColumn(ValueWhen(Filter OR Status("LastBarInTest"), bar_index, 0) -
> bar_index, "bars", 1.0);
> AddColumn(has_min_history, "has_min_vol", 1.0);
> AddColumn(has_min_history, "has_min_history", 1.0);
> AddColumn(C, "price");
> AddColumn(equity_lookback_bars, "equity_lookback_bars");
> AddColumn(equity_lookback_frequency, "equity_lookback_frequency");
>
> // enable next lines to see more optimization details; note that only
> the last parameter set tried will show
> //AddColumn(e, "e");
> //AddColumn(e_ref, "e_ref");
> //AddColumn(perf_score, "perf_score", 1.4);
>
> // TRADING THE MACD Ver 1.0 by Karthik Marar. AFL provided as a part
> of the Discussion on trading the MACD in the Thread " Experiments in
> Technical Analysis"
> // Afl provided to learn and get an insight for trading using the
> MACD. The AFL can be freely distributed except for commercial purpose.
>
> _SECTION_BEGIN("MACD optimize");
> //------------------------------------------------------------------------------
> //
> // Formula Name: MACD optimize
> // Author/Uploader: Grayesso
> // E-mail: grayesso@xxx
> // Date/Time Added: 2003-12-10 14:12:39
> // Origin:
> // Keywords:
> // Level: advanced
> // Flags: showemail,function
> // Formula URL: http://www.amibroker.com/library/formula.php?id=313
> // Details URL: http://www.amibroker.com/library/detail.php?id=313
> //
> //------------------------------------------------------------------------------
> //
> // MACD (12,26,9 - 5,34,5 <==> by default - by Bill Williams
> //
> //------------------------------------------------------------------------------
>
> /* Project: AmiBroker
> ** File: MACD_optimize.afl
> ** Title: MACD Optimize for Automatic Analysis (English)
> ** Date: Dec 10th, 2003
> ** Written by: Grayesso (grayesso dog rambler dot ru)
> */
>
> /*After entering the formula just click on Optimize button in
> "Automatic Analysis" window. AmiBroker will start testing all possible
> combinations of optimization variables and report the results in the
> list. After optimization is done the list of result is presented
> sorted by the Net % profit. As you can sort the results by any column
> in the result list it is easy to get the optimal values of parameters
> for the lowest drawdown, lowest number of trades, largest profit
> factor, lowest market exposure and highest risk adjusted annual %
> return. The last three columns of result list present the values of
> optimization variables for given test.
>
>
> When you decide which combination of parameters suits your needs the
> best all you need to do is to replace the default values in optimize
> function calls with the optimal values. At current stage you need to
> type them by hand in the formula edit window (the second parameter of
> optimize function call). */
>
> /* MACD (12,26,9 - 5,34,5 <==> by default - by Bill Williams */
>
> /* variable = optimize( "Description", default, min, max, step ) */
>
>
> fa = Optimize( "MACD Fast", 5, 5, 12, 1 );
> sa = Optimize("MACD Slow", 34, 26, 34, 1 );
> sig = Optimize( "Signal average", 5, 5, 9, 1 );
>
> Buy = Cross( MACD( fa, sa ) , Signal( fa, sa, sig ) );
> Sell = Cross( Signal( fa, sa, sig ), MACD( fa, sa ) );
> _SECTION_END();
>
>
> _SECTION_BEGIN("Randomize");
> //------------------------------------------------------------------------------
> //
> // Formula Name: Randomize()
> // Author/Uploader: Antonio Marra
> // E-mail: ant.marra@xxx
> // Date/Time Added: 2004-07-20 06:40:47
> // Origin:
> // Keywords: Random interval
> // Level: basic
> // Flags: showemail,function
> // Formula URL: http://www.amibroker.com/library/formula.php?id=365
> // Details URL: http://www.amibroker.com/library/detail.php?id=365
> //
> //------------------------------------------------------------------------------
> //
> // This function will generate random numbers included in a given numeric
> // interval.
> //
> //------------------------------------------------------------------------------
>
> /*_________________________________________________________________________________________
>
>
> SYNTAX:
> Randomize(a,b)
>
> PURPOSE:
> This function will generate random numbers included in a
> given numeric interval.
>
> HOW TO USE:
> Copy this file in your include directory or append it to
> another file that You
> use as "functions database".
> "a" is the lowest value, "b" is the highest value.
>
> EXAMPLE:
> 1. if you want to generate random between 1 e 100 (with
> decimal values):
>
> RandomNumber = Randomize(1,100);
>
> 2. if you want to generate random between 1 e 100 (with only
> integer values):
>
> RandomNumber = int( Randomize(1,100) ) ;
>
>
> ________________________________________________________________________________________
>
>
> */
>
>
> function Randomize(a,b)
> {
> result = Random()*(b-a)+a;
> return result;
> }
> _SECTION_END();
>
> _SECTION_BEGIN("sort function");
> //------------------------------------------------------------------------------
> //
> // Formula Name: sort function
> // Author/Uploader: walt schwarz
> // E-mail: wschwarz@xxx
> // Date/Time Added: 2003-05-26 17:11:16
> // Origin:
> // Keywords: sort array function
> // Level: medium
> // Flags: showemail,function
> // Formula URL: http://www.amibroker.com/library/formula.php?id=283
> // Details URL: http://www.amibroker.com/library/detail.php?id=283
> //
> //------------------------------------------------------------------------------
> //
> // will return the passed array in sorted order
> //
> //------------------------------------------------------------------------------
>
> function sort(inlist)
>
> {
>
> //sort inlist
>
> temp=0;
>
> for(i = BarCount-1; i>=0; i--)
>
> {
>
> for (j = 1; j <= i; j++)
>
> {
>
> if (inlist[j-1] > inlist[j])
>
> {
>
> temp = inlist[j-1];
>
> inlist[j-1] = inlist[j];
>
> inlist[j] = temp;
>
> }
>
> }
>
> }
>
> //inlist now sorted
>
> return inlist;
>
> }
>
> _SECTION_END();
>
> SetCustomBacktestProc("");
> if( Status("action") == actionPortfolio )
> {
> bo = GetBacktesterObject();
> bo.Backtest();
> Buy = 0;
> Sell= 0;
> PosTradePos = 0;
> NegTradePos = 0;
> }
>
> _SECTION_BEGIN("EOD v1.1 Mod");
> #include <T3_include.AFL>;
> //WAD
> TrueRangeHigh=Max( Ref(Close,-1), High );
> TrueRangeLow=Min( Ref(Close,-1), Low );
> WAD = Cum(IIf(C > Ref(C,-1),C-TrueRangeLow, IIf(C <
> Ref(C,-1),C-TrueRangeHigh,0)));
> wadup = WAD > EMA (WAD,20);
> waddn = WAD < EMA (WAd,20);
> wadbl = Cross(WAD, EMA(WAD,20));
> wadbr = Cross(EMA(WAD,20), WAD);
> wad_status= WriteIf(wadup, "Bullish Zone", WriteIf(waddn, "Bearish
> Zone", WriteIf(wadbl, "Bullish Cross", WriteIf(wadbr, "Bearish Cross",
> "Zilch"))));
> wad_Col=IIf(wadup OR wadbl, colorGreen, IIf(waddn OR wadbr, colorRed,
> colorLightGrey));
>
>
> //Trend Strength
> up = ADX(10) > 20;
> down = ADX(10) < 20;
> choppy = ADX(10) < PDI(10) AND ADX(10) < MDI(10);
> adx_status= WriteIf(up, "Strong Trend", WriteIf(down, "Weak Trend",
> WriteIf( choppy, "Choppy", "Zilch")));
> adx_Col=IIf(up, colorGreen, IIf(down, colorRed, IIf(Choppy, colorPink,
> colorLightGrey)));
>
> // Coppock
> r1=ROC(C,14);
> r2=ROC(C,11);
> ck=EMA((r1+r2),10);
> upt=IIf(ck>0 AND ROC(ck,1)>0,ck,0);
> ups=IIf(ck>0 AND ROC(ck,1)<0,ck,0);
> downs=IIf(ck<0 AND ROC(ck,1)>0,ck,0);
> down=IIf(ck<0 AND ROC(ck,1)<0,ck,0);
> cop_status= WriteIf(upt, "Uptrend", WriteIf(ups, "Uptrend Sidways",
> WriteIf(downs, "Downtrend Sideways", WriteIf(down, "Downtrend",
> "Zilch"))));
> cop_Col=IIf(upt, colorDarkGreen, IIf(ups, colorGreen, IIf(downs,
> colorOrange, IIf(down, colorRed, colorLightGrey))));
>
> //Initial Buy Signal
> Ibuy = Cross(RSI(14), EMA(RSI(14),9));
> Isell = Cross(EMA(RSI(14),9), RSI(14));
> Ibuy = ExRem(Ibuy, ISell);
> Isell = ExRem(ISell, Ibuy);
> BlRSI = RSI(14) > EMA(RSI(14),9);
> BrRSI = RSI(14) < EMA(RSI(14),9);
> Ibuy_status= WriteIf(Ibuy, "Buy Warning", WriteIf(Isell, "Sell
> Warning", WriteIf(BlRSI, "Bullish Zone", WriteIf(BrRSI, "Breaish
> Zone", "Zilch"))));
> I_Col=IIf(Ibuy OR BlRSI, colorGreen, IIf(Isell OR BrRSI, colorRed,
> colorLightGrey));
>
> //BB Breakout
> bbk2 = Cross(RSI(14),30) AND
> RSI(14) > Ref(RSI(14),-1);
> bbk_status= WriteIf(bbk2, "Break RSI", "Zilch" );
> bbk_Col=IIf(bbk2, colorGreen, colorLightGrey);
>
>
> //Price Smoothing
> TBuy = Cross (T3(C,3), T3(C,5));
> TSell = Cross (T3(C,5), T3(C,3));
> TBuy = ExRem(TBuy, TSell);
> TSell = ExRem(TSell, TBuy);
> Tbuy_status= WriteIf(TBuy, "Buy", WriteIf(TSell, "Sell", "Zilch"));
> T_Col=IIf(TBuy, colorGreen, IIf(TSell, colorRed, colorLightGrey));
>
> //Guppy MMA
> P1 = EMA(C,3);
> P2 = EMA(C,5);
> P3 = EMA(C,8);
> P4 = EMA(C,10);
> P5 = EMA(C,12);
> P6 = EMA(C,15);
> P7 = EMA(C,30);
> P8 = EMA(C,35);
> P9 = EMA(C,40);
> P10 = EMA(C,45);
> P11 = EMA(C,50);
> P12 = EMA(C,55);
> P13 = EMA(C,60);
> GBuy = Cross (P1,P8);
> GSell = Cross(P8,P1);
> GBuy = ExRem(GBuy, GSell);
> GSell = ExRem(GSell, GBuy);
> Gbuy_status= WriteIf(GBuy, "Buy", WriteIf(GSell, "Sell", "Zilch"));
> G_Col=IIf(GBuy, colorGreen, IIf(GSell, colorRed, colorLightGrey));
>
> //EMA-9
> MAbuy = Cross(C, EMA(C,9));
> MAsell= Cross(EMA(C,9),C);
> MAbuy = ExRem(MAbuy, MAsell);
> MAsell = ExRem(MAsell, MAbuy);
> MA1 = C > EMA(C,9);
> MA11 = C < EMA(C,9);
> MA_status= WriteIf(MAbuy, "Buy", WriteIf(MAsell, "Sell", WriteIf(MA1,
> "Bullish", WriteIf(MA11, "Bearish","Zilch"))));
> MA_Col=IIf(MAbuy OR MA1, colorGreen, IIf(MAsell OR MA11, colorRed,
> colorLightGrey));
>
> //EMA-20
> MA2buy = Cross(C, EMA(C,20));
> MA2sell= Cross(EMA(C,20),C);
> MA2buy = ExRem(MA2buy, MA2sell);
> MA2sell = ExRem(MA2sell, MA2buy);
> MA2 = C > EMA(C,20);
> MA22 = C < EMA(C,20);
> MA2_status= WriteIf(MA2buy, "Buy", WriteIf(MA2sell, "Sell",
> WriteIf(MA2, "Bullish", WriteIf(MA22, "Bearish","Zilch"))));
> MA2_Col=IIf(MA2buy OR MA2, colorGreen, IIf(MA2sell OR MA22, colorRed,
> colorLightGrey));
>
> //EMA-9 x 20
> MA3buy = Cross(EMA(C,9), EMA(C,20));
> MA3sell= Cross(EMA(C,20),EMA(C,9));
> MA3buy = ExRem(MA3buy, MA3sell);
> MA3sell = ExRem(MA3sell, MA3buy);
> MA3 = EMA(C,9) > EMA(C,20);
> MA33 = EMA(C,9) < EMA(C,20);
> MA3_status= WriteIf(MA3buy, "Buy", WriteIf(MA3sell, "Sell",
> WriteIf(MA3, "Bullish", WriteIf(MA33, "Bearish","Zilch"))));
> MA3_Col=IIf(MA3buy OR MA3, colorGreen, IIf(MA3sell OR MA33, colorRed,
> colorLightGrey));
>
> //Midterm Bullish or Bearish
> mBull = C > EMA(C,50);
> mBear= C < EMA(C,50);
> mt_status= WriteIf(mBull, "Bullish", WriteIf(mBear, "Bearish", "Zilch"));
> mt_Col=IIf(mBull, colorGreen, IIf(mbear, colorRed, colorLightGrey));
>
> //Longterm Bullish or Bearish
> Bull = C > EMA(C,200);
> Bear= C < EMA(C,200);
> lt_status= WriteIf(Bull, "Bullish", WriteIf(Bear, "Bearish", "Zilch"));
> lt_Col=IIf(Bull, colorGreen, IIf(bear, colorRed, colorLightGrey));
>
> //Long-term Price Trend
> rc= C > EMA (C,50) AND C < EMA(C,200) AND EMA(C,50) < EMA(C,200);
> ac= C > EMA (C,50) AND C > EMA(C,200) AND EMA(C,50) < EMA(C,200);
> bl= C > EMA (C,50) AND C > EMA(C,200) AND EMA(C,50) > EMA(C,200);
> wr= C < EMA (C,50) AND C > EMA(C,200) AND EMA(C,50) > EMA(C,200);
> ds= C < EMA (C,50) AND C < EMA(C,200) AND EMA(C,50) > EMA(C,200);
> br= C < EMA (C,50) AND C < EMA(C,200) AND EMA(C,50) < EMA(C,200);
>
> ltp=WriteIf(rc, "RECOVERY", WriteIf(ac, "ACCUMULATION", WriteIf(bl,
> "BULLISH", WriteIf(wr, "WARNING",WriteIf(ds,
> "DISTRIBUTION",WriteIf(br, "BEARISH", "Zilch"))))));
> ltp_col=IIf( rc, colorBlue, IIf( ac, colorGreen, IIf(bl,
> colorDarkGreen, IIf(wr, colorOrange, IIf(ds, colorRed, IIf(br,
> colorDarkRed, colorLightGrey ))))));
>
> G=((O-Ref(L,-1))/Ref(L,-1))*100;
> F=((C-Ref(C,-1))/Ref(C,-1))*100;
>
> //T-3 Delta
> T3Day = T3(Close, 3);
> T5Day = T3(Close, 5);
> Delta = T3Day - T5Day;
>
>
> Filter=O<Ref(L,-1) AND C>Ref(C,-1)|C>Ref(O,-1)
> AND L<Ref(L,-1) AND Ref(L,-1)<Ref(L,-2) AND Ref(L,-2)<Ref(L,-3)
> AND V>Ref(V,-1) AND V>(MA(Ref(V,-1),5)+(MA(Ref(V,-1),5)*0.3)) AND
> MA(V,21)>50000;
>
> Buy=Filter;
>
> AddColumn(V, "Volome", 1, IIf(V > Ref(V,-1), colorGreen, colorRed),-1);
> AddColumn(((V/EMA(Ref(V,-1),10)))*100, "VolSpike %", 1.2, IIf(V>
> EMA(Ref(V,-1),10), colorBlue, colorRed),-1);
> AddColumn(Delta, "Delta",1.2, IIf(delta < 0, colorRed, colorGreen),-1);
> AddColumn(C, "Close", 1.2, IIf(C > Ref(C,-1), colorGreen, colorRed),-1);
> AddColumn(G,"O Low%",1.2,-1);
> AddColumn(F,"C High%",1.2,-1);
> AddColumn(RSI(14),"RSI-14",1.2, IIf(RSI(14) > Ref(RSI(14),-1),
> colorGreen, colorRed),-1);
> AddColumn(ADX(10),"ADX-10",1.2,IIf(ADX(10) > Ref(ADX(10),-1),
> colorGreen, colorRed),-1);
> AddTextColumn(bbk_status, "Breaks", 1.6, colorWhite, bbk_Col,-1);
> AddTextColumn(Tbuy_status, "T3-Signal", 1.6, colorWhite, T_Col,-1);
> AddTextColumn(Gbuy_status, "Guppy", 1.6, colorWhite, G_Col,-1);
> AddTextColumn(MA_status, "EMA-9", 1.6, colorWhite, MA_Col,-1);
> AddTextColumn(MA2_status, "EMA-20", 1.6, colorWhite, MA2_Col,-1);
> AddTextColumn(MA3_status, "EMA-9x20", 1.6, colorWhite, MA3_Col,-1);
> AddTextColumn(Ibuy_status, "RSI signal", 1.6, colorWhite, I_Col,-1);
> AddTextColumn(adx_status, "Trend", 1.6, colorWhite, adx_Col,-1);
> AddTextColumn(cop_status, "Coppock", 1.6, colorWhite, cop_Col,-1);
> AddTextColumn(mt_status, "Mid Term", 1, colorWhite, mt_Col);
> AddTextColumn(lt_status, "Long Term", 1, colorWhite, lt_Col);
> //AddTextColumn(wad_status, "WAD", 1.6, colorWhite, WAD_Col,-1);
> //AddTextColumn(mt_status, "EMA-50", 1.6, colorWhite, mt_Col,-1);
> //AddTextColumn(lt_status, "EMA-200", 1.6, colorWhite, lt_Col,-1);
> AddTextColumn(ltp, "Phase", 1.6, colorWhite, ltp_Col,-1);
>
>
> _SECTION_END();
>
> _SECTION_BEGIN("All in One EOD Explorer");
> //52 Week New High-New Low
> HI = High > Ref(HHV(High,260),-1);
> LI = Low < Ref(LLV(Low,260),-1);
> W_status= WriteIf(HI, "High", WriteIf(LI, "Low", "Neutral"));
> W_Col=IIf(HI, colorGreen, IIf(LI, colorRed, colorLightGrey));
>
>
> //Price Volume Breakout
> HIV = C > Ref (C,-1) AND V > (MA(V,50)*2);
> LIV = C < Ref (C,-1) AND V < (MA(V,50)*2);
> V_status= WriteIf(HIV, "Gainer", WriteIf(LIV, "Loser", "Neutral"));
> V_Col=IIf(HIV, colorGreen, IIf(LIV, colorRed, colorLightGrey));
>
>
> //50/200 Crosses
> BC= Cross(MA(C,50),MA(C,200));
> BR= Cross(MA(C,200),MA(C,50));
> B_status= WriteIf(BC, "Bullish", WriteIf(BR, "Bearish", "Neutral"));
> B_Col=IIf(BC, colorGreen, IIf(BR, colorRed, colorLightGrey));
>
> //MACD Crosses
> MB= Cross (MACD(), Signal());
> MS = Cross( Signal(), MACD());
> MB_status= WriteIf(MB, "Bullish", WriteIf(MS, "Bearish", "Neutral"));
> MS_Col=IIf(MB, colorGreen, IIf(MS, colorRed, colorLightGrey));
>
> //RSI Status
> r=RSI(14) < 70 AND Ref (RSI(14),-1) > 70 AND Ref (RSI(14),-2) > 70;
> r2= RSI(14) > 70 AND Ref (RSI(14),-1) < 70 AND Ref (RSI(14),-2) < 70;
> r_status= WriteIf(r, "Declining", WriteIf(r2, "Improving", "Neutral"));
> r_Col=IIf(r, colorGreen, IIf(r2, colorRed, colorLightGrey));
>
> //Bollinger Bands
> bb= C > BBandTop( C, 20, 2) AND Ref (C,-1) < Ref(BBandTop( C, 20, 2),-1);
> bb1= C < BBandBot( C, 20, 2) AND Ref (C,-1) > Ref(BBandBot( C, 20, 2),-1);
> bb_status= WriteIf(BB, "AboveTop", WriteIf(r2, "BelowBottom", "Neutral"));
> bb_Col=IIf(r, colorGreen, IIf(r2, colorRed, colorLightGrey));
>
> //Daily Acc/Dist Status
> acc = AccDist() > Ref (AccDist(),-1);
> dist = AccDist() < Ref (AccDist(),-1);
> ad_status= WriteIf(acc, "Accumulation", WriteIf(dist, "Distribution",
> "Neutral"));
> ad_Col=IIf(acc, colorGreen, IIf(dist, colorRed, colorLightGrey));
>
> //Midterm Bullish or Bearish
> mBull = C > EMA(C,50);
> mBear= C < EMA(C,50);
> mt_status= WriteIf(mBull, "Bullish", WriteIf(mBear, "Bearish", "Zilch"));
> mt_Col=IIf(mBull, colorGreen, IIf(mbear, colorRed, colorLightGrey));
>
> //Longterm Bullish or Bearish
> Bull = C > MA(C,200);
> Bear= C < MA(C,200);
> lt_status= WriteIf(Bull, "Bullish", WriteIf(Bear, "Bearish", "Neutral"));
> lt_Col=IIf(Bull, colorGreen, IIf(bear, colorRed, colorLightGrey));
>
> //Median Price
> mp=(H+L)/2;
>
> Filter = HI OR LI OR HIV OR LIV OR BC OR BR OR MB OR MS OR acc OR dist
> OR bull OR bear;
>
> AddColumn(C, "Close", 1.2, IIf(C > Ref(C,-1), colorGreen, colorRed));
> AddColumn(ROC(C,1), "ROC Price", 1.2, IIf(ROC(C,1) > 0, colorGreen,
> colorRed));
> AddColumn(mp, "Median Price", 1.2, IIf(mp > Ref(mp,-1), colorGreen,
> colorRed));
> AddColumn(V, "Volume", 1, IIf(V > Ref(V,-1), colorGreen, colorRed));
> AddColumn(ROC(V,1), "ROC Volume", 1.2, IIf(ROC(V,1) > 0, colorGreen,
> colorRed));
> AddTextColumn(V_status, "Price Volume Breakout", 1, colorWhite, V_Col);
> AddTextColumn(ad_status, "Acc/Dist", 1, colorWhite, ad_Col);
> AddColumn(NVI(), "NVI", 1, IIf(NVI() > Ref(NVI(),-1), colorGreen,
> colorRed));
> AddColumn(MFI(21),"MFI-21",1.2, IIf(MFI(21) > Ref(MFI(21),-1),
> colorGreen, colorRed));
> AddColumn(RSI(14),"RSI-14",1.2, IIf(RSI(14) > Ref(RSI(14),-1),
> colorGreen, colorRed));
> AddColumn(ADX(14),"ADX-14",1.2,IIf(ADX(14) > Ref(ADX(14),-1),
> colorGreen, colorRed));
> AddTextColumn(bb_status, "BBand", 1, colorWhite, bb_Col);
> AddTextColumn(MB_status, "MACDX", 1, colorWhite, MS_Col);
> AddTextColumn(W_status, "52-Week", 1, colorWhite, W_Col);
> AddTextColumn(B_status, "50/200", 1, colorWhite, B_Col);
> AddTextColumn(mt_status, "Mid Term", 1, colorWhite, mt_Col);
> AddTextColumn(lt_status, "Long Term", 1, colorWhite, lt_Col);
> _SECTION_END();
>
> Buy = Cover =Cross( MACD(), 0 );
> Sell = Short =Cross( 0, MACD() );
>
> Filter = Cross( MACD(), 0 );
>
> Buy = ExRem(Buy,Sell);
> Sell = ExRem(Sell,Buy);
>
> a=EMA(C,30)-EMA(C,200);
> b=EMA(a,20);
>
>
> Buy = Cross( a,b );
> Sell = Cross( b,a );
> //Short = Sell;
> //Cover = Buy;
>
> AlertIf( Buy, "", "MACD BUY", 1,1+2 );
>
> AlertIf( Sell, "", "MACD SELL", 2 ,1+2);
>
> --- End forwarded message ---
>
>
>
> ------------------------------------
>
> Please note that this group is for discussion between users only.
>
> To get support from AmiBroker please send an e-mail directly to
> SUPPORT {at} amibroker.com
>
> For NEW RELEASE ANNOUNCEMENTS and other news always check DEVLOG:
> http://www.amibroker.com/devlog/
>
> For other support material please check also:
> http://www.amibroker.com/support.html
> Yahoo! Groups Links
>
>
>
>
> ------------------------------------------------------------------------
>
>
> No virus found in this incoming message.
> Checked by AVG - http://www.avg.com
> Version: 8.0.169 / Virus Database: 270.6.15/1648 - Release Date: 9/2/2008 5:29 PM
>
------------------------------------
Please note that this group is for discussion between users only.
To get support from AmiBroker please send an e-mail directly to
SUPPORT {at} amibroker.com
For NEW RELEASE ANNOUNCEMENTS and other news always check DEVLOG:
http://www.amibroker.com/devlog/
For other support material please check also:
http://www.amibroker.com/support.html
Yahoo! Groups Links
<*> To visit your group on the web, go to:
http://groups.yahoo.com/group/amibroker/
<*> Your email settings:
Individual Email | Traditional
<*> To change settings online go to:
http://groups.yahoo.com/group/amibroker/join
(Yahoo! ID required)
<*> To change settings via email:
mailto:amibroker-digest@xxxxxxxxxxxxxxx
mailto:amibroker-fullfeatured@xxxxxxxxxxxxxxx
<*> To unsubscribe from this group, send an email to:
amibroker-unsubscribe@xxxxxxxxxxxxxxx
<*> Your use of Yahoo! Groups is subject to:
http://docs.yahoo.com/info/terms/
|