ハル移動平均とWT指標のクロスオーバーに基づく取引戦略


作成日: 2023-09-26 20:00:32 最終変更日: 2023-09-26 20:00:32
コピー: 1 クリック数: 1000
1
フォロー
1617
フォロワー

概要

この戦略は,主にハル移動平均とWT指標の交差信号を融合させ,それぞれの指標の優位性を発揮し,トレンド判断と入場タイミングの選択においてより正確な決定を実現する.

戦略原則

この戦略は主にハル移動平均とWT指標の交差信号で構成されている.

ハル移動平均の部分では,短期および長期のハルMAを計算し,色を埋めることでトレンド方向を判断する.計算式は以下のとおりである.

短期ハルMA = WMA*WMA(n/2) - WMA(n), sqrt(n))

長期ハルMA=WMA (n/3)*3 - WMA(n/2), n/2)

WMAは重量移動平均である。短期線が長期線を横切るときは看板信号であり,そうでない場合は下落信号である。

WT指数部分では,WT指数の多空平均線を計算し,平均線の交差を観察することで入場を判断する.計算式は:

TCI = (Close - EMA(Close,n1)) / (k * STD(Close - EMA(Close,n1),n1))

WT1 = EMA(TCI,n2)

WT2 = SMA(WT1,m)

TCIは,価格と通路の中間線EMAの偏差を反映するトレンドコンポジットインデックスであり,WT1はTCIのEMA平滑値であり,WT2はWT1のSMA値であり,mは一般的には4である. WT1の上を通るときは多頭信号であり,WT2下を通るときは空頭信号である.

ハルMAのトレンド判断とWT指標の交差信号を組み合わせて,トレンド方向が正しい前提で場内に入ることができる.

優位分析

この戦略は,Hull MAとWT指標の優位性を統合して,以下の利点があります.

  1. Hull MAは,移動平均の計算方法を変更することで,価格変化のトレンドをより早く捉え,市場騒音を効果的に除し,トレンドを正確に判断することができます.

  2. WT指数は,チャネル内の価格変動特性を利用し,ターニングポイントを迅速に捕捉し,より正確な取引信号を発する.

  3. この2つを組み合わせて,トレンド判断と交差信号の両方を考慮して,トレンド面の強さと同時にリスクをコントロールできます.

  4. Hull MA平滑パラメータとWT指数パラメータは,カスタマイズされ,異なる品種特性と取引の好みに応じて調整・最適化することができる.

  5. Hull MAまたはWT指標の交差信号は単独で取引できるが,トレンド追跡と交差検証を兼ね備えた組み合わせでも利用できる.

  6. ストップ・ストップ・ストップの戦略を設定し,単一取引のリスクを効果的にコントロールできます.

リスク分析

この戦略には以下のリスクがあります.

  1. Hull MAとWTの指数は,価格を一定程度に曖昧に処理しており,少し遅れが起こり,入場時刻が正確でないことを引き起こしている.

  2. WT指数は多頭背と空頭背の偽信号を生じやすいため,トレンド判断と結合されない場合,取引リスクを高めます.

  3. パラメータ設定が不適切であることも取引結果に影響を与え,品種特性に応じて継続的にテスト・最適化が必要である.

  4. トレンドが揺れ動いている時に,ストップロスは頻繁にトリガーされ,取引に一定損失をもたらします.

リスクに対応するには,以下の方法で最適化および改善を行うことができます.

  1. Hull MAとWTのパラメータを調整し,最適なバランスポイントを見つけます.他の指標をHull MAと組み合わせてテストすることもできます.

  2. 傾向判断のメカニズムを増やし,WT指標が明確な傾向がないときに誤った信号を避ける.

  3. 回測と模擬取引を利用して最適なパラメータを特定し,合理的な止損幅を設定する.

  4. トレンドが不明な時は,ポジションの規模を小さくするか,一時的に取引をしない.

最適化の方向

この戦略は,以下の方向からさらに最適化できます.

  1. 異なる移動平均とWT指標の組み合わせをテストし,よりよいバランスポイントを探します.例えばKAMA,TEMAなどです.

  2. 波動指数やBollinger Bandsなどの他の指標を追加して意思決定の正確性を向上させる.

  3. 最適化パラメータ設定,回測と模擬により最適なパラメータ組み合わせを探す.パラメータ最適化プログラムを作成し,最適なパラメータを素早く探す.

  4. 移動停止,振動停止,近距離および遠距離停止などの停止策の最適化により,停止が誘発される確率を低減する.

  5. ポジション管理戦略を最適化し,トレンドが不確実なときに取引頻度とポジションの規模を主動的に削減し,リスクを軽減する.

  6. 機械学習などの高度な技術が追加され,よりスマートな取引決定とパラメータの自己適応が可能になります.

要約する

この戦略は,Hull MA平らな移動平均とWT指標の交差特性を統合し,傾向判断と交差検証の優位性を兼ねている.正しい方向を保証する前提で取引を行うと,リスクを効果的に制御することができる.最適化パラメータ設定,ストップ・ロスト戦略,ポジション管理などの方法によって,戦略の安定性と取引効果をさらに向上させることができる.他の指標判断とインテリジェント取引技術のラウンドは,将来の最適化方向でもある.全体的に言えば,この戦略は,シンプルで信頼性の高い,容易に最適化できる特性を有しており,実用的なトレンド追跡戦略である.

ストラテジーソースコード
/*backtest
start: 2023-08-26 00:00:00
end: 2023-09-25 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// WT CROSS @author [© LazyBear]
// © pigsq
// @version=5

strategy("Kahlman HullMA / WT Cross Strategy", overlay=true, default_qty_type=strategy.percent_of_equity, default_qty_value=100, initial_capital=100)

_1 = input(false, '───────── SP/TP SETTINGS ─────────')

stoploss1 = input(title='Stop Loss On/Off?', defval=true)
stoploss = input.float(5, "Stop Loss", minval = 1, step = 1)/100
takeprofit1 = input(title='Take Profit On/Off?', defval=true)
takeprofit = input.float(10, "Take Profit", minval = 1, step = 1)/100

_2 = input(false, '──────── WT CROSS SETTINGS ────────')

wtcross = input(title='WT Cross On/Off?', defval=true)
wtcross2 = input(title='Change WT Cross Method ( If WT Cross ON )', defval=false)

/// WT CROSS ///

n1 = input(10, 'Channel Length')
n2 = input(21, 'Average Length')

ap = hlc3
esa = ta.ema(ap, n1)
r = ta.ema(math.abs(ap - esa), n1)
ci = (ap - esa) / (0.015 * r)
tci = ta.ema(ci, n2)

wt1 = tci
wt2 = ta.sma(wt1, 4)

/// WT CROSS ///

/// HULL TREND WITH KAHLMAN ///

_3 = input(false, '──────── HULLMA SETTINGS ────────')

srchull = input(hl2, 'Source')
lengthhull = input(24, 'Lookback')
gain = input(10000, 'Gain')
kh = input(true, 'Use Kahlman')

hma(_srchull, _lengthhull) =>
    ta.wma((2 * ta.wma(_srchull, _lengthhull / 2)) - ta.wma(_srchull, _lengthhull), math.round(math.sqrt(_lengthhull)))

hma3(_srchull, _lengthhull) =>
    p = lengthhull / 2
    ta.wma(ta.wma(close, p / 3) * 3 - ta.wma(close, p / 2) - ta.wma(close, p), p)

kahlman(x, g) =>
    kf = 0.0
    dk = x - nz(kf[1], x)
    smooth = nz(kf[1], x) + dk * math.sqrt(g / 10000 * 2)
    velo = 0.0
    velo := nz(velo[1], 0) + g / 10000 * dk
    kf := smooth + velo
    kf

a = kh ? kahlman(hma(srchull, lengthhull), gain) : hma(srchull, lengthhull)
b = kh ? kahlman(hma3(srchull, lengthhull), gain) : hma3(srchull, lengthhull)
c = b > a ? color.lime : color.red
crossdn = a > b and a[1] < b[1]
crossup = b > a and b[1] < a[1]

p1hma = plot(a, color=c, linewidth=1, title='Long Plot', transp=75)
p2hma = plot(b, color=c, linewidth=1, title='Short Plot', transp=75)
fill(p1hma, p2hma, color=c, title='Fill', transp=55)

/// HULL TREND WITH KAHLMAN ///

/// DATE ///

_4 = input(false, '───────── DATE SETTINGS ─────────')

FromMonth = input.int(defval=1, title='From Month', minval=1, maxval=12)
FromDay = input.int(defval=1, title='From Day', minval=1, maxval=31)
FromYear = input.int(defval=999, title='From Year', minval=999)
ToMonth = input.int(defval=1, title='To Month', minval=1, maxval=12)
ToDay = input.int(defval=1, title='To Day', minval=1, maxval=31)
ToYear = input.int(defval=9999, title='To Year', minval=999)
start = timestamp(FromYear, FromMonth, FromDay, 00, 00)
finish = timestamp(ToYear, ToMonth, ToDay, 23, 59)
window() =>
    time >= start and time <= finish ? true : false

/// DATE ///

/// LONG/SHORT CONDITION ///

longCondition = crossup and ta.crossover(wt1,wt2)
longCondition1 = crossup
longCondition2 = crossup and wt1 > wt2

if (wtcross == true ? longCondition : wtcross == false ? longCondition1:na)
    strategy.entry("LONG", strategy.long, when=window(), comment="Enter Long")
else if (wtcross2 == true ? longCondition2 : wtcross2 == false ? longCondition:na)
    strategy.entry("LONG", strategy.long, when=window(), comment="Enter Long")
    
shortCondition = crossdn and ta.crossunder(wt1,wt2)
shortCondition1 = crossdn
shortCondition2 = crossdn and wt1 < wt2

if (wtcross == true ? shortCondition : wtcross == false ? shortCondition1:na)
    strategy.entry("SHORT", strategy.short, when=window(), comment="Enter Short")
else if (wtcross2 == true ? shortCondition2 : wtcross2 == false ? shortCondition:na)
    strategy.entry("LONG", strategy.long, when=window(), comment="Enter Short")

/// LONG/SHORT CONDITION ///

/// CLOSE STRATEGY ///

strategy.close("LONG", when=wtcross == true ? shortCondition : wtcross == false ? shortCondition1:na, comment = "Close Long")
strategy.close("SHORT", when=wtcross == true ? longCondition : wtcross == false ? longCondition1:na, comment = "Close Short")

/// EXIT STRATEGY ///

strategy.exit("LONG", when=strategy.position_size > 0, stop=stoploss1 == true ? strategy.position_avg_price * (1 - stoploss):na, limit=takeprofit1 == true ? strategy.position_avg_price * (1 + takeprofit):na, comment="Exit Long")
strategy.exit("SHORT", when=strategy.position_size < 0, stop=stoploss1 == true ? strategy.position_avg_price * (1 + stoploss):na, limit=takeprofit1 == true ? strategy.position_avg_price * (1 - takeprofit):na, comment ="Exit Short")

/// LONG SL/TP LINE ///

plot(strategy.position_size > 0 ? strategy.position_avg_price * (1 - stoploss) : na, title='Long Stop Loss', color=stoploss1 == true ? color.new(color.red, 0):na, style=plot.style_linebr)
plot(strategy.position_size > 0 ? strategy.position_avg_price * (1 + takeprofit) : na, title='Long Take Profit', color=takeprofit1 == true ? color.new(color.green, 0):na, style=plot.style_linebr)

/// LONG SL/TP LINE ///

/// SHORT SL/TP LINE ///

plot(strategy.position_size < 0 ? strategy.position_avg_price * (1 + stoploss) : na, title='Short Stop Loss', color=stoploss1 == true ? color.new(color.red, 0):na, style=plot.style_linebr)
plot(strategy.position_size < 0 ? strategy.position_avg_price * (1 - takeprofit) : na, title='Short Take Profit', color=takeprofit1 == true ? color.new(color.green, 0):na, style=plot.style_linebr)

/// SHORT SL/TP LINE ///