Bollinger Band Limit Market Maker Strategi

Penulis:ChaoZhang, Tanggal: 2024-01-24 11:05:56
Tag:

img

Gambaran umum

Ini adalah strategi pembuat pasar yang menggunakan Bollinger Bands sebagai entri, moving average sebagai penutupan, dan stop loss persentase sederhana.

Logika Strategi

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.

Analisis Keuntungan

Keuntungan utama dari strategi ini adalah:

  1. Menggunakan Bollinger Bands dapat secara efektif menangkap volatilitas harga dan mendapatkan lebih banyak peluang perdagangan ketika volatilitas meningkat.
  2. Strategi pembuat pasar dapat mendapatkan keuntungan dari spread bid-ask dengan memperdagangkan kedua belah pihak.
  3. Persentase stop loss dapat secara proaktif mengendalikan risiko dan menghindari kerugian besar di pasar tren.

Analisis Risiko

Ada juga beberapa risiko dengan strategi ini:

  1. Bollinger Bands tidak selalu sinyal masuk yang dapat diandalkan dan kadang-kadang dapat memberikan sinyal palsu.
  2. Strategi market maker rentan terhadap penyalahgunaan di berbagai pasar.
  3. Persentase stop loss mungkin terlalu kasar dan tidak dapat beradaptasi dengan situasi pasar yang kompleks.

Untuk mengurangi risiko ini, kita mungkin mempertimbangkan untuk menambahkan filter lain, mengoptimalkan pengaturan stop loss, atau membatasi ukuran posisi dengan benar.

Arahan Optimasi

Ada ruang untuk optimasi lebih lanjut:

  1. Kita bisa menguji kombinasi parameter yang berbeda untuk menemukan parameter yang optimal.
  2. Kita bisa menambahkan filter untuk verifikasi multi-faktor.
  3. Kita bisa menggunakan metode pembelajaran mesin untuk mengoptimalkan parameter secara otomatis.
  4. Kita bisa mempertimbangkan metode stop loss yang lebih canggih seperti SAR parabolik.

Kesimpulan

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()

Lebih banyak