資源の読み込みに... 荷物...

圧縮バックテスト トランスフォーマー v2.0

作者: リン・ハーンチャオチャン開催日:2024年4月28日 14:09:26
タグ:

img

概要

Squeeze Backtest Transformer v2.0は,絞り込み戦略に基づいた定量的な取引システムである.エントリー,ストップ損失,利益率,最大保持時間などのパラメータを設定することにより,特定の時間範囲内で戦略をバックテストする.この戦略は多方向取引をサポートし,長または短に取引方向を柔軟に設定することができます.同時に,戦略はバックテスト期間を設定するための豊富なオプションも提供し,固定時間範囲または最大バックテスト時間を簡単に選択することができます.

戦略原則

  1. まず,ユーザーによって設定されたバックテスト期間パラメータに基づいてバックテストの開始と終了時間を決定します.
  2. バックテスト期間中に,現在のポジションがない場合,価格がエントリー価格 (開設パーセントに基づいて計算される) に達した場合,ポジションを開き,ストップ・ロストとテイク・プロフィート価格 (ストップ・ロストとテイク・プロフィートパーセントに基づいて計算される) を同時に設定します.
  3. ポジションが既に保有されている場合,以前の取利益・ストップ損失の注文をキャンセルし,新しい取利益・ストップ損失の価格 (現在のポジション平均価格に基づいて計算される) をリセットします.
  4. 最大保持時間が設定されている場合,保持時間が最大値に達すると,ポジションを強制的に閉じます.
  5. この戦略は,長期と短期の両方向の取引をサポートします.

戦略 の 利点

  1. 柔軟なパラメータ設定は,異なる市場状況と取引ニーズに応じて調整できます.
  2. 異なる市場条件で利益を得るための多方向取引を支援する.
  3. バックテスト期間を設定するための豊富なオプションを提供し,簡単に歴史的なデータのバックテストと分析を行うことができます.
  4. ストップ・ロストとメリット・テイク設定は,リスクを効果的に制御し,資本利用効率を向上させることができます.
  5. 最大保持期間を設定することで,ポジションを長時間保持し,市場リスクにさらされないようにできます.

戦略リスク

  1. 入場価格,ストップ損失価格,収益価格の設定は,戦略の収益に大きな影響を与えます.不適切なパラメータ設定は損失につながる可能性があります.
  2. 市場が急激に変動すると,ポジションを開いた直後にストップ・ロスは起動し,損失が起こります.
  3. 最大保有期間がポジションの閉鎖を誘発する場合は,後続的な利益を得る機会を逃す可能性があります.
  4. 戦略は特定の特殊な市場条件 (横向市場など) でうまく機能しない可能性があります.

戦略の最適化方向

  1. 戦略の安定性と収益性を向上させるために,技術指標や市場情勢指標を導入することを検討し,市場への参入,ストップ損失,利益を引き出す条件を最適化します.
  2. 最大保持期間を設定するには,市場変動とポジションの利益と損失に応じて動的に調整し,固定時間での閉店がもたらすオプションコストを回避できます.
  3. 横向市場の特徴については,横向の範囲突破やトレンド逆転の確認などの論理が追加され,頻繁な取引のコストを削減できます.
  4. ポジション管理と資本管理戦略を追加することを検討し,単一の取引のリスク暴露を制御し,資本利用の効率性と安定性を向上させる.

概要

Squeeze Backtest Transformer v2.0は,柔軟なパラメータ設定と多方向取引サポートを通じて異なる市場環境で取引できる絞り込み戦略に基づいた定量的な取引システムです.同時に,豊富なバックテスト期間設定オプションと利益とストップロスの設定は,ユーザーが歴史的なデータ分析とリスク管理を行うのに役立ちます.しかし,戦略のパフォーマンスはパラメータ設定によって大きく影響され,戦略の安定性と収益性を向上させるために市場特性と取引ニーズに基づいて最適化および改善する必要があります.将来,より多くの技術指標を導入し,最大保持時間を動的に調整し,横向戦略を最適化し,市場ポジションと資本管理を強化することを検討することができます.


/*backtest
start: 2023-04-22 00:00:00
end: 2024-04-27 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5

strategy(title="Squeeze Backtest by Shaqi v2.0", overlay=true, pyramiding=0, currency="USD", process_orders_on_close=true, commission_type=strategy.commission.percent, commission_value=0.075, default_qty_type=strategy.percent_of_equity, default_qty_value=100, initial_capital=100, backtest_fill_limits_assumption=0)
R0 = "6 Hours"
R1 = "12 Hours"
R2 = "24 Hours"
R3 = "48 Hours"
R4 = "1 Week"
R5 = "2 Weeks"
R6 = "1 Month"
R7 = "Maximum"

BL = "low"
BH = "high"
BO = "open"
BC = "close"
BHL= "mid (hl)"
BOC = "mid (oc)"

LONG = "LONG"
SHORT = "SHORT"

direction = input.string(title="Direction", defval=LONG, options=[LONG, SHORT], group="Squeeze Settings")
strategy.risk.allow_entry_in(direction == LONG ? strategy.direction.long : strategy.direction.short)
openPercent = input.float(1.4, "Open, %", minval=0.01, maxval=100, step=0.1, inline="Percents", group="Squeeze Settings") * 0.01
closePercent = input.float(0.6, "Close, %", minval=0.01, maxval=100, step=0.1, inline="Percents", group="Squeeze Settings") * 0.01
stopPercent = input.float(0.8, "Stop Loss, %", minval=0.01, maxval=100, step=0.1, inline="Percents", group="Squeeze Settings") * 0.01
isMaxBars = input.bool(true, "Max Bars To Sell", inline="MaxBars", group="Squeeze Settings")
maxBars = input.int(10, title="", minval=0, maxval=1000, step=1, inline="MaxBars", group="Squeeze Settings")
bind = input.string(BC, "Bind", options=[BL, BH, BO, BC, BHL, BOC], group="Squeeze Settings")
isRange = input.bool(true, "Fixed Range", inline="Range", group="Backtesting Period")
rangeStart = input.string(R2, "", options=[R0, R1, R2, R3, R4, R5, R6, R7], inline="Range", group="Backtesting Period")
periodStart = input(timestamp("12 Apr 2024 00:00 +0000"), "Backtesting Start", group="Backtesting Period")
periodEnd = input(timestamp("20 Apr 2024 00:00 +0000"), "Backtesting End", group="Backtesting Period")

int startDate = na
int endDate = na
if isRange
    if rangeStart == R0
        startDate := timenow - 21600000
        endDate := timenow
    else if rangeStart == R1
        startDate := timenow - 43200000
        endDate := timenow
    else if rangeStart == R2
        startDate := timenow - 86400000
        endDate := timenow
    else if rangeStart == R3
        startDate := timenow - 172800000
        endDate := timenow
    else if rangeStart == R4
        startDate := timenow - 604800000
        endDate := timenow
    else if rangeStart == R5
        startDate := timenow - 1209600000
        endDate := timenow
    else if rangeStart == R6
        startDate := timenow - 2592000000
        endDate := timenow
    else if rangeStart == R7
        startDate := time
        endDate := timenow
else 
    startDate := periodStart
    endDate := periodEnd
    
float bindOption = na
if bind == BL
    bindOption := low
else if bind == BH
    bindOption := high
else if bind == BO
    bindOption := open
else if bind == BC
    bindOption := close
else if bind == BHL
    bindOption := hl2
else
    bindOption := ohlc4

afterStartDate = (time >= startDate)
beforeEndDate = (time <= endDate)
periodCondition = true
notInTrade = strategy.position_size == 0
inTrade = strategy.position_size != 0

barsFromEntry = ta.barssince(strategy.position_size[0] > strategy.position_size[1])
entry = strategy.position_size[0] > strategy.position_size[1]
entryBar = barsFromEntry == 0
notEntryBar = barsFromEntry != 0
openLimitPrice = direction == LONG ? (bindOption - bindOption * openPercent) : (bindOption + bindOption * openPercent)

closeLimitPriceEntry = openLimitPrice * (direction == LONG ? 1 + closePercent : 1 - closePercent)
closeLimitPrice = strategy.position_avg_price * (direction == LONG ? 1 + closePercent : 1 - closePercent)

stopLimitPriceEntry = direction == LONG ? openLimitPrice - openLimitPrice * stopPercent : openLimitPrice + openLimitPrice * stopPercent
stopLimitPrice = direction == LONG ? strategy.position_avg_price - strategy.position_avg_price * stopPercent : strategy.position_avg_price + strategy.position_avg_price * stopPercent

if periodCondition and notInTrade
    strategy.entry(direction == LONG ? "BUY" : "SELL", direction == LONG ? strategy.long : strategy.short, limit = openLimitPrice, stop = stopLimitPriceEntry)
    strategy.exit("INSTANT", limit = closeLimitPriceEntry, stop = stopLimitPriceEntry, comment_profit = direction == LONG ? 'INSTANT SELL' : 'INSTANT BUY', comment_loss = 'INSTANT STOP')
if inTrade 
    strategy.cancel("INSTANT")
    strategy.exit(direction == LONG ? "SELL" : "BUY", limit = closeLimitPrice, stop = stopLimitPrice, comment_profit = direction == LONG ? "SELL" : "BUY", comment_loss = "STOP")
if isMaxBars and barsFromEntry == maxBars
    strategy.close_all(comment = "TIMEOUT STOP", immediately = true)



showStop = stopPercent <= 0.20

// plot(showStop ? stopLimitPrice : na, title="Stop Loss Limit Order", force_overlay=true, style=plot.style_linebr, color=#c50202, linewidth=1, offset=1)
// plot(closeLimitPrice, title="Take Profit Limit Order", force_overlay=true, style=plot.style_linebr, color = direction == LONG ? color.red : color.blue, linewidth=1, offset=1)
// plot(strategy.position_avg_price, title="Buy Order Filled Price", force_overlay=true, style=plot.style_linebr, color=direction == LONG ? color.blue : color.red, linewidth=1, offset=1)
plot(showStop ? stopLimitPrice : na, title="Stop Loss Limit Order", force_overlay=true, style=plot.style_linebr, color=#c50202, linewidth=1, offset=0)
plot(closeLimitPrice, title="Take Profit Limit Order", force_overlay=true, style=plot.style_linebr, color = direction == LONG ? color.red : color.blue, linewidth=1, offset=0)
plot(strategy.position_avg_price, title="Buy Order Filled Price", force_overlay=true, style=plot.style_linebr, color=direction == LONG ? color.blue : color.red, linewidth=1, offset=0)

plot(openLimitPrice, title="Trailing Open Position Limit Order", style=plot.style_stepline, color=color.new(direction == LONG ? color.blue : color.red, 30), offset=1)
plot(closeLimitPriceEntry, title="Trailing Close Position Limit Order", style=plot.style_stepline, color=color.new(direction == LONG ? color.red : color.blue, 80), offset=1)
plot(stopLimitPriceEntry, title="Trailing Stop Position Limit Order", style=plot.style_stepline, color=color.new(#c50202, 80), offset=1)



もっと