Put/call ratio label or chart for ThinkorSwim

C

cherif

New member
Hi to all. Is there any way to create a label or an indicator that tracks pull/call ratio for any specific stock. I know that $PCALL can be shown on the chart. Thank you
 
D

drdarshil16

New member
VIP
Code:
declare lower;



    def series = 1;



    def CurrentYear = GetYear();



    def CurrentMonth = GetMonth();



    def CurrentDOM = GetDayOfMonth(GetYYYYMMDD());



    def Day1DOW1 = GetDayOfWeek(CurrentYear * 10000 + CurrentMonth * 100 + 1);



    def FirstFridayDOM1 = if Day1DOW1 < 6



                          then 6 - Day1DOW1



                          else if Day1DOW1 == 6



                          then 7



                          else 6;



    def RollDOM = FirstFridayDOM1 + 14;



    def ExpMonth1 = if RollDOM > CurrentDOM



                    then CurrentMonth + series - 1



                    else CurrentMonth + series;



    def ExpMonth2 = if ExpMonth1 > 12



                    then ExpMonth1 - 12



                    else ExpMonth1;



    def ExpYear = if ExpMonth1 > 12



                  then CurrentYear + 1



                  else CurrentYear;



    def Day1DOW = GetDayOfWeek(ExpYear * 10000 + ExpMonth2 * 100 + 1);



    def FirstFridayDOM = if Day1DOW < 6



                         then 6 - Day1DOW



                         else if Day1DOW == 6



                         then 7



                         else 6;



    def ExpDOM = FirstFridayDOM + 14;



    def date = ExpYear * 10000 + ExpMonth2 * 100 + ExpDOM + 1;



    def PutVolume_SPY = if isNaN(volume(symbol = GetATMOption("SPY", date, OptionClass.PUT)))



                        then PutVolume_SPY[1]



                        else volume(symbol = GetATMOption("SPY", date, OptionClass.PUT));



    def PutVolume_QQQ = if isNaN(volume(symbol = GetATMOption("QQQ", date, OptionClass.PUT)))



                        then PutVolume_QQQ[1]



                        else volume(symbol = GetATMOption("QQQ", date, OptionClass.PUT));



    def PutVolume_DIA = if isNaN(volume(symbol = GetATMOption("DIA", date, OptionClass.PUT)))



                        then PutVolume_DIA[1]



                        else volume(symbol = GetATMOption("DIA", date, OptionClass.PUT));;



    def CallVolume_SPY = if isNaN(volume(symbol = GetATMOption("SPY", date, OptionClass.CALL)))



                         then CallVolume_SPY[1]



                         else volume(symbol = GetATMOption("SPY", date, OptionClass.CALL));



    def CallVolume_QQQ = if isNaN(volume(symbol = GetATMOption("QQQ", date, OptionClass.CALL)))



                         then CallVolume_QQQ[1]



                         else volume(symbol = GetATMOption("QQQ", date, OptionClass.CALL));



    def CallVolume_DIA = if isNaN(volume(symbol = GetATMOption("DIA", date, OptionClass.CALL)))



                         then CallVolume_DIA[1]



                         else volume(symbol = GetATMOption("DIA", date, OptionClass.CALL));



    def PutTotal = PutVolume_SPY + PutVolume_QQQ + PutVolume_DIA;



    def CallTotal = CallVolume_SPY + CallVolume_QQQ + CallVolume_DIA;



AddLabel(yes,(concat("Ex date: ",



              concat(ExpMonth2,



              concat("/",



              concat(ExpDOM,



              concat("/",



              concat(AsPrice(ExpYear),""))))))), color.white);



   def Strike_SPY = Round(close(symbol = "SPY") / .5, 0) * .5;



   def Strike_QQQ = Round(close(symbol = "QQQ") / .5, 0) * .5;



   def Strike_DIA = Round(close(symbol = "DIA") / .5, 0) * .5;



AddLabel(1, "Strikes SPY: $" + Strike_SPY + " QQQ: $" + Strike_QQQ + " DIA: $" + Strike_DIA, Color.White);



AddLabel(yes, Concat("ATM Put/Call Ratio ", Round(PutTotal / CallTotal, 2)) + " / 1", Color.White);



   def PV = if IsNaN(PutTotal)



            then PV[1]



            else PutTotal;



   def CV = if IsNaN(CallTotal)



            then CV[1]



            else CallTotal;



plot ChangeRatio = if isNaN(close) then Double.NaN else PV / CV;



     ChangeRatio.AssignValueColor(if ChangeRatio > 1



                 then color.green



                 else color.red);



plot AvgCR = if isNaN(close) then Double.NaN else Average(ChangeRatio, 5);



     AvgCR.SetDefaultColor(Color.Yellow);



plot Neutral = if isNaN(close) then Double.NaN else 1;



     Neutral.SetDefaultColor(Color.Gray);
 
Last edited by a moderator:
D

drdarshil16

New member
VIP
This one is for DIA, SPY QQQ etc, although if it can be modified to have input of particular stock..

AMZN specific:

Code:
declare lower;

    def series = 1;



    def CurrentYear = GetYear();



    def CurrentMonth = GetMonth();



    def CurrentDOM = GetDayOfMonth(GetYYYYMMDD());



    def Day1DOW1 = GetDayOfWeek(CurrentYear * 10000 + CurrentMonth * 100 + 1);



    def FirstFridayDOM1 = if Day1DOW1 < 6



                          then 6 - Day1DOW1



                          else if Day1DOW1 == 6



                          then 7



                          else 6;



    def RollDOM = FirstFridayDOM1 + 14;



    def ExpMonth1 = if RollDOM > CurrentDOM



                    then CurrentMonth + series - 1



                    else CurrentMonth + series;



    def ExpMonth2 = if ExpMonth1 > 12



                    then ExpMonth1 - 12



                    else ExpMonth1;



    def ExpYear = if ExpMonth1 > 12



                  then CurrentYear + 1



                  else CurrentYear;



    def Day1DOW = GetDayOfWeek(ExpYear * 10000 + ExpMonth2 * 100 + 1);



    def FirstFridayDOM = if Day1DOW < 6



                         then 6 - Day1DOW



                         else if Day1DOW == 6



                         then 7



                         else 6;



    def ExpDOM = FirstFridayDOM + 14;



    def date = ExpYear * 10000 + ExpMonth2 * 100 + ExpDOM + 1;



    def PutVolume_AMZN = if isNaN(volume(symbol = GetATMOption("AMZN", date, OptionClass.PUT)))



                        then PutVolume_AMZN[1]



                        else volume(symbol = GetATMOption("AMZN", date, OptionClass.PUT));





    def CallVolume_AMZN = if isNaN(volume(symbol = GetATMOption("AMZN", date, OptionClass.CALL)))



                         then CallVolume_AMZN[1]



                         else volume(symbol = GetATMOption("AMZN", date, OptionClass.CALL));





    def PutTotal = PutVolume_AMZN;



    def CallTotal = CallVolume_AMZN;



AddLabel(yes,(concat("Ex date: ",



              concat(ExpMonth2,



              concat("/",



              concat(ExpDOM,



              concat("/",



              concat(AsPrice(ExpYear),""))))))), color.white);



   def Strike_AMZN = Round(close(symbol = "AMZN") / .5, 0) * .5;



AddLabel(1, "Strikes AMZN: $" + Strike_AMZN, Color.White);



AddLabel(yes, Concat("ATM Put/Call Ratio ", Round(PutTotal / CallTotal, 2)) + " / 1", Color.White);



   def PV = if IsNaN(PutTotal)



            then PV[1]



            else PutTotal;



   def CV = if IsNaN(CallTotal)



            then CV[1]



            else CallTotal;







plot ChangeRatio = if isNaN(close) then Double.NaN else PV / CV;



     ChangeRatio.AssignValueColor(if ChangeRatio > 1



                 then color.green



                 else color.red);



plot AvgCR = if isNaN(close) then Double.NaN else Average(ChangeRatio, 5);



     AvgCR.SetDefaultColor(Color.Yellow);



plot Neutral = if isNaN(close) then Double.NaN else 1;



     Neutral.SetDefaultColor(Color.Gray);
 
Last edited by a moderator:
2

2sureshk

Member
How to use PUT CALL ratio? What can be determined ? Will it give any additional indication to buy or sell call/put

Thx
Suresh
 
Y

YungTraderFromMontana

Member
How to use PUT CALL ratio? What can be determined ? Will it give any additional indication to buy or sell call/put

Thx
Suresh
It can be used to get a general idea around where the market thinks a stock is headed, P/C ratio of 4 and plenty of people are betting on a stock going down. P/C ration of .05 and the market is very confident in that stock. It is also important to consider the option chain when making a predictions. Are most of these puts or calls being bought for a strike in the near term or farther out? This gives you an idea of the time frame of the expected move. But be warned it can be effective but is not the holy grail, these assumptions fail to account for things like hedging.
 
markos

markos

Well-known member
VIP
Warehouse
It can be used to get a general idea around where the market thinks a stock is headed, P/C ratio of 4 and plenty of people are betting on a stock going down. P/C ratio of .05 and the market is very confident in that stock. It is also important to consider the option chain when making a predictions. Are most of these puts or calls being bought for a strike in the near term or farther out? This gives you an idea of the time frame of the expected move. But be warned it can be effective but is not the holy grail, these assumptions fail to account for things like hedging.
@YungTraderFromMontana , That was a very good answer. Feel encouraged to keep answering where you feel appropriate. The more voices we have, the better the comunity! Don't think your answer may be wrong, if you're out of line or the answer is debatable, that's good. That way we all learn what we think we know. Markos
 
Last edited:
2

2sureshk

Member
Thank you , I am performing the validation and I have observed the same 7/1 ratio forAMZN 9-20-2019 7 am pst. Then amzn dropped 15 $ . Appreciate the input. Is it possible to show the current weekly on chart rather than 3 weeks away . If you point out the code line I will try to adjust
 
Last edited by a moderator:
MBF

MBF

Active member
VIP
Warehouse
Can I just place ROKU instead of SPY into this?
 
markos

markos

Well-known member
VIP
Warehouse
Can I just place ROKU instead of SPY into this?
Hey you! You've been out a bit lately. That's ok, just teasing. (Actually I say a lot of silly stuff 🤪 )
Take the code in post #4 and change all of the instances of "AMZN" to "ROKU", copy paste. That should be all.
 
S

STEVEHIBY

New member
how can I use this code for any symbol of my choice in time
 
T

tomsk

Active member
Folks, given the recent interest in this thread, rather than hardcode symbols into the study, I have modified the study to take an input ticker, e.g. AAPL, or FB, or GS, etc and it will display the info requested. All you got to do is to change the symbol of your preference in the UI. Hence from symbol to symbol, not much work is required other than changing the value of the input symbol in the user interface. Hope this helps

Code:
# Put/Call
# 11.9.2019

declare lower;
    input symbol = "AMZN";
    def series = 1;
    def CurrentYear = GetYear();
    def CurrentMonth = GetMonth();
    def CurrentDOM = GetDayOfMonth(GetYYYYMMDD());
    def Day1DOW1 = GetDayOfWeek(CurrentYear * 10000 + CurrentMonth * 100 + 1);
    def FirstFridayDOM1 = if Day1DOW1 < 6
                          then 6 - Day1DOW1
                          else if Day1DOW1 == 6
                          then 7
                          else 6;
    def RollDOM = FirstFridayDOM1 + 14;
    def ExpMonth1 = if RollDOM > CurrentDOM
                    then CurrentMonth + series - 1
                    else CurrentMonth + series;
    def ExpMonth2 = if ExpMonth1 > 12
                    then ExpMonth1 - 12
                    else ExpMonth1;
    def ExpYear = if ExpMonth1 > 12
                  then CurrentYear + 1
                  else CurrentYear;
    def Day1DOW = GetDayOfWeek(ExpYear * 10000 + ExpMonth2 * 100 + 1);
    def FirstFridayDOM = if Day1DOW < 6
                         then 6 - Day1DOW
                         else if Day1DOW == 6
                         then 7
                         else 6;
    def ExpDOM = FirstFridayDOM + 14;
    def date = ExpYear * 10000 + ExpMonth2 * 100 + ExpDOM + 1;
    def PutVolume = if isNaN(volume(symbol = GetATMOption(symbol, date, OptionClass.PUT)))
                    then PutVolume[1]
                    else volume(symbol = GetATMOption(symbol, date, OptionClass.PUT));
    def CallVolume = if isNaN(volume(symbol = GetATMOption(symbol, date, OptionClass.CALL)))
                     then CallVolume[1]
                     else volume(symbol = GetATMOption(symbol, date, OptionClass.CALL));
    def PutTotal = PutVolume;
    def CallTotal = CallVolume;
AddLabel(yes,(concat("Ex date: ",
              concat(ExpMonth2,
              concat("/",
              concat(ExpDOM,
              concat("/",
              concat(AsPrice(ExpYear),""))))))), color.white);
   def Strike = Round(close(symbol = symbol) / .5, 0) * .5;
AddLabel(1, "Strikes " + symbol + ": $" + Strike, Color.White);
AddLabel(yes, Concat("ATM Put/Call Ratio ", Round(PutTotal / CallTotal, 2)) + " / 1", Color.White);
   def PV = if IsNaN(PutTotal)
            then PV[1]
            else PutTotal;
   def CV = if IsNaN(CallTotal)
            then CV[1]
            else CallTotal;
plot ChangeRatio = if isNaN(close) then Double.NaN else PV / CV;
     ChangeRatio.AssignValueColor(if ChangeRatio > 1
                 then color.green
                 else color.red);
plot AvgCR = if isNaN(close) then Double.NaN else Average(ChangeRatio, 5);
     AvgCR.SetDefaultColor(Color.Yellow);
plot Neutral = if isNaN(close) then Double.NaN else 1;
     Neutral.SetDefaultColor(Color.Gray);
# End Study
 
Last edited:
P

Playstation

Member
Warehouse
@tomsk Could I trouble you to explain how to use this indicator? I don't know how to interpret the code.
Sometimes on the chart, I see a huge spike upwards, Changeratio at 300, and AvgCR is at 60. What does this mean?
 
T

tomsk

Active member
It can be used to get a general idea around where the market thinks a stock is headed, P/C ratio of 4 and plenty of people are betting on a stock going down. P/C ration of .05 and the market is very confident in that stock. It is also important to consider the option chain when making a predictions. Are most of these puts or calls being bought for a strike in the near term or farther out? This gives you an idea of the time frame of the expected move. But be warned it can be effective but is not the holy grail, these assumptions fail to account for things like hedging.
@Playstation Read this information captioned above from @YungTraderFromMontana - his response helps newcomers understand.
 
T

tomsk

Active member
@Playstation As an example, run that study on a daily chart of AMZN, the P/C Ratio is 7.05/1.
And on AAPL the P/C Ratio is 0.45/1. What are the odds? AMZN has bearish odds while AAPL has bullish odds
This of course does not mean you need to run off and buy/sell these stocks, but do monitor the P/C Ratio

Have fun!
 
P

Playstation

Member
Warehouse
@tomsk Thank you tom, I understood how PC ratio works, but didnt understand the script. Now I do :)
Have a wonderful saturday night!
 
S

San

Member
VIP
@tomsk, First I would like to thanks for your contribution on this form. I have couple of question.
1. in Post #11 "All you got to do is to change the symbol of your preference in the UI. "instead of , is it way to pick automatically from main chart. :unsure:
2. Call/Put ratio value shows based on ATM , am i correct.?
3.Call/Put ration value calculated based on Weekly or Monthly chain.? or this will change based on our chart time frame.
 

Top