I'm currently looking for Put-Call Ratio indicator for ThinkorSwim chart. I want to display the data to understand the current market condition.
Last edited:
Join useThinkScript to post your question to a community of 21,000+ developers and traders.
# Put Call Ratio
# Mobius
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);
def PutVolume_SPY = if isNaN(volume(symbol = GetATMOption("SPY", date, OptionClass.PUT)))
I have seen several lying around. Please type the word UNIVERSE in the search box and look in there.Really cool, thanks. Is there a way to update below line to dynamically select the current ticker symbol instead of the hard coded value of "SPY"?
def PutVolume_SPY = if isNaN(volume(symbol = GetATMOption("SPY", date, OptionClass.PUT)))
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);
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);
Hey you! You've been out a bit lately. That's ok, just teasing. (Actually I say a lot of silly stuff )Can I just place ROKU instead of SPY into this?
# 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
Thread starter | Similar threads | Forum | Replies | Date |
---|---|---|---|---|
HOT ZONE - RSI with IV Percentile: Buy Stock or Sell Put Options Signal For ThinkOrSwim | Indicators | 97 |
Start a new thread and receive assistance from our community.
useThinkScript is the #1 community of stock market investors using indicators and other tools to power their trading strategies. Traders of all skill levels use our forums to learn about scripting and indicators, help each other, and discover new ways to gain an edge in the markets.
We get it. Our forum can be intimidating, if not overwhelming. With thousands of topics, tens of thousands of posts, our community has created an incredibly deep knowledge base for stock traders. No one can ever exhaust every resource provided on our site.
If you are new, or just looking for guidance, here are some helpful links to get you started.