Guest User

Untitled

a guest
Jun 8th, 2024
73
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.18 KB | Cryptocurrency | 0 0
  1. // Get user input
  2. var g_bb = "Bollinger Band Settings"
  3. upperBandSD = input.float(title="Upper Band Std Dev", defval=3.0, tooltip="Upper band's standard deviation multiplier", group=g_bb)
  4. lowerBandSD = input.float(title="Lower Band Std Dev", defval=1.0, tooltip="Lower band's standard deviation multiplier", group=g_bb)
  5. maPeriod = input.int(title="Middle Band MA Length", defval=100, tooltip="Middle band's SMA period length", group=g_bb)
  6. var g_tester = "Backtester Settings"
  7. drawTester = input.bool(title="Draw Backtester", defval=true, group=g_tester, tooltip="Turn on/off inbuilt backtester display")
  8. var g_rf = "Regime Filter Settings"
  9. useRegime = input.bool(title="Use Regime Filter", defval=true, group=g_rf)
  10. res = input.timeframe(title="Timeframe", defval="D", group=g_rf)
  11. len = input.int(title="EMA Length", defval=20, group=g_rf)
  12. market = input.symbol(title="Market", defval="BATS:SPY", group=g_rf)
  13.  
  14. // Define custom security function
  15. f_sec(_market, _res, _exp) => request.security(_market, _res, _exp[barstate.isconfirmed ? 0 : 1])
  16.  
  17. // Get EMA value
  18. ema = ta.ema(close, len)
  19. emaValue = f_sec(market, res, ema)
  20.  
  21. // Check if price is above or below EMA filter
  22. marketPrice = f_sec(market, res, close)
  23. regimeFilter = not useRegime or marketPrice > emaValue
  24.  
  25. // Change background color
  26. plotshape(useRegime, style=shape.square, size=size.normal, location=location.bottom, color=regimeFilter ? color.green : color.red, title="Regime Filter")
  27.  
  28. // Get Bollinger Bands
  29. [bbIgnore1, bbHigh, bbIgnore2] = ta.bb(close, maPeriod, upperBandSD)
  30. [bbMid, bbIgnore3, bbLow] = ta.bb(close, maPeriod, lowerBandSD)
  31.  
  32. // Prepare trade persistent variables
  33. drawEntry = false
  34. drawExit = false
  35.  
  36. // Detect bollinger breakout
  37. if close > bbHigh and barstate.isconfirmed and strategy.position_size == 0 and regimeFilter
  38. drawEntry := true
  39. strategy.entry(id="Trade", direction=strategy.long, when=strategy.position_size == 0)
  40. alert("Bollinger Breakout Detected for " + syminfo.ticker, alert.freq_once_per_bar_close)
  41.  
  42. // Detect bollinger sell signal
  43. if close < bbLow and barstate.isconfirmed and strategy.position_size != 0
  44. drawExit := true
  45. strategy.close(id="Trade", when=drawExit)
  46. alert("Bollinger Exit detected for " + syminfo.ticker, alert.freq_once_per_bar_close)
  47.  
  48. // Draw bollinger bands
  49. plot(bbMid, color=color.blue, title="Middle SMA")
  50. plot(bbHigh, color=color.green, title="Upper Band")
  51. plot(bbLow, color=color.red, title="Lower Band")
  52.  
  53. // Draw signals
  54. plotshape(drawEntry, style=shape.triangleup, color=color.green, location=location.belowbar, size=size.normal, title="Buy Signal")
  55. plotshape(drawExit, style=shape.xcross, color=color.red, location=location.belowbar, size=size.normal, title="Sell Signal")
  56.  
  57. // =============================================================================
  58. // START BACKTEST CODE
  59. // =============================================================================
  60.  
  61. // Prepare stats table
  62. var table testTable = table.new(position.top_right, 2, 2, border_width=1)
  63. f_fillCell(_table, _column, _row, _title, _value, _bgcolor, _txtcolor) =>
  64. _cellText = _title + "\n" + _value
  65. table.cell(_table, _column, _row, _cellText, bgcolor=_bgcolor, text_color=_txtcolor)
  66.  
  67. // Draw stats table
  68. var bgcolor = color.black
  69. if barstate.islastconfirmedhistory
  70. if drawTester
  71. dollarReturn = strategy.equity - strategy.initial_capital
  72. f_fillCell(testTable, 0, 0, "Total Trades:", str.tostring(strategy.closedtrades), bgcolor, color.white)
  73. f_fillCell(testTable, 0, 1, "Win Rate:", str.tostring(strategy.wintrades / strategy.closedtrades * 100, "##.##") + "%", bgcolor, color.white)
  74. f_fillCell(testTable, 1, 0, "Equity:", "$" + str.tostring(strategy.equity, "###,###.##"), bgcolor, color.white)
  75. f_fillCell(testTable, 1, 1, "Return:", str.tostring((strategy.netprofit / strategy.initial_capital) * 100, "##.##") + "%", dollarReturn > 0 ? color.green : color.red, color.white)
  76.  
  77. // =============================================================================
  78. // END BACKTEST CODE
  79. // =============================================================================
Advertisement
Add Comment
Please, Sign In to add comment