ドンチアン・チャネル・ブレイク・トレード・戦略

作者: リン・ハーンチャオチャン,日付: 2023年11月08日 12:31:56
タグ:

img

概要

ドンチアンチャネルブレークアウト・トレード戦略は,特定の期間の最高価格と最低価格のチャネルを計算し,チャネルブレークアウトに基づいて長期と短期を取引することによって,現在の価格動向を判断する.この戦略は,非常に不安定な株式と暗号通貨に適しています.

戦略の論理

この戦略は,過去の歴史期間の最高価格pcmaxと最低価格pcminを計算してチャネルを構築する.チャネルの上下レールの計算方法は:

上部レール yh = pcmax - (pcmax - pcmin) * (100 - %Dev)/100

下列 yl = pcmin + (pcmax - pcmin) * %Dev/100

%Dev は 13 に設定されています.

長信号は価格が上部レールを突破すると生成される.短信号は価格が下部レールを突破すると生成される.

トレーディング・シグナルを生成する具体的な論理は,

  1. boundup = high > yh 上部レールが壊れているかどうかを判断する

  2. bounddn = low < yl 下のレールが壊れているかどうかを判断する

  3. upsign = sma(bounddn, 2) == 1は,下列の持続的な突破を決定するためにbounddnのsmaを使用します

  4. dnsign = sma(boundup, 2) == 1は,上部レールの持続的なブレイクを決定するためにboundupのsmaを使用します

  5. 出口 = dnsign 上部レールの突破は出口信号を生成する

  6. exitdn = 上記信号 下列レールの突破が出路信号を生成する

  7. 下のレールの上信号の突破が長信号を生成した場合

  8. 上部レールのdnsign突破が短信号を生成した場合

戦略では,不要なオバーナイトポジションを避けるため,取引開始と終了時間を設定します.

戦略 の 利点

  1. ドンチアンチャネルを利用して 傾向を特定し バックテスト結果も良い

  2. 長い信号と短い信号の両方を有し,双方向取引を可能にします

  3. SMA を使ってシグナルをフィルタリングし,悪い取引を避ける.

  4. リスク制御のためのオプションストップ損失

  5. 取引開始および終了時間を設定し,一夜間のリスクを回避する

戦略 の リスク

  1. 履歴と%Devパラメータに敏感で,異なる製品に最適化する必要があります

  2. 範囲限定市場では誤った信号を生む可能性があります.

  3. オーダー管理を考慮しない,ライブ取引の収益性に影響を与える可能性がある

  4. ポジションのサイズ,オーバーサイズのポジションのリスクを考慮しない

  5. 資金管理を考慮しない 適正な取引資本が必要

改良 の アイデア

  1. 異なる製品のための履歴と% Devパラメータを最適化

  2. フィルターを追加して,市場範囲で誤った信号を避ける

  3. 単一の位置サイズを制御する位置サイズ化モジュールを追加する

  4. 総ポジションサイズを制限するためにマネー管理モジュールを追加

  5. オーダー管理を追加して,オーダーを最適に実行する

結論

ドンチアンチャネルブレイクアウト戦略は,トレンドと取引信号を決定するためにチャネルブレイクアウトを使用し,バックテストの結果が良好であり,ロングとショートの両方で取引する能力があります.しかし,パラメータ最適化,フィルター,ポジションサイズ,マネーマネジメント,オーダーマネジメントなどに関してリスクがあります.安定したライブ取引の前にこれらの分野での適切な改善が必要です.全体として,これは伝統的なトレンドフォロー戦略であり,最適化により信頼できる定量的な取引戦略になることができます.


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

////////////////////////////////////////////////////////////
//  Copyright by AlexInc v1.0 02/07/2018  @aav_1980
// PriceChannel strategy
// If you find this script helpful, you can also help me by sending donation to 
// BTC 16d9vgFvCmXpLf8FiKY6zsy6pauaCyFnzS
// LTC LQ5emyqNRjdRMqHPHEqREgryUJqmvYhffM
////////////////////////////////////////////////////////////
//@version=3
strategy("AlexInc PriceChannel Str", overlay=false)
history = input(20)
percentDev = input(13)
capital = input(100)

needlong = input(true, defval = true, title = "Long")
needshort = input(true, defval = true, title = "Short")
usestoploss = input(true, defval = true, title = "Stop Loss")
stoplossmult = input(3.8, defval = 3.8, minval = 1, maxval = 10, title = "Stop loss multiplicator")


fromyear = input(2018, defval = 2018, 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")

bodymin = min( open, close)
bodymax = max(open, close)

pcmax = highest(bodymax, history)
pcmin = lowest(bodymin, history)

yh = ((pcmax - pcmin) / 100 * (100 - percentDev)) + pcmin
yl = ((pcmax - pcmin) / 100 * percentDev) + pcmin

plot(pcmax)
plot(pcmin)
plot(yh)
plot(yl)

//1
bounddn = low < yl ? 1 : 0
boundup = high > yh ? 1 : 0
upsign = sma(bounddn, 2) == 1
dnsign = sma(boundup, 2) == 1
//2
//upsign = crossover(bodymin, yl)
//dnsign = crossunder(bodymax , yh)


exitup = dnsign
exitdn = upsign

lot = strategy.equity / close * capital / 100


xATR = atr(history)
nLoss = usestoploss ? stoplossmult * xATR : na

stop_level_long = 0.0
stop_level_long := nz(stop_level_long[1])

stop_level_short = 0.0
stop_level_short := nz(stop_level_short[1])

pos = strategy.position_size
if pos >0 and pos[1] <= 0 //crossover(pos, 0.5)
    stop_level_long = strategy.position_avg_price - nLoss
if pos < 0 and pos[1] >= 0 //crossunder(pos, -0.5)
    stop_level_short = strategy.position_avg_price + nLoss
if pos == 0    
    stop_level_long = bodymin - nLoss
    stop_level_short = bodymax + nLoss

//plot(bodymax + nLoss, color=red)
//plot(bodymin - nLoss, color=red)
plot(stop_level_long, color=red)
plot(stop_level_short, color=red)

if upsign
    strategy.entry("Long", strategy.long, needlong == false ? 0 : lot)

if dnsign
    strategy.entry("Short", strategy.short, needshort == false ? 0 : na)

if true
    strategy.close_all()


//if strategy.position_size != 0
//    strategy.exit("Exit Long", from_entry = "Long", stop = stop_level_long)
//    strategy.exit("Exit Short", from_entry = "Short", stop = stop_level_short)

もっと