Ini adalah strategi pembuat pasar yang menggunakan Bollinger Bands sebagai entri, moving average sebagai penutupan, dan stop loss persentase sederhana.
Strategi ini menggunakan band atas dan bawah Bollinger Bands sebagai area peluang untuk memasuki posisi. Secara khusus, ketika harga berada di bawah band bawah, itu akan lama untuk membuka posisi panjang; ketika harga berada di atas band atas, itu akan pendek untuk membuka posisi pendek.
Selain itu, strategi ini juga menggunakan moving average sebagai patokan untuk penutupan posisi. Ketika memegang posisi panjang, jika harga di atas moving average, ia akan memilih untuk menutup posisi panjang; dengan cara yang sama, ketika memegang posisi pendek, jika harga di bawah moving average, ia juga akan memilih untuk menutup short.
Untuk stop loss, ia menggunakan persentase stop loss yang sederhana berdasarkan harga masuk. Hal ini dapat secara efektif menghindari kerugian besar di pasar tren.
Keuntungan utama dari strategi ini adalah:
Ada juga beberapa risiko dengan strategi ini:
Untuk mengurangi risiko ini, kita mungkin mempertimbangkan untuk menambahkan filter lain, mengoptimalkan pengaturan stop loss, atau membatasi ukuran posisi dengan benar.
Ada ruang untuk optimasi lebih lanjut:
Secara keseluruhan ini adalah strategi pembuatan pasar frekuensi tinggi yang sangat menguntungkan. Ini memanfaatkan Bollinger Bands untuk sinyal perdagangan dan mengendalikan risiko. Tapi kita juga perlu menyadari kekurangannya dan memverifikasi dengan hati-hati dalam perdagangan langsung. Dengan optimasi lebih lanjut, strategi ini memiliki potensi untuk menghasilkan pengembalian yang lebih stabil dan besar.
/*backtest start: 2023-12-24 00:00:00 end: 2024-01-23 00:00:00 period: 1h basePeriod: 15m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=3 strategy(shorttitle="BBL", title="BB limit", overlay = true) length = input(200, minval=1) src = input(hlc3, title="Source") xmult = input(44, minval=0.001, maxval=5000, title = "bb mult (0.1%)") s = input(title="Trend source", defval = "sma", options = ["ema", "sma", "rma", "wma"]) basis = s == "ema" ? ema(src, length) : s == "sma" ? sma(src, length) : s =="rma" ? rma(src, length) : wma(src, length) sd = input(title="Dev source", defval = "stdev", options = ["stdev", "dev"]) mult = xmult / 10 dev = sd == "stdev" ? mult * stdev(src, length) : mult * dev(src, length) diff = input(0.5, title = "Spread") LongPrice(p) => LongPrice = diff == 0 ? p : floor(p / diff) * diff ShortPrice(p) => ShortPrice = diff == 0 ? p : ceil(p / diff) * diff pyr = input(1, title = "Pyramiding") useStopLoss = input(true) stoploss_xmult = input(15, minval=0.001, maxval=5000, title = "StopLoss 0.1%") stopLoss_mult = sd == "simple" ? 1 + stoploss_xmult / 10 / 100 : stoploss_xmult / 10 dev2 = sd == "stdev" ? stopLoss_mult * stdev(src, length) : sd == "dev" ? stopLoss_mult * dev(src, length) : (stopLoss_mult - 1) * basis upper = basis + (1*dev) lower = basis - (1*dev) plot(basis, color=fuchsia, linewidth=2) plot(upper, color=green, linewidth=2) plot(lower, color=green, linewidth=2) strategy.cancel_all() if strategy.position_size > 0 and close <= basis + diff * 2 strategy.order("Close long", strategy.short, strategy.position_size, limit = ShortPrice(basis)) else if strategy.position_size < 0 and close >= basis - diff * 2 strategy.order("Close short", strategy.long, -strategy.position_size, limit = LongPrice(basis)) stopLossPrice1 = na stopLossPrice2 = na add = na openOrderCondition = close > lower - 2 * diff and (strategy.opentrades < pyr or (strategy.position_size < 0 and strategy.position_avg_price > lower * (1 + stopLoss_mult / 100))) if openOrderCondition add := strategy.position_size > 0 ? -strategy.position_size : close >= basis - diff * 2 ? 0 : -strategy.position_size strategy.order("Open long", strategy.long, strategy.equity / pyr / lower + add, limit = LongPrice(lower)) if useStopLoss and (strategy.position_size > 0 or openOrderCondition) add = openOrderCondition ? strategy.equity / pyr / lower : 0 posPrice = strategy.position_size <= 0 ? lower : strategy.position_avg_price posSize = strategy.position_size <= 0 ? 0 : strategy.position_size stopLossPrice1 := posPrice * (1 - stopLoss_mult / 100) strategy.order("StopLoss open short ", strategy.short, posSize + add + strategy.equity / pyr / stopLossPrice1, stop = ShortPrice(stopLossPrice1)) openOrderCondition := close < upper + 2 * diff and (strategy.opentrades < pyr or (strategy.position_size > 0 and strategy.position_avg_price * (1 + stopLoss_mult / 100) < upper)) if openOrderCondition add := strategy.position_size < 0 ? strategy.position_size : close <= basis + diff * 2 ? 0 : strategy.position_size strategy.order("Open short", strategy.short, strategy.equity / pyr / upper + add, limit = ShortPrice(upper)) if useStopLoss and (strategy.position_size < 0 or openOrderCondition) add = openOrderCondition ? strategy.equity / pyr / upper : 0 posPrice = strategy.position_size >= 0 ? upper : strategy.position_avg_price posSize = strategy.position_size >= 0 ? 0 : -strategy.position_size stopLossPrice2 := posPrice * (1 + stopLoss_mult / 100) strategy.order("StopLoss open long", strategy.long, posSize + add + strategy.equity / pyr / stopLossPrice2, stop = LongPrice(stopLossPrice2)) plot(not useStopLoss ? na : stopLossPrice1, color=red, linewidth=2) plot(not useStopLoss ? na : stopLossPrice2, color=red, linewidth=2) // === Backtesting Dates === testPeriodSwitch = input(false, "Custom Backtesting Dates") testStartYear = input(2018, "Backtest Start Year") testStartMonth = input(1, "Backtest Start Month") testStartDay = input(1, "Backtest Start Day") testStartHour = input(0, "Backtest Start Hour") testPeriodStart = timestamp(testStartYear,testStartMonth,testStartDay,testStartHour,0) testStopYear = input(2018, "Backtest Stop Year") testStopMonth = input(12, "Backtest Stop Month") testStopDay = input(14, "Backtest Stop Day") testStopHour = input(14, "Backtest Stop Hour") testPeriodStop = timestamp(testStopYear,testStopMonth,testStopDay,testStopHour,0) testPeriod() => time >= testPeriodStart and time <= testPeriodStop ? true : false isPeriod = testPeriodSwitch == true ? testPeriod() : true // === /END if not isPeriod strategy.cancel_all() strategy.close_all()