Diese Strategie ist ein quantitatives Handelssystem, das auf Bollinger Bands-Breakout basiert und 3 Standardabweichungen für das obere Band und 1 Standardabweichung für das untere Band verwendet, kombiniert mit einem 100-tägigen gleitenden Durchschnitt als mittleres Band. Die Strategie erfasst hauptsächlich langfristige Trends, indem Preisbreaks über dem oberen Band erkannt werden und das untere Band als Stop-Loss-Signal verwendet wird. Das Kernkonzept besteht darin, Positionen während starker Breakouts einzugeben und auszutreten, wenn die Preise unter das untere Band fallen, um einen kontrollierten Risiko-Trend zu erreichen.
Das Kernprinzip basiert auf den statistischen Eigenschaften von Bollinger Bands. Das obere Band verwendet 3 Standardabweichungen, was bedeutet, dass die Wahrscheinlichkeit, dass der Preis über dieses Niveau bricht, unter normalen Verteilungsannahmen nur 0,15% beträgt, was darauf hindeutet, dass bei Ausbrüchen eine signifikante Trendbildung stattfindet. Das mittlere Band verwendet einen gleitenden Durchschnitt von 100 Tagen, ein Zeitraum, der lang genug ist, um kurzfristige Marktgeräusche effektiv zu filtern. Das untere Band verwendet 1 Standardabweichung als Stop-Loss-Linie, eine relativ konservative Einstellung, die hilft, rechtzeitig auszusteigen. Die Strategie erzeugt lange Signale, wenn der Preis über das obere Band bricht und aussteigt, wenn der Preis unter das untere Band fällt.
Dies ist eine gut konzipierte Trend-Folge-Strategie mit klarer Logik. Durch die statistischen Eigenschaften von Bollinger-Bändern und die Trend-Folge-Charakteristiken von gleitenden Durchschnitten erfasst sie effektiv signifikante Markt-Breakout-Möglichkeiten. Während es Drawdown-Risiken gibt, behält die Strategie durch angemessene Stop-Loss-Einstellungen und Risikokontrolle einen praktischen Wert. Weiteres Optimierungspotenzial liegt in der Signalbestätigung, Stop-Loss-Mechanismen und Positionsmanagementaspekten.
/*backtest start: 2024-11-12 00:00:00 end: 2024-12-11 08:00:00 period: 1h basePeriod: 1h exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ // This Pine Script™ code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/ // © MounirTrades007 // @version=6 strategy("Bollinger Bands", overlay=true, initial_capital=100000, default_qty_type=strategy.percent_of_equity, default_qty_value=200) // Get user input var g_bb = "Bollinger Band Settings" upperBandSD = input.float(title="Upper Band Std Dev", defval=3.0, tooltip="Upper band's standard deviation multiplier", group=g_bb) lowerBandSD = input.float(title="Lower Band Std Dev", defval=1.0, tooltip="Lower band's standard deviation multiplier", group=g_bb) maPeriod = input.int(title="Middle Band MA Length", defval=100, tooltip="Middle band's SMA period length", group=g_bb) var g_tester = "Backtester Settings" drawTester = input.bool(title="Draw Backtester", defval=true, group=g_tester, tooltip="Turn on/off inbuilt backtester display") // Get Bollinger Bands [bbIgnore1, bbHigh, bbIgnore2] = ta.bb(close, maPeriod, upperBandSD) [bbMid, bbIgnore3, bbLow] = ta.bb(close, maPeriod, lowerBandSD) // Prepare trade persistent variables drawEntry = false drawExit = false // Detect bollinger breakout if close > bbHigh and barstate.isconfirmed and strategy.position_size == 0 drawEntry := true strategy.entry(id="Trade", direction=strategy.long) alert("Bollinger Breakout Detected for " + syminfo.ticker, alert.freq_once_per_bar_close) // Detect bollinger sell signal if close < bbLow and barstate.isconfirmed and strategy.position_size != 0 drawExit := true strategy.close(id="Trade") alert("Bollinger Exit detected for " + syminfo.ticker, alert.freq_once_per_bar_close) // Draw bollinger bands plot(bbMid, color=color.blue, title="Middle SMA") plot(bbHigh, color=color.green, title="Upper Band") plot(bbLow, color=color.red, title="Lower Band") // Draw signals plotshape(drawEntry, style=shape.triangleup, color=color.green, location=location.belowbar, size=size.normal, title="Buy Signal") plotshape(drawExit, style=shape.xcross, color=color.red, location=location.belowbar, size=size.normal, title="Sell Signal") // // ============================================================================= // // START BACKTEST CODE // // ============================================================================= // // Prepare stats table // var table testTable = table.new(position.top_right, 2, 2, border_width=1) // f_fillCell(_table, _column, _row, _title, _value, _bgcolor, _txtcolor) => // _cellText = _title + "\n" + _value // table.cell(_table, _column, _row, _cellText, bgcolor=_bgcolor, text_color=_txtcolor) // // Draw stats table // var bgcolor = color.black // if barstate.islastconfirmedhistory // if drawTester // dollarReturn = strategy.equity - strategy.initial_capital // f_fillCell(testTable, 0, 0, "Total Trades:", str.tostring(strategy.closedtrades), bgcolor, color.white) // f_fillCell(testTable, 0, 1, "Win Rate:", str.tostring(strategy.wintrades / strategy.closedtrades * 100, "##.##") + "%", bgcolor, color.white) // f_fillCell(testTable, 1, 0, "Equity:", "$" + str.tostring(strategy.equity, "###,###.##"), bgcolor, color.white) // f_fillCell(testTable, 1, 1, "Return:", str.tostring((strategy.netprofit / strategy.initial_capital) * 100, "##.##") + "%", dollarReturn > 0 ? color.green : color.red, color.white) // // ============================================================================= // // END BACKTEST CODE // // =============================================================================