複数のタイムフレームに基づいたビットコインの定量帯取引戦略

作者: リン・ハーンチャオチャン, 日付: 2023-12-01 13:50:02
タグ:

img

概要

この戦略は,異なるタイムフレームにおける定量指標を組み合わせてビットコインの価格帯を特定し,トレンド追跡取引を行います. 5分タイムフレームを採用し,利益のためにバンドを長期にわたって保持することを目指しています.

戦略の論理

  1. 日々の時間枠に基づいて計算されたRSI指標は,偽ブレイクをフィルターするために取引量に基づいて重み付けられます.
  2. 日々のRSIインジケーターは,量的なバンドインジケーターを構築するためにEMAによって平ら化されます.
  3. 5分間のタイムフレームは,トレード信号を生成するために線形回帰とHMA指標の組み合わせを使用します.
  4. 定量帯域指標と各時間枠の取引信号を組み合わせることで,戦略は中期から長期間の価格帯域を特定します.

利点分析

  1. RSIインジケーターは,真波帯を効果的に識別し,偽ブレイクをフィルターすることができます.
  2. HMA指標は価格変動に敏感で,ターンをタイムリーに把握できる.
  3. 複数のタイムフレームを組み合わせることで 中期から長期間の帯をより正確に特定できます
  4. 5分間の時間枠での取引は,より高い操作頻度を可能にします.
  5. バンド追跡戦略として,正確なポイントの選択を必要とせず,より長い期間保持することができます.

リスク分析

  1. 定量指標は誤った信号を生む可能性があるため,基本分析が推奨される.
  2. バンドが中途半端に逆転する可能性があるので ストップ・ロスのメカニズムは 整える必要があります
  3. 信号の遅延により 最適なエントリーポイントが欠落する可能性があります
  4. 収益性の高いバンドは,長期保持期間が必要で,資本圧力の許容が必要です.

オプティマイゼーションの方向性

  1. 異なるパラメータで RSI インジケーターのテスト効果
  2. 他の補助帯の指示を導入してみてください.
  3. HMA インジケーターの長さのパラメータを最適化します
  4. ストップ・ロストと 収益戦略を追加します
  5. バンド交換の保持サイクルを調整する.

結論

この戦略は,タイムフレームとバンドトラッキングを組み合わせることで,ビットコインの中長期トレンドを効果的に捉える.短期取引と比較して,中長期バンド取引は,引き下げが小さく,利益の可能性が大きい.次のステップは,パラメータチューニングとリスク管理追加を通じて収益性と安定性をさらに向上させる.


/*backtest
start: 2023-10-31 00:00:00
end: 2023-11-30 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4

strategy(title='Pyramiding BTC 5 min', overlay=true, pyramiding=5, initial_capital=10000, default_qty_type=strategy.percent_of_equity, default_qty_value=20, commission_type=strategy.commission.percent, commission_value=0.075)
//the pyramide based on this script  https://www.tradingview.com/script/7NNJ0sXB-Pyramiding-Entries-On-Early-Trends-by-Coinrule/
//
fastLength = input(250, title="Fast filter length ", minval=1)
slowLength = input(500,title="Slow filter length",  minval=1)
source=close
v1=ema(source,fastLength)
v2=ema(source,slowLength)
//
//Backtest dates
fromMonth = input(defval=1, title="From Month")
fromDay = input(defval=10, title="From Day")
fromYear = input(defval=2020, title="From Year")
thruMonth = input(defval=1, title="Thru Month")
thruDay = input(defval=1, title="Thru Day")
thruYear = input(defval=2112, title="Thru Year")

showDate = input(defval=true, title="Show Date Range")

start = timestamp(fromYear, fromMonth, fromDay, 00, 00)  // backtest start window
finish = timestamp(thruYear, thruMonth, thruDay, 23, 59)  // backtest finish window
window() =>  // create function "within window of time"
    time >= start and time <= finish ? true : false


leng=1
p1=close[1]

len55 = 10
//taken from https://www.tradingview.com/script/Ql1FjjfX-security-free-MTF-example-JD/
HTF = input("1D", type=input.resolution)
ti = change( time(HTF) ) != 0
T_c = fixnan( ti ? close : na )

vrsi = rsi(cum(change(T_c) * volume), leng)
pp=wma(vrsi,len55)

d=(vrsi[1]-pp[1])
len100 = 10
x=ema(d,len100)
//
zx=x/-1
col=zx > 0? color.lime : color.orange

//

tf10 = input("1", title = "Timeframe", type = input.resolution, options = ["1", "5", "15", "30", "60","120", "240","360","720", "D", "W"])

length = input(50, title = "Period", type = input.integer)
shift = input(1, title = "Shift", type = input.integer)

hma(_src, _length)=>
    wma((2 * wma(_src, _length / 2)) - wma(_src, _length), round(sqrt(_length)))
    
hma3(_src, _length)=>
    p = length/2
    wma(wma(close,p/3)*3 - wma(close,p/2) - wma(close,p),p)

b =security(syminfo.tickerid, tf10, hma3(close[1], length)[shift])
//plot(a,color=color.gray)
//plot(b,color=color.yellow)
close_price = close[0]
len = input(25)

linear_reg = linreg(close_price, len, 0)


filter=input(true)

buy=crossover(linear_reg, b)

longsignal = (v1 > v2 or filter == false ) and buy and window()

//set take profit

ProfitTarget_Percent = input(3)
Profit_Ticks = close * (ProfitTarget_Percent / 100) / syminfo.mintick

//set take profit

LossTarget_Percent = input(10)
Loss_Ticks = close * (LossTarget_Percent / 100) / syminfo.mintick


//Order Placing

strategy.entry("Entry 1", strategy.long, when=strategy.opentrades == 0 and longsignal)

strategy.entry("Entry 2", strategy.long, when=strategy.opentrades == 1 and longsignal)

strategy.entry("Entry 3", strategy.long, when=strategy.opentrades == 2 and longsignal)

strategy.entry("Entry 4", strategy.long, when=strategy.opentrades == 3 and longsignal)

strategy.entry("Entry 5", strategy.long, when=strategy.opentrades == 4 and longsignal)





if strategy.position_size > 0
    strategy.exit(id="Exit 1", from_entry="Entry 1", profit=Profit_Ticks, loss=Loss_Ticks)
    strategy.exit(id="Exit 2", from_entry="Entry 2", profit=Profit_Ticks, loss=Loss_Ticks)
    strategy.exit(id="Exit 3", from_entry="Entry 3", profit=Profit_Ticks, loss=Loss_Ticks)
    strategy.exit(id="Exit 4", from_entry="Entry 4", profit=Profit_Ticks, loss=Loss_Ticks)
    strategy.exit(id="Exit 5", from_entry="Entry 5", profit=Profit_Ticks, loss=Loss_Ticks)
    



もっと