xmd79

Omega Ratio Performance

May 24th, 2023
273
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.19 KB | None | 0 0
  1. // © Julien_Eche
  2.  
  3. //@version=4
  4. var maxDataLines = 500
  5. study("Omega Ratio Performance","Omega Ω", max_lines_count=maxDataLines, max_bars_back=5000)
  6.  
  7. bgcolor(#000000c0)
  8. grp_1 = "Color Options"
  9. tickInfo = tickerid(syminfo.prefix, syminfo.ticker)
  10. 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)
  11. omegaTime = input( 252, "Omega Interval", input.integer, minval = 1)
  12. lineVolume = input( 50, "Increments", input.integer, tooltip ="Number of MARs the calculation is carried on", minval=1, maxval=maxDataLines, step=5)
  13. compareSym = input("QQQ", "  Comparison Symbol", input.symbol, tooltip ="An asset for performance comparison")
  14. clr1 = input(color.rgb(0, 128, 128), "Primary Chart Asset", input.color, inline ="Primary Chart Asset", group = grp_1)
  15. clr2 = input(color.rgb(255, 0, 0), "Comparison Asset", input.color, inline ="Comparison Asset", group = grp_1)
  16.  
  17. // Data retrieval for Low-Risk Security and Comparison Asset
  18. var limitMinusOne = lineVolume - 1
  19. var intervalMinusOne = omegaTime - 1
  20. var COMPARE_SYM = compareSym
  21. var LOW_RISK_ASSET = lowRiskSecurity
  22. var SYMBOL_REF_ID = syminfo.ticker
  23. var OTHER_REF_ID = COMPARE_SYM
  24.  
  25. lrsAsset = security(LOW_RISK_ASSET, timeframe.period, close)
  26. compareSymData = security( COMPARE_SYM, timeframe.period, close)
  27.  
  28. lastLowRiskAsset = nz(lrsAsset[1], lrsAsset)
  29. lowRiskAssetReturn = (lrsAsset - lastLowRiskAsset) / lastLowRiskAsset * 100.0
  30. marFactor = stdev(lowRiskAssetReturn, omegaTime) * 3.0 * sqrt(omegaTime/(omegaTime-1))
  31.  
  32. sourceData1 = close
  33. sourceData2 = compareSymData
  34. ret1 = log(sourceData1 / nz(sourceData1 [1],sourceData1 )) * 100
  35. ret2 = log(sourceData2 / nz(sourceData2[1],sourceData2)) * 100
  36.  
  37. // Omega Ratio calculation
  38. var aOmegaVal = array.new_float(lineVolume+1)
  39. var bOmegaVal = array.new_float(lineVolume+1)
  40. var aLineData = array.new_line (lineVolume )
  41. var bLineData = array.new_line (lineVolume )
  42. var MariData = array.new_float(lineVolume+1)
  43. var rvalLabel = array.new_label(lineVolume )
  44. var dataLinesAreNA = true
  45.  
  46.  
  47. OmegaCalc(array, returnData) =>
  48. if barstate.islast
  49. for i=0 to lineVolume
  50. Pos=0.0, Neg=0.0
  51. for j=0 to intervalMinusOne
  52. ex = returnData[j] - (marFactor[j] * i / lineVolume)
  53. Pos += ex > 0 ? ex : 0.0
  54. Neg -= ex < 0 ? ex : 0.0
  55. array.set(array, i, Pos / Neg)
  56.  
  57. // Fill the MariData array with MAR values
  58. if barstate.islast
  59. for i=0 to lineVolume
  60. array.set(MariData, i, marFactor[i] * i / lineVolume)
  61.  
  62.  
  63. OmegaCalc(aOmegaVal,ret1)
  64. OmegaCalc(bOmegaVal,ret2)
  65.  
  66. // Line and label rendering
  67. createLine(X1, Y1, X2, Y2 , LineStyle, Color, LineWidth) =>
  68. var line Line = na
  69. if barstate.islast
  70. if na(Line)
  71. Line := line.new(X1, Y1, X2, Y2, xloc.bar_index, style = LineStyle, color = Color, width = LineWidth)
  72. else
  73. line.set_xy1(Line,X1,Y1)
  74. line.set_xy2(Line,X2,Y2)
  75. Line
  76.  
  77. createLabel(X, Y, T, labelstyle, TColor, labelsize) =>
  78. var label _label = na
  79. if barstate.islast
  80. if na(_label)
  81. _label := label.new(X, Y, T, color=color.new(color.black,99), textcolor=TColor, style=labelstyle, size = labelsize)
  82. else
  83. label.set_xy(_label, X, Y)
  84. _label
  85.  
  86. // Rendering Omega lines and labels
  87. if barstate.islast
  88. if dataLinesAreNA
  89. for i=0 to limitMinusOne
  90. barIndexDataMinusI = bar_index - limitMinusOne + i
  91. array.set(aLineData, i, line.new(barIndexDataMinusI-1, array.get(aOmegaVal, i), barIndexDataMinusI, array.get(aOmegaVal, i+1), color=clr1, width=2))
  92. array.set(bLineData, i, line.new(barIndexDataMinusI-1, array.get(bOmegaVal, i), barIndexDataMinusI, array.get(bOmegaVal, i+1), color=clr2, width=2))
  93. for j=0 to limitMinusOne by 3
  94. barIndexDataMinusj = bar_index - limitMinusOne + j - 1
  95. 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))
  96. dataLinesAreNA := false
  97. else
  98. for i=0 to limitMinusOne
  99. barIndexDataMinusI = bar_index - limitMinusOne + i
  100. lineID1 = array.get(aLineData, i)
  101. lineID2 = array.get(bLineData, i)
  102. line.set_xy1(lineID1, barIndexDataMinusI-1, array.get(aOmegaVal, i ))
  103. line.set_xy2(lineID1, barIndexDataMinusI , array.get(aOmegaVal, i+1))
  104. line.set_xy1(lineID2, barIndexDataMinusI-1, array.get(bOmegaVal, i ))
  105. line.set_xy2(lineID2, barIndexDataMinusI , array.get(bOmegaVal, i+1))
  106. for j=0 to limitMinusOne by 3
  107. label1 = array.get(rvalLabel, j)
  108. barIndexDataMinusj = bar_index - limitMinusOne + j - 1
  109. label.set_x(label1, barIndexDataMinusj)
  110. na
  111. maxhData = max(array.get(aOmegaVal,0), array.get(bOmegaVal,0))
  112. barIndexDataMinusLineVolume = bar_index - lineVolume
  113. createLine(barIndexDataMinusLineVolume, 0.0, bar_index , 0.0, line.style_arrow_right, color.rgb(230, 230, 230),1)
  114. createLine(barIndexDataMinusLineVolume, 0.0, barIndexDataMinusLineVolume, maxhData * 1.1, line.style_arrow_right, color.rgb(230, 230, 230), 1)
  115. createLabel(bar_index , 0, "return %" , label.style_label_left , color.rgb(230, 230, 230),size.large)
  116. createLabel(barIndexDataMinusLineVolume, maxhData * 1.1, "Ω" , label.style_label_down , color.rgb(230, 230, 230),size.large)
  117. createLabel(barIndexDataMinusLineVolume, array.get(aOmegaVal, 1), SYMBOL_REF_ID, label.style_label_up , clr1,size.normal)
  118. createLabel(barIndexDataMinusLineVolume, array.get(bOmegaVal, 1), OTHER_REF_ID , label.style_label_right, clr2,size.normal)
  119.  
  120. hline(1.0, color=color.rgb(196, 196, 196), linestyle=hline.style_dotted)
  121. hline(-0.1, color=#00000000)
Advertisement
Add Comment
Please, Sign In to add comment