Bollinger Band Limit Market Maker Strategi

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

img

Ringkasan

Ini adalah strategi pembuat pasaran yang menggunakan Bollinger Bands sebagai entri, purata bergerak sebagai penutupan, dan stop loss peratusan mudah.

Logika Strategi

Strategi ini menggunakan band atas dan bawah Bollinger Bands sebagai kawasan peluang untuk memasuki kedudukan. Khususnya, apabila harga berada di bawah band bawah, ia akan lama untuk membuka kedudukan panjang; apabila harga berada di atas band atas, ia akan pendek untuk membuka kedudukan pendek.

Di samping itu, strategi ini juga menggunakan purata bergerak sebagai penanda aras untuk menutup kedudukan. Apabila memegang kedudukan panjang, jika harga di atas purata bergerak, ia akan memilih untuk menutup panjang; dengan cara yang sama, apabila memegang kedudukan pendek, jika harga di bawah purata bergerak, ia juga akan memilih untuk menutup pendek.

Untuk stop loss, ia menggunakan peratusan stop loss yang mudah berdasarkan harga kemasukan. Ini dapat mengelakkan kerugian besar dalam pasaran trend.

Analisis Kelebihan

Kelebihan utama strategi ini ialah:

  1. Menggunakan Bollinger Bands dapat menangkap turun naik harga dengan berkesan dan mendapatkan lebih banyak peluang perdagangan apabila turun naik meningkat.
  2. Strategi pembuat pasaran boleh mendapat manfaat daripada penyebaran beli-beli dengan berdagang kedua-dua belah pihak.
  3. Peratusan stop loss boleh mengawal risiko secara proaktif dan mengelakkan kerugian besar di pasaran trend.

Analisis Risiko

Terdapat juga beberapa risiko dengan strategi ini:

  1. Bollinger Bands tidak selalu menjadi isyarat kemasukan yang boleh dipercayai dan kadangkala boleh memberikan isyarat palsu.
  2. Strategi pembuat pasaran rentan untuk dipukul di pasaran yang berbeza.
  3. Peratusan stop loss mungkin terlalu kasar dan tidak dapat menyesuaikan diri dengan keadaan pasaran yang kompleks.

Untuk mengurangkan risiko ini, kita mungkin mempertimbangkan untuk menambah penapis lain, mengoptimumkan tetapan stop loss, atau dengan betul mengehadkan saiz kedudukan.

Arahan pengoptimuman

Terdapat ruang untuk pengoptimuman lanjut:

  1. Kita boleh menguji kombinasi parameter yang berbeza untuk mencari parameter yang optimum.
  2. Kita boleh menambah lebih banyak penapis untuk pengesahan pelbagai faktor.
  3. Kita boleh menggunakan kaedah pembelajaran mesin untuk mengoptimumkan parameter secara automatik.
  4. Kita boleh mempertimbangkan kaedah stop loss yang lebih canggih seperti SAR parabolik.

Kesimpulan

Secara keseluruhan, ini adalah strategi pembuatan pasaran frekuensi tinggi yang sangat menguntungkan. Ia memanfaatkan Bollinger Bands untuk isyarat perdagangan dan mengawal risiko. Tetapi kita juga perlu menyedari kekurangannya dan mengesahkan dengan teliti dalam perdagangan langsung. Dengan pengoptimuman lanjut, strategi ini berpotensi menghasilkan pulangan 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 lanjut