[Request] Convert Expected Move by VIX to Thinkscript

L

LoMeinMayne92

New member
Hi All,

I'm trying to convert code that I've been using in pinescript to thinkscript so that I can use this platform's tick charts. I know that TOS only provides VIX data and not VXN/VXD/VXO, that's fine, but if anyone can help me out here or at least help me get started that would be awesome! Here is the pinescript:

Code:
//@version=4
study("Expected Move by VIX v4", overlay=true)
//
timeinrange(res, sess) => time(res, sess) != 0
ticker = syminfo.ticker
src=input(title="Source", type=input.source, defval=hl2)
IV_src=input(title="IV Source", type=input.symbol, defval='CBOE:VIX')
default_to_vix9d = input(true, title="Default to VIX when IV is not available")
noPlotOutside = input(true, "Don't plot outside of hours")
optimalEntryTimes = input("1900-1200", "Best Hours", input.session)

resCustom1 = input(title = "secondary res", type = input.resolution, defval = "15")
resCustom2 = input(title = "tertiary res", type = input.resolution, defval = "30")
resCustom3 = input(title = "4th res", type = input.resolution, defval = "60")
resCustom4 = input(title = "5th res", type = input.resolution, defval = "120")
resCustom5 = input(title = "6th res", type = input.resolution, defval = "240")
resCustom6 = input(title = "7th res", type = input.resolution, defval = "1D")
resCustom7 = input(title = "8th res", type = input.resolution, defval = "1W")
resCustom8 = input(title = "9th res", type = input.resolution, defval = "1M")
resCustom9 = input(title = "10th res", type = input.resolution, defval = "1")

doNYOpen = input(defval=false, type = input.bool, title="NY Open On")
doNYSession = input(defval=false, type = input.bool, title="NY Session On")
doNYClose = input(defval=false, type = input.bool, title="NY Close On")

doAussieOpen = input(defval=false, type = input.bool, title="Aussie Open On")
doAussieSession = input(defval=false, type = input.bool, title="Aussie Session On")
doAussieClose = input(defval=false, type = input.bool, title="Aussie Close On")

doAsiaOpen = input(defval=false, type = input.bool, title="Asia Open On")
doAsiaSession = input(defval=false, type = input.bool, title="Asia Session On")
doAsiaClose = input(defval=false, type = input.bool, title="Asia Close On")

doBerOpen = input(defval=false, type = input.bool, title="Berlin Open On")
doBerSession = input(defval=false, type = input.bool, title="Berlin Session On")
doBerClose = input(defval=false, type = input.bool, title="Berlin Close On")

doEurOpen = input(defval=false, type = input.bool, title="Euro Open On")
doEurSession = input(defval=false, type = input.bool, title="Euro Session On")
doEurClose = input(defval=false, type = input.bool, title="Euro Close On")

doOptimalEOpen = input(defval=false, type = input.bool, title="Optimal Entry Open On")
doOptimalESession = input(defval=false, type = input.bool, title="Optimal Entry Session On")
doOptimalEClose = input(defval=false, type = input.bool, title="Optimal Entry Close On")

vix(sym) =>
    security(tickerid("CBOE", sym, syminfo.session), timeframe.period, src, true)

d2exp = 30
IV = ticker == "AAPL"? vix("VXAPL"): na
IV := ticker == "AMZN"? vix("VXAZN"): IV
IV := ticker == "IBM"? vix("VXIBM"): IV
IV := ticker == "GOOG"? vix("VXGOG"): IV
IV := ticker == "GS"? vix("VXGS"): IV

vix_security = security(IV_src, timeframe.period, src)
if ticker == "SPY" or (na(IV) and default_to_vix9d)
    IV := vix_security // vix("VIX")

vix_security1 = security(IV_src, resCustom1, src)
if ticker == "SPY" or (na(IV) and default_to_vix9d)
    IV := vix_security1 // vix("VIX")
   
vix_security2 = security(IV_src, resCustom2, src)
if ticker == "SPY" or (na(IV) and default_to_vix9d)
    IV := vix_security2 // vix("VIX")
   
vix_security3 = security(IV_src, resCustom3, src)
if ticker == "SPY" or (na(IV) and default_to_vix9d)
    IV := vix_security3 // vix("VIX")
   
vix_security4 = security(IV_src, resCustom4, src)
if ticker == "SPY" or (na(IV) and default_to_vix9d)
    IV := vix_security4 // vix("VIX")
   
vix_security5 = security(IV_src, resCustom5, src)
if ticker == "SPY" or (na(IV) and default_to_vix9d)
    IV := vix_security5 // vix("VIX")
   
vix_security6 = security(IV_src, resCustom6, src)
if ticker == "SPY" or (na(IV) and default_to_vix9d)
    IV := vix_security6 // vix("VIX")
   
vix_security7 = security(IV_src, resCustom7, src)
if ticker == "SPY" or (na(IV) and default_to_vix9d)
    IV := vix_security7 // vix("VIX")

vix_security8 = security(IV_src, resCustom8, src)
if ticker == "SPY" or (na(IV) and default_to_vix9d)
    IV := vix_security8 // vix("VIX")
   
vix_security9 = security(IV_src, resCustom9, src)
if ticker == "SPY" or (na(IV) and default_to_vix9d)
    IV := vix_security9 // vix("VIX")


// Standard deviation (expected 1 SD move) calculation from VIX (equivalent to 30 days Implied Volatility)
// Example: https://money.stackexchange.com/questions/81494/how-to-calculate-the-expected-move-of-a-stock
sd = (src * (IV / 100.0) * sqrt(d2exp/365.0)) / d2exp
sd1 = (src * (vix_security1 / 100) * sqrt(d2exp/365.0))/ d2exp
sd2 = (src * (vix_security2 / 100) * sqrt(d2exp/365.0))/ d2exp
sd3 = (src * (vix_security3 / 100) * sqrt(d2exp/365.0))/ d2exp
sd4 = (src * (vix_security4 / 100) * sqrt(d2exp/365.0))/ d2exp
sd5 = (src * (vix_security5 / 100) * sqrt(d2exp/365.0))/ d2exp
sd6 = (src * (vix_security6 / 100) * sqrt(d2exp/365.0))/ d2exp
sd7 = (src * (vix_security7 / 100) * sqrt(d2exp/365.0))/ d2exp
sd8 = (src * (vix_security8 / 100) * sqrt(d2exp/365.0))/ d2exp
sd9 = (src * (vix_security9 / 100) * sqrt(d2exp/365.0))/ d2exp

// UI code starts here --

// Dynamically shows the lines if price gets close to reduce the clutters

show_if_close_by_percentage = 99
keep_showing_once_shown = 25

is_near(l, lb) => abs(l[lb]-src[lb]) < (show_if_close_by_percentage/100.0)*sd

is_near_since_back(l, far) =>
    is_n = false
    for i = 0 to far
        is_n := is_n or is_near(l, i)
    is_n
   
show(l) => is_near_since_back(l, keep_showing_once_shown)? l: na



// Style & Colors

_style=plot.style_linebr

_up_color = #F86161 // red
_down_color = #B7FFBF // green

_up_color2 = #75C2E1
_down_color2 = #75C2E1

_up_color3 = #E1E100
_down_color3 = #E1E100

_up_color4 = #ADE199
_down_color4 = #ADE199

_up_color5 = #E16E74
_down_color5 = #E16E74

_up_color6 = #DFDFE1
_down_color6 = #DFDFE1

_up_color7 = #E10400
_down_color7 = #08E100

_up_color8 = #E10400
_down_color8 = #08E100

_up_color9 = #E10400
_down_color9 = #08E100

_up_color10 = #E10400
_down_color10 = #08E100

nySessionStart = #FFFDF2
nySession = #FFFDF2
nySessionEnd = #FFFDF2
australiaSessionStart = #A9A9A9
australiaSession = #A9A9A9
australiaSessionEnd = #A9A9A9
asiaSessionStart = #DAA520
asiaSession = #DAA520
asiaSessionEnd = #DAA520
berlinSessionStart = #C414FF
berlinSession = #C414FF
berlinSessionEnd = #C414FF
europeSessionStart = #1E90FF
europeSession = #1E90FF
europeSessionEnd = #1E90FF
OptimalESessionStart = #00FF22
OptimalESession = #00FF22
OptimalESessionEnd = #00FF22

start_transp = 99
start_transp_line = 20
transp_delta = 5

vwapc = color.new(color.white, start_transp_line - 3 * transp_delta)

uc1 = color.new(_up_color, start_transp_line)
uc2 = color.new(_up_color, start_transp_line - 1 * transp_delta)
uc3 = color.new(_up_color, start_transp_line - 2 * transp_delta)
uc3_2 = color.new(_up_color2, start_transp_line - 2 * transp_delta)
uc3_3 = color.new(_up_color3, start_transp_line - 2 * transp_delta)
uc3_4 = color.new(_up_color4, start_transp_line - 2 * transp_delta)
uc3_5 = color.new(_up_color5, start_transp_line - 2 * transp_delta)
uc3_6 = color.new(_up_color6, start_transp_line - 2 * transp_delta)
uc3_7 = color.new(_up_color7, start_transp_line - 2 * transp_delta)
uc3_8 = color.new(_up_color8, start_transp_line - 2 * transp_delta)
uc3_9 = color.new(_up_color9, start_transp_line - 2 * transp_delta)
uc3_10 = color.new(_up_color10, start_transp_line - 2 * transp_delta)

dc1 = color.new(_down_color, start_transp_line)
dc2 = color.new(_down_color, start_transp_line - 1 * transp_delta)
dc3 = color.new(_down_color, start_transp_line - 2 * transp_delta)
dc3_2 = color.new(_down_color2, start_transp_line - 2 * transp_delta)
dc3_3 = color.new(_down_color3, start_transp_line - 2 * transp_delta)
dc3_4 = color.new(_down_color4, start_transp_line - 2 * transp_delta)
dc3_5 = color.new(_down_color5, start_transp_line - 2 * transp_delta)
dc3_6 = color.new(_down_color6, start_transp_line - 2 * transp_delta)
dc3_7 = color.new(_down_color7, start_transp_line - 2 * transp_delta)
dc3_8 = color.new(_down_color8, start_transp_line - 2 * transp_delta)
dc3_9 = color.new(_down_color9, start_transp_line - 2 * transp_delta)
dc3_10 = color.new(_down_color10, start_transp_line - 2 * transp_delta)

ufc1 = color.new(_up_color, start_transp)
ufc2 = color.new(_up_color, start_transp - 1 * transp_delta)
ufc3 = color.new(_up_color, start_transp - 2 * transp_delta)

dfc1 = color.new(_down_color, start_transp)
dfc2 = color.new(_down_color, start_transp - 1 * transp_delta)
dfc3 = color.new(_down_color, start_transp - 2 * transp_delta)

bgcolor(doNYOpen and timeinrange(timeframe.period, "0930-0940") ? nySessionStart : na, transp=10)
bgcolor(doNYSession and timeinrange(timeframe.period, "0930-1700") ? nySession : na, transp=75)
bgcolor(doNYClose and timeinrange(timeframe.period, "1650-1700") ? nySessionEnd : na, transp=20)

bgcolor(doAussieOpen and timeinrange(timeframe.period, "1700-1710") ? australiaSessionStart : na, transp=10)
bgcolor(doAussieSession and timeinrange(timeframe.period, "1700-0200") ? australiaSession : na, transp=75)
bgcolor(doAussieClose and timeinrange(timeframe.period, "0150-0200") ? australiaSessionEnd : na, transp=20)

bgcolor(doAsiaOpen and timeinrange(timeframe.period, "1900-1910") ? asiaSessionStart : na, transp=10)
bgcolor(doAsiaSession and timeinrange(timeframe.period, "1900-0400") ? asiaSession : na, transp=75)
bgcolor(doAsiaClose and timeinrange(timeframe.period, "0350-0400") ? asiaSessionEnd : na, transp=20)

bgcolor(doBerOpen and timeinrange(timeframe.period, "0200-0210") ? europeSessionStart : na, transp=10)
bgcolor(doBerSession and timeinrange(timeframe.period, "0200-1200") ? europeSession : na, transp=75)
bgcolor(doBerClose and timeinrange(timeframe.period, "1150-1200") ? europeSessionEnd : na, transp=20)

bgcolor(doEurOpen and timeinrange(timeframe.period, "0300-0310") ? europeSessionStart : na, transp=10)
bgcolor(doEurSession and timeinrange(timeframe.period, "0300-1200") ? europeSession : na, transp=75)
bgcolor(doEurClose and timeinrange(timeframe.period, "1150-1200") ? europeSessionEnd : na, transp=20)

bgcolor(doOptimalEOpen and timeinrange(timeframe.period, "1900-1910") ? OptimalESessionStart : na, transp=10)
bgcolor(doOptimalESession and timeinrange(timeframe.period, "1900-1200") ? OptimalESession : na, transp=75)
bgcolor(doOptimalEClose and timeinrange(timeframe.period, "1150-1200") ? OptimalESessionEnd : na, transp=20)

// Plots


day_start = time - time[1] > 25000000

vw1 = vwap(src)
vw = day_start? na: vw1


v = plot(vw, title="VWAP", color=vwapc, style=_style, transp = 50)

s1 = plot(show(vw + sd), title="+1 Std Dev", color=uc1, style=_style, transp = 50, display=display.none)
s_1 = plot(show(vw - sd), title="-1 Std Dev", color=dc1, style=_style, transp = 50, display=display.none)

s2 = plot(show(vw + 2*sd), title="+2 Std Dev", color=uc2, style=_style, transp = 50, display=display.none)
s_2 = plot(show(vw - 2*sd), title="-2 Std Dev", color=dc2, style=_style, transp = 50, display=display.none)

s3 = plot(show(vw + 3*sd), title="+3 Std Dev", color=uc3, style=_style, transp = 50)
s_3 = plot(show(vw - 3*sd), title="-3 Std Dev", color=dc3, style=_style, transp = 50)

ss3 = plot(show(vw + 3*sd1), title="resCust1 +3 Std Dev", color=uc3_2, style=_style, transp=50)
ss_3 = plot(show(vw - 3*sd1), title="resCust1 -3 Std Dev", color=dc3_2, style=_style, transp = 50)

sss3 = plot(show(vw + 3*sd2), title="resCust2 +3 Std Dev", color=uc3_3, style=_style, transp=50)
sss_3 = plot(show(vw - 3*sd2), title="resCust2 -3 Std Dev", color=dc3_3, style=_style, transp = 50)

ssss3 = plot(show(vw + 3*sd3), title="resCust3 +3 Std Dev", color=uc3_4, style=_style, transp=50)
ssss_3 = plot(show(vw - 3*sd3), title="resCust3 -3 Std Dev", color=dc3_4, style=_style, transp = 50)

sssss3 = plot(show(vw + 3*sd4), title="resCust4 +3 Std Dev", color=uc3_5, style=_style, transp=50)
sssss_3 = plot(show(vw - 3*sd4), title="resCust4 -3 Std Dev", color=dc3_5, style=_style, transp = 50)

ssssss3 = plot(show(vw + 3*sd5), title="resCust5 +3 Std Dev", color=uc3_6, style=_style, transp=50)
ssssss_3 = plot(show(vw - 3*sd5), title="resCust5 -3 Std Dev", color=dc3_6, style=_style, transp = 50)

sssssss3 = plot(show(vw + 3*sd6), title="resCust6 +3 Std Dev", color=uc3_7, linewidth=2, style=_style, transp=50)
sssssss_3 = plot(show(vw - 3*sd6), title="resCust6 -3 Std Dev", color=dc3_7, linewidth=2, style=_style, transp = 50)

ssssssss3 = plot(show(vw + 3*sd7), title="resCust7 +3 Std Dev", color=uc3_8, linewidth=3, style=_style, transp=50)
ssssssss_3 = plot(show(vw - 3*sd7), title="resCust7 -3 Std Dev", color=dc3_8, linewidth=3, style=_style, transp = 50)

sssssssss3 = plot(show(vw + 3*sd8), title="resCust8 +3 Std Dev", color=uc3_9, linewidth=4, style=_style, transp=50)
sssssssss_3 = plot(show(vw - 3*sd8), title="resCust8 -3 Std Dev", color=dc3_9, linewidth=4, style=_style, transp = 50)

ssssssssss3 = plot(show(vw + 3*sd9), title="resCust9 +3 Std Dev", color=uc3_10, linewidth=1, style=_style, transp=50)
ssssssssss_3 = plot(show(vw - 3*sd9), title="resCust9 -3 Std Dev", color=dc3_10, linewidth=1, style=_style, transp = 50)


optimalTime = time(timeframe.period, optimalEntryTimes)

n1 = low < vw-3*sd
n_1 = high > vw+3*sd
n2 = low < vw-3*sd1
n_2 = high > vw+3*sd1
n3 = low < vw-3*sd2
n_3 = high > vw+3*sd2
n4 = low < vw-3*sd3
n_4 = high > vw+3*sd3
n5 = low < vw-3*sd4
n_5 = high > vw+3*sd4
n6 = low < vw-3*sd5
n_6 = high > vw+3*sd5

if (high > vw+3*sd5)
    var label1 = label.new(bar_index, high, text="Price breached +3std on: \n"  + resCustom1 + ", " + resCustom2 + ", " + resCustom3 + ", " + resCustom4 + ", " + resCustom5 + ", " + resCustom9, yloc=yloc.abovebar, style=label.style_label_down)
    label.set_x(label1, 0)
    label.set_xloc(label1, time, xloc.bar_time)
    label.set_color(label1, color.red)
    label.set_size(label1, size.normal)
   
if (low < vw-3*sd5)
    var label1 = label.new(bar_index, low, text="Price breached -3std on: \n"  + resCustom1 + ", " + resCustom2 + ", " + resCustom3 + ", " + resCustom4 + ", " + resCustom5 + ", " + resCustom9, yloc=yloc.belowbar, style=label.style_label_up)
    label.set_x(label1, 0)
    label.set_xloc(label1, time, xloc.bar_time)
    label.set_color(label1, color.lime)
    label.set_size(label1, size.normal)


plotshape(n1 and optimalTime and noPlotOutside, "n1 current res", style = shape.arrowup, color = #FF00FF, location = location.belowbar)
plotshape(n_1 and optimalTime and noPlotOutside, "n_1 current res", style = shape.arrowdown, color = #FF00FF, location = location.abovebar)
plotshape(n2 and optimalTime and noPlotOutside, "n2 rescust1", style = shape.arrowup, color = #75C2E1, location = location.belowbar)
plotshape(n_2 and optimalTime and noPlotOutside, "n_2 rescust1", style = shape.arrowdown, color = #75C2E1, location = location.abovebar)
plotshape(n3 and optimalTime and noPlotOutside, "n3 rescust2", style = shape.arrowup, color = #E1E100, location = location.belowbar)
plotshape(n_3 and optimalTime and noPlotOutside, "n_3 rescust2", style = shape.arrowdown, color = #E1E100, location = location.abovebar)
plotshape(n4 and optimalTime and noPlotOutside, "n4 rescust3", style = shape.arrowup, color = #ADE199, location = location.belowbar)
plotshape(n_4 and optimalTime and noPlotOutside, "n_4 rescust3", style = shape.arrowdown, color = #ADE199, location = location.abovebar)
plotshape(n5 and optimalTime and noPlotOutside, "n5 rescust4", style = shape.arrowup, color = #E16E74, location = location.belowbar)
plotshape(n_5 and optimalTime and noPlotOutside, "n_5 rescust4", style = shape.arrowdown, color = #E16E74, location = location.abovebar)
plotshape(n6 and optimalTime and noPlotOutside, "n6 rescust5", style = shape.arrowup, color = #DFDFE1, location = location.belowbar)
plotshape(n_6 and optimalTime and noPlotOutside, "n_6 rescust5", style = shape.arrowdown, color = #DFDFE1, location = location.abovebar)

alertcondition(n1 and optimalTime and noPlotOutside, title='Long Entry', message='-3std crossing down at {{timenow}} at price {{low}}')
alertcondition(n_1 and optimalTime and noPlotOutside, title='Short Entry', message='+3std crossing up at {{timenow}} at price {{high}}')
 
Last edited by a moderator:
A

adii800

Member
I am not familiar with Pine Script at all but am proficient in ThinkScript. Could you explain this Strategy/Indicator a bit, and perhaps a link would be nice too. Thanks!
 
L

LoMeinMayne92

New member
The indicator bases standard deviations and vwap based on volatility (default is VIX) though I've used other volatility products depending on the instrument that I'm trading. What I do with this indicator is wait for price to cross +/-3stds on the 6h timeframe. Currently, the indicator does not calculate when the timeframe is higher than 6h. Once I get an alert for price to cross 3std I will see if price action is favorable on 1min timeframe to enter a trade. I have other timeframes on this indicator as well. I will try to wait until price crosses the highest or lowest standard deviation on the 1min.

Below is an example of the 6h to 1min trade

6h trades: https://www.tradingview.com/x/duQNUYRT/

on the 1min: https://www.tradingview.com/x/NGoPtqUL/

Sorry for getting back so late!
 

Similar threads

Top