ボリンジャーバンドリミットマーケットメーカー戦略


作成日: 2024-01-24 11:05:56 最終変更日: 2024-01-24 11:05:56
コピー: 0 クリック数: 949
1
フォロー
1617
フォロワー

ボリンジャーバンドリミットマーケットメーカー戦略

概要

この戦略は,ブリン帯をエントリーとして,移動平均をクローズとして,そして単純なストップ損失パーセントをストップとして使用する市場戦略である.それは2022年6月のxtbtusd契約で非常に高い利益を得ている.

戦略原則

この戦略は,ブリン帯の上下線を倉庫建設のチャンス領域として使用する.具体的には,価格が下線より低いときは,複数の倉庫建設が開く;価格が上線より高いときは,空き単一の倉庫建設が開く.

さらに,この戦略は,移動平均を平仓の基準として使用する. 複数の注文を保有するときは,価格が移動平均より高い場合は平仓を選択する. 同様に,空券を保有するときは,価格が移動平均より低い場合は平仓を選択する.

ストップの場合,この戦略は入場価格を一定パーセントで掛けるこの単純なローリングストップを使用する.これは,一方的な状況下での巨大な損失を効果的に回避する.

優位分析

この戦略の主な利点は以下の通りです.

  1. ブリン・バンドは価格の変動を効果的に捉え,波動が激化する時に取引機会を増やすことができます.
  2. 市販戦略では,双方向取引を通じて,買取手数料の収入を得ることができます.
  3. パーセンテージ・ストップは,リスクを積極的にコントロールし,一方的な状況下での超大損失を効果的に回避します.

リスク分析

この戦略にはいくつかのリスクがあります.

  1. ブリン帯は必ずしも信頼できる入場指標ではないし,時には誤った信号を発する.
  2. ビジネス戦略は,不安定な状況で, 囚われやすいものです.
  3. パーセンテージ・ストップ・ダメージは,複雑な状況に対応する柔軟性がないため,あまりにも恣意的かもしれません.

これらのリスクを軽減するために,他の指標と組み合わせたフィルタリング,最適化ストップ・ロスの策定,または適切なポジションサイズ制限を考慮することができます.

最適化の方向

この戦略はさらに改善できる余地があります.

  1. 異なるパラメータの組み合わせをテストして最適なパラメータを見つけることができます.
  2. マルチファクター検証は,多くのフィルタリング指標に追加できます.
  3. 機械学習の方法を使用してパラメータを自動最適化できます.
  4. パラロージュ・ライン・ストップのような,より精巧なストップ方法を使用することを考えることができます.

要約する

この戦略は,全体的に非常に収益性の高い高頻度市場戦略である.それはブリン帯を利用して取引機会を提供し,リスクを制御している.しかし,我々は,その存在している問題と欠陥を認識し,現場で慎重に検証する必要があります.この戦略は,さらに最適化することで,より安定した超高利益をもたらす見込みである.

ストラテジーソースコード
/*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()