Auto Fib (Fibonacci) Levels Indicator for ThinkorSwim

B

Buckbull

Member
Thanks for all of the enhancements and variations to this AutoFib study @tomsk @BLT @theelderwand !!

@Buckbull I spent days pulling the information together for the Scanner information in #116 above. It is detailed. It takes time, but that is how we all started. Please go through everything twice.
Also in the Tutorials is this excellent piece by @Townsend https://usethinkscript.com/threads/stock-screener-q-a-tips-tricks.1262/
Then there is this: https://usethinkscript.com/threads/thinkscript-q-a-with-links.283/
Next, please click on the Education Tab along the top of ThinkorSwim. That will take you into the TDAmeritrade Learning site. Tons of videos there.

This video is from Don Kaufman who was one of the first employees of TOS. He had direct input in the building of the scanner.

Everything you could need except sleep is located above. Good luck, it will take time.
@markos Im watching and reading right now . Thank you
 
markos

markos

Well-known member
VIP
@markos Im watching and reading right now . Thank you
You're welcome. You'll get it, just keep trying different things. btw, some of the people we are blessed with for helping us are busy working as professional traders in Asia, India and Europe. We want to be sure that we respect their time as they certainly don't have to give it.
We all must be measured in our questions, I guess is what I'm saying. :)
 
B

Buckbull

Member
You're welcome. You'll get it, just keep trying different things. btw, some of the people we are blessed with for helping us are busy working as professional traders in Asia, India and Europe. We want to be sure that we respect their time as they certainly don't have to give it.
We all must be measured in our questions, I guess is what I'm saying. :)
I get it @tomsk has helped me many times ,always appreciate the help he gives .
 
B

BLT

Member
@BLT Im slowley learning this so dont be too hard on me lol . So I saved SwingHL_Fibs_v14 as a study i go into the scan tab and i add it as study the 61.8 is Fib 3 i highlight that but i cant find a way to specify a close above that level . What am i not doing wrong ? Or what am I not understanding
I put 2 example scan codes in the header of the SwingHL_Fibs_v14 study that you can copy and paste into the scanner. Since you have saved the study as noted in your comment with the study name in those examples, just copy one or the other into the thinkscript editor of a custom study filter, click save, select ok at the popup message, and then scan. The first scan will produce results with a close above the 61.8% level. The second scan will produce results with a close that crossed above the 61.8% level within the last 3 bars. Good luck. A special thanks to @tomsk and @markos for your valuable assistance.
 
D

dreamb0x

New member
VIP
Thanks for this indicator. i've been looking for something like this.

what i did was
'studies' -> create -> thinkscript editor


but when i tried to edit the script it looks like this..


any idea what went wrong?
 
B

BLT

Member
Yes, go to Chart Settings, Price Axis and uncheck Fit Studies, in particular, and uncheck any other "Fit".
 
D

dreamb0x

New member
VIP
thank you. but after i uncheck all the 'fit'
the candles dont fit in?
 
markos

markos

Well-known member
VIP
@dreamb0x When you paste a picture, please be sure that the price and date/time scales are showing.
Keep adjusting it, add a tick box that you unchecked, change from Log to No Log price scale, add more bars to the right side, etc.
Be sure to write down your changes so you can keep track of the result.
 
  • Like
Reactions: BLT
C

Craighaber71

Member
2019 Donor
Warehouse
VIP
Its it possible to scan for close above R2 or below S2 with my WL
 
B

Buckbull

Member
@BLT quick question why on some stocks the fibs are flipped ? the 0% is the high and the low is 100% .
 
B

BLT

Member
The fibs are dependent on whether the last swing is up (last bubble is 100% and to the right of and above previous bubble) or down (last bubble is 0% and to the right of and is below previous bubble). This swing code also identifies all swings which can result in S2 being above R2 in some instances. It does not require a zigzag type of pattern.
 
B

Buckbull

Member
This is a script to add in a watchlist to let you know when a stock is touching the 21 ma . Is there a way to rewrite this for the "fiblevel 6" is being touched ? not a close above. Thanks
input SMA_Length = 21;
def ma = simpleMovingAvg("length"= Sma_Length);
def triggerLow = open > ma and low <= ma;
def triggerHigh = open < ma and high >= ma;
def MasterTrigger = TriggerHigh and TriggerLow;
plot SmaTouch = triggerHigh or triggerLow;
 
B

BLT

Member
With following modification to the code in v15, you should be able to build your own scans:

#v1.5 - 01.20.2020 - BLT - After multiple requests for help with scans, chart bubbles can be displayed with the code source of the fib lines. Best way to view this is to set the input showfib_scan_names_bubbles to YES and input showfib_bubbles to NO. See the above examples for how to use these names in scans.

Code:
#SwingHL_Fibs_v15
#v1    - 01.19.2020 - BLT - Swing High/Low with options to show all swings or last swing, fib levels, number of swings to display fib levels, and chart bubbles identifying swings and fib levels. The fib bubbles can be moved left/right in the expansion by the number of bars at the input: bubble_mover
#v1.2  - 01.19.2020 - BLT - Made fib bubbles automatically reflect fib level inputs, which were hard coded in v1
#v1.3  - 01.20.2020 - BLT - Added more fib lines, adjusted fib levels based upon whether r2 is 100%, and extended fib lines into all of expansion
#v1.4  - 01.20.2020 - BLT - Added a scan capability for fib retracement levels. The plot: lastswing determines by being 1 or 0 the fib percentage levels as in the following Table

#Table to determine retracement fib levels for scan purposes
#lastswing ==   1 (100%)     0  (0%)  Upper Level of most recent swing
#fib1      ==   23.6%        76.4%
#fib2      ==   38.2%        61.8%
#fibm      ==   50.0%        50.0%
#fib3      ==   61.8%        38.2%
#fib4      ==   76.4%        23.6%

#Example Scan #1 requested where close > 61.8% and lastswing = 1 (100%) with this studies name saved as: SwingHL_Fibs_v14
  #In Scanner enter: close > SwingHL_Fibs_v14().fib3 and SwingHL_Fibs_v14().lastswing is equal to 1

#Example Scan #2 where close crosses above 61.8% within "x" bars and lastswing = 1 (100%) with this studies name saved as: SwingHL_Fibs_v14
  #In Scanner enter: close crosses above SwingHL_Fibs_v14().fib3 within 3 bars and SwingHL_Fibs_v14().lastswing is equal to 1
#v1.5  - 01.20.2020 - BLT - After multiple requests for help with scans, chart bubbles can be displayed with the code source of the fib lines. Best way to view this is to set the input showfib_scan_names_bubbles to YES and input showfib_bubbles to NO. See the above examples for how to use these names in scans.


input showlastswing = yes;
input swing_back1 = 5;
input swing_forward1 = 5;
input maxbars1 = 30;

def na = Double.NaN;
def bn = barnumber();
def sb1 = swing_back1;
def sf1 = swing_forward1;
def lfor1 = Lowest(low, sf1)[-sf1];
def lback1 = Lowest(low, sb1)[1];
def swinglow1 = if low < lfor1 and low < lback1 then 1 else 0;
def swinglowbar = if low < lfor1 and low < lback1 then bn else na;
def hfor1  = Highest(high, sf1)[-sf1];
def hback1 = Highest(high, sb1)[1];
def swinghigh1   = if high > hfor1 and high > hback1 then 1 else 0;
def swinghighbar = if high > hfor1 and high > hback1 then bn else na;
plot lastswing    = highestall(swinghighbar)>highestall(swinglowbar);

#Swings identifed as points
plot r2 = if showlastswing ==yes and bn==highestall(swinghighbar) then high else if showlastswing == no and swinghigh1 then high else na;
plot s2 = if showlastswing == yes and bn==highestall(swinglowbar) then low else if showlastswing == no and swinglow1 then low else na;

r2.SetStyle(Curve.POINTS);
r2.SetLineWeight(4);
r2.SetDefaultColor(Color.GREEN);
r2.HideBubble();
s2.SetStyle(Curve.POINTS);
s2.SetLineWeight(4);
s2.SetDefaultColor(Color.RED);
s2.HideBubble();

input bubbleoffsetfactor  = 3;
input showbubbles_r2s2    = yes;
AddChartBubble(showbubbles_r2s2 and r2, high + TickSize() * bubbleoffsetfactor, "R2", Color.GREEN, yes);
AddChartBubble(showbubbles_r2s2 and s2, low - TickSize() * bubbleoffsetfactor, "S2", Color.RED, no);

#Store Previous Data
def r2save = if !IsNaN(r2) then r2 else r2save[1];
def s2save = if !IsNaN(s2) then s2 else s2save[1];

#Fibonacci

input numberfibstoshow = 1;

#Retracement Fibonacci Levels
input fib1level           = .236;
input fib2level           = .382;
input fibMlevel           = .500;
input fib3level           = .618;
input fib4level           = .764;

#Extended Fibonacci Levels - These will create complementary extensions below zero as well as those inputs below which are over 1

input fib5extlevel        = 1.272;
input fib6extlevel        = 1.618;
input fib7extlevel        = 2.618;
input fib8extlevel        = 4.236;

#Fibonacci Lines
def fibh  = r2save;
def fibl  = s2save;
def range = if isnan(close) then range[1] else fibh - fibl;
def data  = CompoundValue(1, if (r2save == high) and range<0 or (s2save == low) and range>0 then data[1] + 1 else data[1], 0);
def datacount = if isnan(close) then datacount[1] else (HighestAll(data) - data[1]) + 1;

input showfiblines = yes;

plot fibHp = r2save;
plot fibLp = s2save;
def fibmext=if !isnan(fibl + range * fibMlevel) then fibmext[1] else fibl + range * fibMlevel;
plot fibM  = if showfiblines == no then na else if datacount <= numberfibstoshow then fibl + range * fibMlevel else na;
plot fib1  = if showfiblines == no then na else if datacount <= numberfibstoshow then fibl + range * fib1level else na;
plot fib2  = if showfiblines == no then na else if datacount <= numberfibstoshow then fibl + range * fib2level else na;
plot fib3  = if showfiblines == no then na else if datacount <= numberfibstoshow then fibl + range * fib3level else na;
plot fib4  = if showfiblines == no then na else if datacount <= numberfibstoshow then fibl + range * fib4level else na;

plot fib5  = if showfiblines == no then na else if datacount <= numberfibstoshow then fibl + range * fib5extlevel else na;
plot fib6  = if showfiblines == no then na else if datacount <= numberfibstoshow then fibl + range * fib6extlevel else na;
plot fib7  = if showfiblines == no then na else if datacount <= numberfibstoshow then fibl + range * fib7extlevel else na;
plot fib8  = if showfiblines == no then na else if datacount <= numberfibstoshow then fibl + range * fib8extlevel else na;

plot fib5a  = if showfiblines == no then na else if datacount <= numberfibstoshow then fibh + range * -fib5extlevel else na;
plot fib6a  = if showfiblines == no then na else if datacount <= numberfibstoshow then fibh + range * -fib6extlevel else na;
plot fib7a  = if showfiblines == no then na else if datacount <= numberfibstoshow then fibh + range * -fib7extlevel else na;
plot fib8a  = if showfiblines == no then na else if datacount <= numberfibstoshow then fibh + range * -fib8extlevel else na;

fibHp.SetPaintingStrategy(PaintingStrategy.DASHES);
fibLp.SetPaintingStrategy(PaintingStrategy.DASHES);
fibHp.SetLineWeight(2);
fibLp.SetLineWeight(2);
fibM.SetPaintingStrategy(PaintingStrategy.HORIZONTAL);
fib1.SetPaintingStrategy(PaintingStrategy.HORIZONTAL);
fib2.SetPaintingStrategy(PaintingStrategy.HORIZONTAL);
fib3.SetPaintingStrategy(PaintingStrategy.HORIZONTAL);
fib4.SetPaintingStrategy(PaintingStrategy.HORIZONTAL);
fib5.SetPaintingStrategy(PaintingStrategy.HORIZONTAL);
fib6.SetPaintingStrategy(PaintingStrategy.HORIZONTAL);
fib7.SetPaintingStrategy(PaintingStrategy.HORIZONTAL);
fib8.SetPaintingStrategy(PaintingStrategy.HORIZONTAL);
fib5a.SetPaintingStrategy(PaintingStrategy.HORIZONTAL);
fib6a.SetPaintingStrategy(PaintingStrategy.HORIZONTAL);
fib7a.SetPaintingStrategy(PaintingStrategy.HORIZONTAL);
fib8a.SetPaintingStrategy(PaintingStrategy.HORIZONTAL);
fibHp.SetDefaultColor(Color.GREEN);
fibLp.SetDefaultColor(Color.RED);
fibM.SetDefaultColor(Color.WHITE);
fib1.SetDefaultColor(Color.CYAN);
fib2.SetDefaultColor(Color.YELLOW);
fib3.SetDefaultColor(Color.YELLOW);
fib4.SetDefaultColor(Color.CYAN);
fib5.setdefaultColor(color.yellow);
fib6.setdefaultColor(color.yellow);
fib7.setdefaultColor(color.yellow);
fib8.setdefaultColor(color.yellow);
fib5a.setdefaultColor(color.yellow);
fib6a.setdefaultColor(color.yellow);
fib7a.setdefaultColor(color.yellow);
fib8a.setdefaultColor(color.yellow);

#To Hide Price Bubbles on Right Axis, remove the "#" sign on the following HideBubble() code
#fibM.HideBubble();
#fib1.HideBubble();
#fib2.HideBubble();
#fib3.HideBubble();
#fib4.HideBubble();
#fib5.HideBubble();
#fib6.HideBubble();
#fib7.HideBubble();
#fib8.HideBubble();
#fib5a.HideBubble();
#fib6a.HideBubble();
#fib7a.HideBubble();
#fib8a.HideBubble();

input showfib_bubbles = yes;
input bubble_mover    = 5; #Moves bubbles left/right then number of bars input here
def   n               = bubble_mover;
def   n1              = n +1;
AddChartBubble(showfib_bubbles and !IsNaN(close[n1]) and IsNaN(close[n]), fibh[n1],  "fibh", Color.green, yes);
AddChartBubble(showfib_bubbles and !IsNaN(close[n1]) and IsNaN(close[n]), fibl[n1],  aspercent(if !lastswing then 0 else 1), Color.red, yes);

#Fib Retracement Level Chart Bubbles
AddChartBubble(showfib_bubbles and !IsNaN(close[n1]) and IsNaN(close[n]), fib1[n1],  if !lastswing then aspercent(fib1level) else aspercent(1-fib1level), Color.cyan, yes);
AddChartBubble(showfib_bubbles and !IsNaN(close[n1]) and IsNaN(close[n]), fib2[n1],  if !lastswing then aspercent(fib2level) else aspercent(1-fib2level), Color.yellow, yes);
AddChartBubble(showfib_bubbles and !IsNaN(close[n1]) and IsNaN(close[n]), fib3[n1],  if !lastswing then aspercent(fib3level) else aspercent(1-fib3level), Color.yellow, yes);
AddChartBubble(showfib_bubbles and !IsNaN(close[n1]) and IsNaN(close[n]), fib4[n1],  if !lastswing then aspercent(fib4level) else aspercent(1-fib4level), Color.cyan, yes);
AddChartBubble(showfib_bubbles and !IsNaN(close[n1]) and IsNaN(close[n]), fibm[n1],  if !lastswing then aspercent(fibmlevel) else aspercent(1-fibmlevel), Color.white, yes);

#Fib Extension Levels Chart Bubbles
AddChartBubble(showfib_bubbles and !IsNaN(close[n1]) and IsNaN(close[n]), fib5[n1], if lastswing then aspercent(1-fib5extlevel) else aspercent(fib5extlevel) , Color.yellow, yes);
AddChartBubble(showfib_bubbles and !IsNaN(close[n1]) and IsNaN(close[n]), fib6[n1], if lastswing then  aspercent(1-fib6extlevel) else aspercent(fib6extlevel), Color.yellow, yes);
AddChartBubble(showfib_bubbles and !IsNaN(close[n1]) and IsNaN(close[n]), fib7[n1], if lastswing then aspercent(1-fib7extlevel) else aspercent(fib7extlevel), Color.yellow, yes);
AddChartBubble(showfib_bubbles and !IsNaN(close[n1]) and IsNaN(close[n]), fib8[n1], if lastswing then aspercent(1-fib8extlevel) else aspercent(fib8extlevel), Color.yellow, yes);

AddChartBubble(showfib_bubbles and !IsNaN(close[n1]) and IsNaN(close[n]), fib5a[n1], if lastswing then aspercent(fib5extlevel) else aspercent(1-fib5extlevel) , Color.yellow, yes);
AddChartBubble(showfib_bubbles and !IsNaN(close[n1]) and IsNaN(close[n]), fib6a[n1], if lastswing then aspercent(fib6extlevel) else aspercent(1-fib6extlevel), Color.yellow, yes);
AddChartBubble(showfib_bubbles and !IsNaN(close[n1]) and IsNaN(close[n]), fib7a[n1], if lastswing then aspercent(fib7extlevel) else aspercent(1-fib7extlevel), Color.yellow, yes);
AddChartBubble(showfib_bubbles and !IsNaN(close[n1]) and IsNaN(close[n]), fib8a[n1], if lastswing then aspercent(fib8extlevel) else aspercent(1-fib8extlevel), Color.yellow, yes);

#Fib Bubbles with code names of fib levels to assist in building scans

input showfib_scan_names_bubbles = yes;
AddChartBubble(showfib_scan_names_bubbles and !IsNaN(close[n1]) and IsNaN(close[n]), fibh[n1],  aspercent(if !lastswing then 1 else 0), Color.green, yes);
AddChartBubble(showfib_scan_names_bubbles and !IsNaN(close[n1]) and IsNaN(close[n]), fibl[n1],  "fibl", Color.red, yes);


#Fib Retracement Level Chart Bubbles
AddChartBubble(showfib_scan_names_bubbles and !IsNaN(close[n1]) and IsNaN(close[n]), fib1[n1], "fib1", Color.cyan, yes);
AddChartBubble(showfib_scan_names_bubbles and !IsNaN(close[n1]) and IsNaN(close[n]), fib2[n1],  "fib2", Color.yellow, yes);
AddChartBubble(showfib_scan_names_bubbles and !IsNaN(close[n1]) and IsNaN(close[n]), fib3[n1],  "fib3", Color.yellow, yes);
AddChartBubble(showfib_scan_names_bubbles and !IsNaN(close[n1]) and IsNaN(close[n]), fib4[n1],  "fib4", Color.cyan, yes);
AddChartBubble(showfib_scan_names_bubbles and !IsNaN(close[n1]) and IsNaN(close[n]), fibm[n1],  "fibm", Color.white, yes);

#Fib Extension Levels Chart Bubbles
AddChartBubble(showfib_scan_names_bubbles and !IsNaN(close[n1]) and IsNaN(close[n]), fib5[n1], "fib5" , Color.yellow, yes);
AddChartBubble(showfib_scan_names_bubbles and !IsNaN(close[n1]) and IsNaN(close[n]), fib6[n1], "fib6", Color.yellow, yes);
AddChartBubble(showfib_scan_names_bubbles and !IsNaN(close[n1]) and IsNaN(close[n]), fib7[n1], "fib7", Color.yellow, yes);
AddChartBubble(showfib_scan_names_bubbles and !IsNaN(close[n1]) and IsNaN(close[n]), fib8[n1], "fib8", Color.yellow, yes);

AddChartBubble(showfib_scan_names_bubbles and !IsNaN(close[n1]) and IsNaN(close[n]), fib5a[n1], "fib5a" , Color.yellow, yes);
AddChartBubble(showfib_scan_names_bubbles and !IsNaN(close[n1]) and IsNaN(close[n]), fib6a[n1], "fib6a", Color.yellow, yes);
AddChartBubble(showfib_scan_names_bubbles and !IsNaN(close[n1]) and IsNaN(close[n]), fib7a[n1], "fib7a", Color.yellow, yes);
AddChartBubble(showfib_scan_names_bubbles and !IsNaN(close[n1]) and IsNaN(close[n]), fib8a[n1], "fib8a", Color.yellow, yes);
 
Last edited by a moderator:
B

Buckbull

Member
@tomsk could you help me out with this one , What would I have to write in order to be alerted to a touch of the 161.8% not a close . Thanks
 
T

tomsk

Well-known member
VIP
@Buckbull This snippet you posted above is actually quite a good way of defining "touch" of a target. The preferred way for me of course is just a close above the target, but you're of course free to choose whatever mechanism floats your boat

@tomsk could you help me out with this one , What would I have to write in order to be alerted to a touch of the 161.8% not a close . Thanks
You'll find that the code that was developed by produced by @BLT is very flexible and extensible, he has built many hooks to help the majority of the different requests with this code.

My assumption is that you'd like to do a SCAN rather than be alerted on the study. Reading through his instructions in the header of the V1.5 study, it seems all you really need to do is to just reference the study. Using the logic you provided in your snippet above, it should be as simple as the following piece of scan code

Code:
def triggerLow  = open > SwingHL_Fibs_v15()."fib6" and low  <= SwingHL_Fibs_v15()."fib6";
def triggerHigh = open < SwingHL_Fibs_v15()."fib6" and high >= SwingHL_Fibs_v15()."fib6";
plot scan = triggerLow or triggerHigh;
However once this is placed in the scanner, the editor in the scanner prompted a message that the scan code is too complex. At this point, you have a couple of solutions - either rethink what your approach. Alternatively, you may transform this into a custom scan where you would no longer need to reference the study from the scanner but instead remove all code that is not relevant to the scanner. Once you have a simplified code structure would you then stand a chance of passing through the code complexity issue

Do provide as much info as you can so that someone can help you.

@BLT If you have a chance to read this post as well, it might be helpful to test the above scan and see if you notice anything different on your end.
 

Top