Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // © Julien_Eche
- //@version=4
- var maxDataLines = 500
- study("Omega Ratio Performance","Omega Ω", max_lines_count=maxDataLines, max_bars_back=5000)
- bgcolor(#000000c0)
- grp_1 = "Color Options"
- tickInfo = tickerid(syminfo.prefix, syminfo.ticker)
- lowRiskSecurity = input( "SPY", "Low-Risk Asset", input.symbol, tooltip ="A low risk asset used to generate Minimal Acceptable Return (MAR) levels for Omega calculations" , confirm=true)
- omegaTime = input( 252, "Omega Interval", input.integer, minval = 1)
- lineVolume = input( 50, "Increments", input.integer, tooltip ="Number of MARs the calculation is carried on", minval=1, maxval=maxDataLines, step=5)
- compareSym = input("QQQ", " Comparison Symbol", input.symbol, tooltip ="An asset for performance comparison")
- clr1 = input(color.rgb(0, 128, 128), "Primary Chart Asset", input.color, inline ="Primary Chart Asset", group = grp_1)
- clr2 = input(color.rgb(255, 0, 0), "Comparison Asset", input.color, inline ="Comparison Asset", group = grp_1)
- // Data retrieval for Low-Risk Security and Comparison Asset
- var limitMinusOne = lineVolume - 1
- var intervalMinusOne = omegaTime - 1
- var COMPARE_SYM = compareSym
- var LOW_RISK_ASSET = lowRiskSecurity
- var SYMBOL_REF_ID = syminfo.ticker
- var OTHER_REF_ID = COMPARE_SYM
- lrsAsset = security(LOW_RISK_ASSET, timeframe.period, close)
- compareSymData = security( COMPARE_SYM, timeframe.period, close)
- lastLowRiskAsset = nz(lrsAsset[1], lrsAsset)
- lowRiskAssetReturn = (lrsAsset - lastLowRiskAsset) / lastLowRiskAsset * 100.0
- marFactor = stdev(lowRiskAssetReturn, omegaTime) * 3.0 * sqrt(omegaTime/(omegaTime-1))
- sourceData1 = close
- sourceData2 = compareSymData
- ret1 = log(sourceData1 / nz(sourceData1 [1],sourceData1 )) * 100
- ret2 = log(sourceData2 / nz(sourceData2[1],sourceData2)) * 100
- // Omega Ratio calculation
- var aOmegaVal = array.new_float(lineVolume+1)
- var bOmegaVal = array.new_float(lineVolume+1)
- var aLineData = array.new_line (lineVolume )
- var bLineData = array.new_line (lineVolume )
- var MariData = array.new_float(lineVolume+1)
- var rvalLabel = array.new_label(lineVolume )
- var dataLinesAreNA = true
- OmegaCalc(array, returnData) =>
- if barstate.islast
- for i=0 to lineVolume
- Pos=0.0, Neg=0.0
- for j=0 to intervalMinusOne
- ex = returnData[j] - (marFactor[j] * i / lineVolume)
- Pos += ex > 0 ? ex : 0.0
- Neg -= ex < 0 ? ex : 0.0
- array.set(array, i, Pos / Neg)
- // Fill the MariData array with MAR values
- if barstate.islast
- for i=0 to lineVolume
- array.set(MariData, i, marFactor[i] * i / lineVolume)
- OmegaCalc(aOmegaVal,ret1)
- OmegaCalc(bOmegaVal,ret2)
- // Line and label rendering
- createLine(X1, Y1, X2, Y2 , LineStyle, Color, LineWidth) =>
- var line Line = na
- if barstate.islast
- if na(Line)
- Line := line.new(X1, Y1, X2, Y2, xloc.bar_index, style = LineStyle, color = Color, width = LineWidth)
- else
- line.set_xy1(Line,X1,Y1)
- line.set_xy2(Line,X2,Y2)
- Line
- createLabel(X, Y, T, labelstyle, TColor, labelsize) =>
- var label _label = na
- if barstate.islast
- if na(_label)
- _label := label.new(X, Y, T, color=color.new(color.black,99), textcolor=TColor, style=labelstyle, size = labelsize)
- else
- label.set_xy(_label, X, Y)
- _label
- // Rendering Omega lines and labels
- if barstate.islast
- if dataLinesAreNA
- for i=0 to limitMinusOne
- barIndexDataMinusI = bar_index - limitMinusOne + i
- array.set(aLineData, i, line.new(barIndexDataMinusI-1, array.get(aOmegaVal, i), barIndexDataMinusI, array.get(aOmegaVal, i+1), color=clr1, width=2))
- array.set(bLineData, i, line.new(barIndexDataMinusI-1, array.get(bOmegaVal, i), barIndexDataMinusI, array.get(bOmegaVal, i+1), color=clr2, width=2))
- for j=0 to limitMinusOne by 3
- barIndexDataMinusj = bar_index - limitMinusOne + j - 1
- array.set(rvalLabel, j, label.new(barIndexDataMinusj, -0.005, text="⃓\n" + tostring(round(array.get(MariData,j), 3)), color=#00000000, textcolor=color.rgb(228, 228, 228), style=label.style_label_center, size=size.small))
- dataLinesAreNA := false
- else
- for i=0 to limitMinusOne
- barIndexDataMinusI = bar_index - limitMinusOne + i
- lineID1 = array.get(aLineData, i)
- lineID2 = array.get(bLineData, i)
- line.set_xy1(lineID1, barIndexDataMinusI-1, array.get(aOmegaVal, i ))
- line.set_xy2(lineID1, barIndexDataMinusI , array.get(aOmegaVal, i+1))
- line.set_xy1(lineID2, barIndexDataMinusI-1, array.get(bOmegaVal, i ))
- line.set_xy2(lineID2, barIndexDataMinusI , array.get(bOmegaVal, i+1))
- for j=0 to limitMinusOne by 3
- label1 = array.get(rvalLabel, j)
- barIndexDataMinusj = bar_index - limitMinusOne + j - 1
- label.set_x(label1, barIndexDataMinusj)
- na
- maxhData = max(array.get(aOmegaVal,0), array.get(bOmegaVal,0))
- barIndexDataMinusLineVolume = bar_index - lineVolume
- createLine(barIndexDataMinusLineVolume, 0.0, bar_index , 0.0, line.style_arrow_right, color.rgb(230, 230, 230),1)
- createLine(barIndexDataMinusLineVolume, 0.0, barIndexDataMinusLineVolume, maxhData * 1.1, line.style_arrow_right, color.rgb(230, 230, 230), 1)
- createLabel(bar_index , 0, "return %" , label.style_label_left , color.rgb(230, 230, 230),size.large)
- createLabel(barIndexDataMinusLineVolume, maxhData * 1.1, "Ω" , label.style_label_down , color.rgb(230, 230, 230),size.large)
- createLabel(barIndexDataMinusLineVolume, array.get(aOmegaVal, 1), SYMBOL_REF_ID, label.style_label_up , clr1,size.normal)
- createLabel(barIndexDataMinusLineVolume, array.get(bOmegaVal, 1), OTHER_REF_ID , label.style_label_right, clr2,size.normal)
- hline(1.0, color=color.rgb(196, 196, 196), linestyle=hline.style_dotted)
- hline(-0.1, color=#00000000)
Advertisement
Add Comment
Please, Sign In to add comment