ドンチアン・チャネルに基づく亀貿易戦略

作者: リン・ハーンチャオチャン,日付: 2024-02-26 14:35:02
タグ:

img

概要

タンアンキ・タートル・トレーディング・ストラテジーは,オリジナルのタートル・トレーディング・ストラテジーの非常に簡素化されたバージョンである.これはオリジナルのタートル・戦略とは非常に異なります.この戦略は,高速チャンネルとスローチャンネルという2つのドンチアンチャネルを使用しています.チャネル期間はユーザーによって設定され,高速チャンネルには20バー,スローチャンネルには50バーのデフォルト値があります.この戦略は,スローチャネルの上下帯をエントリー取引に,高速チャネルの中帯をストップ損失設定に利用します.

戦略の論理

この戦略の基本的な論理は

  1. 速いドンキアンチャネルを計算します 上部帯は過去高速バーの最高高,下部帯は最低低,中間帯は上部帯と下部帯の平均です

  2. スロードンキアンチャネルを計算します 上部帯は過去スローバーの最高高,下部帯は最低低です

  3. ポジションがない場合,価格がスローチャネルの上帯に触るとロング信号が発動し,価格がスローチャネルの下帯に触るとショート信号が発動します.

  4. ポジションを開いた後,高速チャネルの中央帯はストップ・ロストとして使用されます.

  5. 保持期間中に開示信号に逆の信号がある場合,ポジションを閉じる.

利点分析

この戦略の利点は次のとおりです.

  1. ドンチアンチャネルと移動ストップ損失は,理解しやすい,初心者向けに適しています.

  2. 設定可能なパラメータ:ユーザーは,異なる市場環境に適応するために,取引製品とタイムフレームに基づいてパラメータを調整できます.

  3. 矛盾する取引信号は少ない.チャネル帯の価格ブレイクのみに依存し,一般的な指標からの誤った信号を避けます.

  4. 自動ストップ損失管理. 移動ストップ損失は,高速チャネルの中間帯に基づいて,単一の取引での損失を制限することができます.

リスク分析

この戦略に伴うリスクは以下のとおりです.

  1. トレンドが不明確である場合,ストップロスは増加します.これは戦略の収益性に影響します.

  2. トレンドが逆転すると 前回のトレンド方向での浮動利益は損失になります

  3. 不適切なパラメータ設定は過度に攻撃的または過度に保守的になる. 適切な値は繰り返しバックテストによって発見する必要があります.

  4. 自動取引への高い依存度.自動取引に失敗につながる例外を避けるためにサーバーの安定性が重要です.

上記のリスクを軽減するために,パラメータを最適化し,ポジションサイズを適切に制限し,リスク管理モジュールを追加することができます.

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

戦略は以下の点で改善できる:

  1. トレンド逆転の信号を捕まえないようにエントリー信号のフィルターを追加します.例えば,トレンド指針を使用してトレンド方向を決定します.

  2. チャンネル期間やポジションサイズなどのパラメータを最適化して,異なる取引手段に適したものにします.

  3. リスク管理モジュールを追加します. 最大引き上げ制限や日々の損失制限など,極端な事態で過度の損失を防ぐためです.

  4. ストップ・ロスの戦略を改善する.例えば,ストップを市場動向に適応させるためにストップ・ロスを採用する.

結論

概要すると,タンアンキ・タートル・トレーディング・ストラテジー (Tang Anqi Turtle Trading Strategy) は,シンプルなトレンドフォローシステムである.その利点は理解しやすさと自動化にある.しかし,特定のリスクも伴う.より実用化するために,パラメータとリスク管理のさらなる最適化が必要である.パラメータチューニング,フィルター追加,リスク制御モジュールなどの措置により,戦略はライブトレーディングでより良い結果を達成することができる.


/*backtest
start: 2024-01-26 00:00:00
end: 2024-02-15 00:00:00
period: 4h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//Noro
//2020

//@version=4
strategy("Noro's SimpleTurtle Strategy", shorttitle = "SimpleTurtle str", overlay = true, default_qty_type = strategy.percent_of_equity, initial_capital = 100, default_qty_value = 100, commission_value = 0.1)

//Settings
needlong  = input(true, defval = true, title = "Long")
needshort = input(true, defval = true, title = "Short")
sizelong  = input(100, defval = 100, minval = 1, maxval = 10000, title = "Lot long, %")
sizeshort = input(100, defval = 100, minval = 1, maxval = 10000, title = "Lot short, %")
fast      = input(20, minval=1)
slow      = input(50, minval=1)
showof    = input(true, defval = true, title = "Show offset")
showll    = input(true, defval = true, title = "Show lines")
showdd    = input(false, defval = true, title = "Show label (drawdown)")
showbg    = input(true, defval = true, title = "Show background")
fromyear  = input(1900, defval = 1900, minval = 1900, maxval = 2100, title = "From Year")
toyear    = input(2100, defval = 2100, minval = 1900, maxval = 2100, title = "To Year")
frommonth = input(01, defval = 01, minval = 01, maxval = 12, title = "From Month")
tomonth   = input(12, defval = 12, minval = 01, maxval = 12, title = "To Month")
fromday   = input(01, defval = 01, minval = 01, maxval = 31, title = "From day")
today     = input(31, defval = 31, minval = 01, maxval = 31, title = "To day")

//Donchian price channel fast
hf = highest(high, fast)
lf = lowest(low, fast)
center = (hf + lf) / 2

//Donchian price chennal slow
hs = highest(high, slow)
ls = lowest(low, slow)

//Lines
colorpc = showll ? color.blue : na
colorsl = showll ? color.red : na
offset = showof ? 1 : 0
plot(hs, offset = offset, color = colorpc)
plot(ls, offset = offset, color = colorpc)
plot(center, offset = offset, color = colorsl)

//Background
size = strategy.position_size
colorbg = showbg == false ? na : size > 0 ? color.lime : size < 0 ? color.red : na
bgcolor(colorbg, transp = 70)

//Orders
truetime = true
lotlong = 0.0
lotshort = 0.0
lotlong := size != size[1] ? strategy.equity / close * sizelong / 100 : lotlong[1]
lotshort := size != size[1] ? strategy.equity / close * sizeshort / 100 : lotshort[1]

//Orders
strategy.entry("Long", strategy.long, lotlong, stop = hs, when = needlong and strategy.position_size == 0 and truetime)
strategy.entry("Short", strategy.short, lotshort, stop = ls, when = needshort and strategy.position_size == 0 and truetime)
strategy.exit("Long", stop = center, when = needlong and strategy.position_size > 0)
strategy.exit("Short", stop = center, when = needshort and strategy.position_size < 0)
if true
    strategy.close_all()
    strategy.cancel("fast L")
    strategy.cancel("fast S")
    strategy.cancel("slow L")
    strategy.cancel("slow S")
    
if showdd

    //Drawdown
    max = 0.0
    max := max(strategy.equity, nz(max[1]))
    dd = (strategy.equity / max - 1) * 100
    min = 100.0
    min := min(dd, nz(min[1]))
    
    //Label
    min := round(min * 100) / 100
    labeltext = "Drawdown: " + tostring(min) + "%"
    var label la = na
    label.delete(la)
    tc = min > -100 ? color.white : color.red
    osx = timenow + round(change(time)*10)
    osy = highest(100)
    la := label.new(x = osx, y = osy, text = labeltext, xloc = xloc.bar_time, yloc = yloc.price, color = color.black, style = label.style_labelup, textcolor = tc)

もっと