hI SUBAS Just add these lines and try scan ----------------------------------------------------- Buy = (aLPivs==1) OR (aAddedLPivs==1); Sell =(aHPivs==1) OR (aAddedHPivs==1); Filer = Buy OR Sell; -----------------------------------------------------------------
--- On Sun, 8/30/09, subhaschandmishra <subhaschandmis...@yahoo.com> wrote: From: subhaschandmishra <subhaschandmis...@yahoo.com> Subject: [amibroker] Any AFL expert add buy/sell condition for Auto-analyses scan To: amibroker@yahoogroups.com Date: Sunday, August 30, 2009, 10:45 AM Here is a good AFL gives Accurate buy and sell signal but it has no sufficient variables for Auto-analyses of Amibroker. Can any Afl expert add buy/sell variables for Auto-analyses scan. If any one do it, then this afl will be of great usefull. _SECTION_BEGIN( "Price"); SetChartOptions( 0,chartShowArrow s|chartShowDates ); _N(Title = StrFormat("{ {NAME}} - {{INTERVAL}} {{DATE}} Open %g, Hi %g, Lo %g, Close %g (%.1f%%) Vol " +WriteVal( V, 1.0 ) +" {{VALUES}}", O, H, L, C, SelectedValue( ROC( C, 1 )) )); Plot( C, "Close", ParamColor(" Color", colorBlack ), styleNoTitle | ParamStyle(" Style") | GetPriceStyle( ) ); if( ParamToggle( "Tooltip shows", "All Values|Only Prices" ) ) { ToolTip=StrFormat( "Open: %g\nHigh: %g\nLow: %g\nClose: %g (%.1f%%)\nVolume: "+NumToStr( V, 1 ), O, H, L, C, SelectedValue( ROC( C, 1 ))); } _SECTION_END( ); _SECTION_BEGIN( "GIP-3"); SetChartOptions( 0,chartShowArrow s|chartShowDates ); _N(Title = StrFormat("{ {NAME}} - {{INTERVAL}} {{DATE}} Open %g, Hi %g, Lo %g, Close %g (%.1f%%) Vol " +WriteVal( V, 1.0 ) +" {{VALUES}}", O, H, L, C, SelectedValue( ROC( C, 1 )) )); Plot( C, "Close", ParamColor(" Color", colorBlack ), styleNoTitle | ParamStyle(" Style") | GetPriceStyle( ) ); if( ParamToggle( "Tooltip shows", "All Values|Only Prices" ) ) { ToolTip=StrFormat( "Open: %g\nHigh: %g\nLow: %g\nClose: %g (%.1f%%)\nVolume: "+NumToStr( V, 1 ), O, H, L, C, SelectedValue( ROC( C, 1 ))); } // -- 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 = False; bTCZShort = 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) ; // -- 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("barvisib le"), 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 (nLLVIdxAfterLastPi v - lastHPIdx - 1) >= nMinBarsBtwPivs AND nLLVIdxAfterLastPiv != curBar ) { // -- OK, we'll add this as a pivot. // Mark it for plotting... aLPivs[nLLVIdxAfter LastPiv] = 1; aAddedLPivs[ nLLVIdxAfterLast Piv] = 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 (nLLVIdxAfterLastPi v - lastHPIdx - 1) >= nMinBarsBtwPivs AND nLLVIdxAfterLastPiv != curBar ) { // -- OK, we'll add this as a pivot. // Mark it for plotting... aLPivs[nLLVIdxAfter LastPiv] = 1; aAddedLPivs[ nLLVIdxAfterLast Piv] = 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 (nHHVIdxAfterLastPi v - lastLPIdx - 1) >= nMinBarsBtwPivs AND nHHVIdxAfterLastPiv != curBar ) { // -- OK, we'll add this as a pivot. // Mark that for plotting aHPivs[nHHVIdxAfter LastPiv] = 1; aAddedHPivs[ nHHVIdxAfterLast Piv] = 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 (nHHVIdxAfterLastPi v - lastLPIdx - 1) >= nMinBarsBtwPivs AND nHHVIdxAfterLastPiv != curBar ) { // -- OK, we'll add this as a pivot. // Mark it for plotting... aHPivs[nHHVIdxAfter LastPiv] = 1; aAddedHPivs[ nHHVIdxAfterLast Piv] = 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), colorBrown, 0, High, Offset=-15); PlotShapes( IIf(aLPivs== 1, shapeUpArrow , shapeNone), colorGreen, 0, Low, Offset=-15); PlotShapes( IIf(aAddedLPivs= =1, shapeUpArrow , shapeNone), colorBlue, 0, Low, Offset=-15); } /* ************ ********* ********* ********* * // -- Done with discovering and plotting pivots ************ ********* ********* ********* ** */ _SECTION_END( );