Double Bottom screener

Viewing 3 posts - 1 through 3 (of 3 total)
  • Author
    Posts
  • #99165 quote
    prevailution
    Participant
    Junior

    Hi,

    I am looking for a double bottom screener with minimum volume 1 million and minimum price 20 dollars

    My search online found Leo’s double top and bottom screener, but I am wondering if it is possible to:

    1. Exclude double tops
    2. Add minimum volume
    3. Add minimum price

    His screener code is. I’m not sure how to exclude double tops and add minimum conditions without ruining the code.

    //LOCALS MINIMUMS AND MAXIMUMS USING LEO MOVING AVERAGE
    //Autor: LEO
     
    //VARIABLES TO BE OPTIMIZED
     
    PERIOD=40    //Period for analysis
     
     
    //Definition of what is a double top or double bottom
    Kdouble=0.2 //Factor for defining what is double top or bottom
     
    //-----------
     
    //Leo Moving Average, formula: LMA= WMA+(WMA-SMA)
    LMA=2*weightedaverage[period](close)-average[period](close)
     
    //Smoothed curve of Leo Moving Average
    IF BARINDEX > period THEN
     smoothLMA=weightedaverage[period](LMA)
    ELSE
     smoothLMA=undefined
    ENDIF
     
    // Direction or trend of the LMA
     
     
    // << Storage of minimums and maximums >>
    once mintemp=low
    once posmintemp=1
    once maxtemp=high
    once posmaxtemp=1
     
    IF BARINDEX>2 THEN
     // the value 0.7 is to ensure that the donchian channel is faster than the curves analysis (this value to be checked)
     IF low < lowest[round(0.7*period)](low[1]) THEN
      mintemp=low //minimum temporal
      posmintemp=BARINDEX //postition of minimum temporal
     ENDIF
     IF high > highest[round(0.7*period)](high[1]) then
      maxtemp=high //maximum temporal
      posmaxtemp=BARINDEX //position maximum temporal
     ENDIF
    ENDIF
     
    //  << Detecting and locating a local minimums >>
    //  Where the LMA is crossing the smoothed LMA, there is a maximum or minimum nearby
    //  If there is a new local min/max, the preivus one is stored in de varible B... (before)
    once LEVMIN=low
    once POSLEVMIN=1
    once LEVMAX=high
    once POSLEVMAX=1
    once bullcross=0
    once bearcross=0
     
    IF BARINDEX > PERIOD THEN //For avoid computer errors
     bullcross=LMA crosses over smoothLMA
     bearcross=LMA crosses under smoothLMA
    ENDIF
     
     
    IF bullcross and POSLEVMIN<>posmintemp  THEN
     BLEVMIN=LEVMIN        //previus local minimum is saved
     BPOSLEVMIN=POSLEVMIN
     LEVMIN=mintemp
     POSLEVMIN=posmintemp
     support=LEVMIN
    ENDIF
     
    // --> Detecting and locating a local maximum
    IF bearcross and POSLEVMAX<>posmaxtemp THEN
     BLEVMAX=LEVMAX       //previus local maximum is saved
     BPOSLEVMAX=POSLEVMAX
     LEVMAX=maxtemp
     POSLEVMAX=posmaxtemp
     resistance=LEVMAX
    ENDIF
     
    support=min(low,support)
    resistance=max(high,resistance)
     
     
    // << DETECTING DOUBLE TOP OR BOTTOMS  >>
     
    once WidthDoubleTop = high-low
    once WidthDoubleBottom = high-low
    once Wpattern=0
    once Mpattern=0
     
     
    //  <<<<<<  Double bottoms   >>>>>>>>>
     
    //looking for the top between two local minimums
    IF bullcross THEN
     doublebottomtop=high[BARINDEX-POSLEVMIN+1] // we start looking for the top in between two local minimums
     //POSdoublebottomtop=BARINDEX-POSLEVMIN+1
     FOR i = (BARINDEX-POSLEVMIN+1) to (BARINDEX-BPOSLEVMIN-1) DO
      IF high[i] > doublebottomtop THEN
       doublebottomtop=high[i]
       //POSdoublebottomtop=BARINDEX-i
      ENDIF
     NEXT
     WidthDoubleBottom = doublebottomtop-(BLEVMIN+LEVMIN)/2 // (top betwen local minimums) - (average of the las two local minimums)
     IF abs(BLEVMIN-LEVMIN) < Kdouble*WidthDoubleBottom THEN
      // we have a double bottom
      Wpattern=1
     else
      Wpattern=0
     ENDIF
    ENDIF
     
    //   <<<<<<<<<<  Double tops    >>>>>>>
     
    //looking for the bottom between two local maximums
    IF bearcross THEN
     doubletopbottom=low[BARINDEX-POSLEVMAX+1]
     //POSdoubletopbottom=BARINDEX-POSLEVMAX+1
     FOR i = (BARINDEX-POSLEVMAX+1) to (BARINDEX-BPOSLEVMAX-1) DO
      IF low[i] < doubletopbottom THEN
       doubletopbottom=low[i]
       //POSdoubletopbottom=BARINDEX-i
      ENDIF
     NEXT
     WidthDoubleTop=(BLEVMAX+LEVMAX)/2 -doubletopbottom
     IF abs(BLEVMAX-LEVMAX) < Kdouble*WidthDoubleTop THEN
      // we have a double top
      Mpattern=1
     else
      Mpattern=0
     ENDIF
    ENDIF
     
    //    <<<<<<<<<<  DOUBLE TOP AND DOUBLE BOTTOM FOR TRADING  >>>>>>>>
     
     
    myATR=AverageTrueRange[2*period](close)
     
    IF Wpattern=1 THEN
     IF close > (doublebottomtop+myATR) or close < (LEVMIN-0.5*myATR) THEN
      Wpattern=0 //  <<<< double bottom has been activated or it was cancelled >>>>>
     ELSE
     //       <<<<<<<  HERE WE HAVE A DOUBLE BOTTOM FOR TRADING  >>>>>
      exactness=abs(BLEVMIN-LEVMIN) / WidthDoubleBottom
     ENDIF
    ENDIF
     
    IF Mpattern=1 THEN
     IF close < (doubletopbottom-myATR) or close > (LEVMAX+0.5*myATR) THEN
      Mpattern=0 //double top has been activated or it was cancelled
     ELSE
     //       <<<<<<<  HERE WE HAVE A DOUBLE TOP FOR TRADING  >>>>>
      exactness= abs(BLEVMAX-LEVMAX) / WidthDoubleTop
     ENDIF
    ENDIF
     
     
    SCREENER[Wpattern=1 or Mpattern=1](exactness)
    #99193 quote
    Nicolas
    Keymaster
    Master

    It is not necessary to delete the double top part, just add a condition that there is no double top. I added a minimum price and volume condition at the end of the code, you can change it there.

    //LOCALS MINIMUMS AND MAXIMUMS USING LEO MOVING AVERAGE
    //Autor: LEO
     
    //VARIABLES TO BE OPTIMIZED
     
    PERIOD=40    //Period for analysis
     
     
    //Definition of what is a double top or double bottom
    Kdouble=0.2 //Factor for defining what is double top or bottom
     
    //-----------
     
    //Leo Moving Average, formula: LMA= WMA+(WMA-SMA)
    LMA=2*weightedaverage[period](close)-average[period](close)
     
    //Smoothed curve of Leo Moving Average
    IF BARINDEX > period THEN
    smoothLMA=weightedaverage[period](LMA)
    ELSE
    smoothLMA=undefined
    ENDIF
     
    // Direction or trend of the LMA
     
     
    // << Storage of minimums and maximums >>
    once mintemp=low
    once posmintemp=1
    once maxtemp=high
    once posmaxtemp=1
     
    IF BARINDEX>2 THEN
    // the value 0.7 is to ensure that the donchian channel is faster than the curves analysis (this value to be checked)
    IF low < lowest[round(0.7*period)](low[1]) THEN
    mintemp=low //minimum temporal
    posmintemp=BARINDEX //postition of minimum temporal
    ENDIF
    IF high > highest[round(0.7*period)](high[1]) then
    maxtemp=high //maximum temporal
    posmaxtemp=BARINDEX //position maximum temporal
    ENDIF
    ENDIF
     
    //  << Detecting and locating a local minimums >>
    //  Where the LMA is crossing the smoothed LMA, there is a maximum or minimum nearby
    //  If there is a new local min/max, the preivus one is stored in de varible B... (before)
    once LEVMIN=low
    once POSLEVMIN=1
    once LEVMAX=high
    once POSLEVMAX=1
    once bullcross=0
    once bearcross=0
     
    IF BARINDEX > PERIOD THEN //For avoid computer errors
    bullcross=LMA crosses over smoothLMA
    bearcross=LMA crosses under smoothLMA
    ENDIF
     
     
    IF bullcross and POSLEVMIN<>posmintemp  THEN
    BLEVMIN=LEVMIN        //previus local minimum is saved
    BPOSLEVMIN=POSLEVMIN
    LEVMIN=mintemp
    POSLEVMIN=posmintemp
    support=LEVMIN
    ENDIF
     
    // --> Detecting and locating a local maximum
    IF bearcross and POSLEVMAX<>posmaxtemp THEN
    BLEVMAX=LEVMAX       //previus local maximum is saved
    BPOSLEVMAX=POSLEVMAX
    LEVMAX=maxtemp
    POSLEVMAX=posmaxtemp
    resistance=LEVMAX
    ENDIF
     
    support=min(low,support)
    resistance=max(high,resistance)
     
     
    // << DETECTING DOUBLE TOP OR BOTTOMS  >>
     
    once WidthDoubleTop = high-low
    once WidthDoubleBottom = high-low
    once Wpattern=0
    once Mpattern=0
     
     
    //  <<<<<<  Double bottoms   >>>>>>>>>
     
    //looking for the top between two local minimums
    IF bullcross THEN
    doublebottomtop=high[BARINDEX-POSLEVMIN+1] // we start looking for the top in between two local minimums
    //POSdoublebottomtop=BARINDEX-POSLEVMIN+1
    FOR i = (BARINDEX-POSLEVMIN+1) to (BARINDEX-BPOSLEVMIN-1) DO
    IF high[i] > doublebottomtop THEN
    doublebottomtop=high[i]
    //POSdoublebottomtop=BARINDEX-i
    ENDIF
    NEXT
    WidthDoubleBottom = doublebottomtop-(BLEVMIN+LEVMIN)/2 // (top betwen local minimums) - (average of the las two local minimums)
    IF abs(BLEVMIN-LEVMIN) < Kdouble*WidthDoubleBottom THEN
    // we have a double bottom
    Wpattern=1
    else
    Wpattern=0
    ENDIF
    ENDIF
     
    //   <<<<<<<<<<  Double tops    >>>>>>>
     
    //looking for the bottom between two local maximums
    IF bearcross THEN
    doubletopbottom=low[BARINDEX-POSLEVMAX+1]
    //POSdoubletopbottom=BARINDEX-POSLEVMAX+1
    FOR i = (BARINDEX-POSLEVMAX+1) to (BARINDEX-BPOSLEVMAX-1) DO
    IF low[i] < doubletopbottom THEN
    doubletopbottom=low[i]
    //POSdoubletopbottom=BARINDEX-i
    ENDIF
    NEXT
    WidthDoubleTop=(BLEVMAX+LEVMAX)/2 -doubletopbottom
    IF abs(BLEVMAX-LEVMAX) < Kdouble*WidthDoubleTop THEN
    // we have a double top
    Mpattern=1
    else
    Mpattern=0
    ENDIF
    ENDIF
     
    //    <<<<<<<<<<  DOUBLE TOP AND DOUBLE BOTTOM FOR TRADING  >>>>>>>>
     
     
    myATR=AverageTrueRange[2*period](close)
     
    IF Wpattern=1 THEN
    IF close > (doublebottomtop+myATR) or close < (LEVMIN-0.5*myATR) THEN
    Wpattern=0 //  <<<< double bottom has been activated or it was cancelled >>>>>
    ELSE
    //       <<<<<<<  HERE WE HAVE A DOUBLE BOTTOM FOR TRADING  >>>>>
    exactness=abs(BLEVMIN-LEVMIN) / WidthDoubleBottom
    ENDIF
    ENDIF
     
    IF Mpattern=1 THEN
    IF close < (doubletopbottom-myATR) or close > (LEVMAX+0.5*myATR) THEN
    Mpattern=0 //double top has been activated or it was cancelled
    ELSE
    //       <<<<<<<  HERE WE HAVE A DOUBLE TOP FOR TRADING  >>>>>
    exactness= abs(BLEVMAX-LEVMAX) / WidthDoubleTop
    ENDIF
    ENDIF
    
    minprice = close>10
    minvol = volume>100000 
     
    SCREENER[Wpattern=1 and not Mpattern and minprice and minvol](exactness)
    prevailution thanked this post
    #99199 quote
    prevailution
    Participant
    Junior

    Thank you!

Viewing 3 posts - 1 through 3 (of 3 total)
  • You must be logged in to reply to this topic.

Double Bottom screener


ProScreener: Market Scanners & Detection

New Reply
Author
Summary

This topic contains 2 replies,
has 2 voices, and was last updated by prevailution
6 years, 10 months ago.

Topic Details
Forum: ProScreener: Market Scanners & Detection
Language: English
Started: 05/22/2019
Status: Active
Attachments: No files
Logo Logo
Loading...