
Strategi ini adalah strategi pemasar yang menggunakan pita Brin sebagai entri, purata bergerak sebagai tutup, dan peratusan hentian mudah sebagai hentian. Ia mendapat keuntungan yang sangat tinggi pada kontrak xtbtusd pada bulan Jun 2022.
Strategi ini menggunakan jalur atas dan bawah di Brin Belt sebagai kawasan peluang untuk membina gudang. Secara khusus, apabila harga lebih rendah daripada jalur bawah, banyak gudang akan dibuka; apabila harga lebih tinggi daripada jalur atas, satu gudang kosong akan dibuka.
Di samping itu, strategi ini juga menggunakan purata bergerak sebagai asas untuk kedudukan kosong. Apabila memegang lebih banyak pesanan, ia akan memilih kedudukan kosong jika harganya lebih tinggi daripada purata bergerak; Begitu juga, apabila memegang tiket kosong, ia akan memilih kedudukan kosong jika harganya lebih rendah daripada purata bergerak.
Untuk menghentikan kerugian, strategi ini menggunakan cara berhenti bergulir yang mudah ini dengan harga masuk kalikan dengan peratusan tertentu. Ini dapat dengan berkesan mengelakkan kerugian besar dalam keadaan unilateral.
Beberapa kelebihan utama strategi ini ialah:
Strategi ini mempunyai beberapa risiko:
Untuk mengurangkan risiko ini, kita boleh mempertimbangkan penapisan dalam kombinasi dengan petunjuk lain, mengoptimumkan tetapan strategi hentikan kerugian, atau membatasi saiz kedudukan dengan sewajarnya.
Strategi ini masih boleh dioptimumkan lagi:
Strategi ini secara keseluruhannya adalah strategi pelabur frekuensi tinggi yang sangat menguntungkan. Ia menggunakan Brin untuk memberikan peluang perdagangan dan mengawal risiko. Tetapi kita juga perlu menyedari masalah dan kekurangan yang ada, dan dengan berhati-hati mengesahkannya di lapangan. Dengan pengoptimuman lanjut, strategi ini dijangka menghasilkan pulangan ultra tinggi yang lebih stabil.
/*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()