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

五倍強い移動平均戦略

作者: リン・ハーンチャオチャン,日付: 2024年5月23日 18:14:35
タグ:エイマWMASMATMAVARWWMAZLEMATSF

img

概要

Quintuple Strong Moving Average戦略は,複数の移動平均値に基づいた取引戦略である.この戦略は,市場における強いトレンドを特定するために,異なるタイムフレームとタイプの5つの移動平均値を使用する.最初の3つの移動平均値は,主にトレンド識別と信号生成に使用される戦略のコアコンポーネントであり,第4および第5の移動平均値は主に補助判断と視覚分析に使用される.

この戦略は,異なる時間枠とタイプの移動平均の動向と相対的ポジション関係を包括的に考慮することで,市場の現在の動向方向と強さを正確に決定し,傾向の変化に応じてポジションを適時に調整し,良い収益性を達成することができます.

戦略原則

この戦略は,異なる時間枠とタイプの5つの移動平均を使用します.

  1. レベル 1 移動平均値: 設定可能な表示,ラベル,データソース,時間枠,長さ,行幅,色,タイプ
  2. レベル2移動平均値:可変表示,ラベル,データソース,時間枠,長さ,行幅,色,タイプ
  3. レベル3 移動平均値: 設定可能な表示,ラベル,データソース,時間枠,長さ,行幅,色,タイプ
  4. レベル4移動平均:主に補助判断,カスタマイズ可能な表示,ラベル,データソース,時間枠,長さ,行幅,色に使用されます.
  5. レベル5移動平均:主に補助判断,カスタマイズ可能な表示,ラベル,データソース,時間枠,長さ,行幅,色に使用されます.

この5つの移動平均値のタイプは,SMA,EMA,WMA,TMA,VAR,WWMA,ZLEMA,TSFなど8つのタイプを柔軟に設定できます.

この戦略の基本理念は,異なるタイムフレームとタイプの移動平均の複数のトレンド確認を使用して,トレンドの方向性と強さを決定することです.

  • 閉じる価格がレベル1,2,3の移動平均値を超えると,ロングする.
  • 閉じる価格がレベル1,2,3の移動平均値を下回る場合,ショートにします.
  • ロングポジションを保持する際に,閉じる価格がレベル1とレベル2の移動平均値を下回る場合は,ロングを閉じる.
  • ショートポジションを保持する際に,閉じる価格がレベル1とレベル2の移動平均値を超えると,ショートポジションを閉じる.

この戦略では,現在の位置に応じてキャンドルスタイルの色を表示します.

  • ロングポジションを保持するときは,キャンドルスタイクが緑色です.
  • ショートポジションを保持するとき,キャンドルスタイクは赤色です.
  • 他の場合は灰色です

戦略 の 利点

  1. 強いトレンド追跡能力.この戦略は,トレンドを決定するために複数の中期および長期間の移動平均を組み合わせ,主要な市場トレンドを効果的に把握できる強力なトレンド認識能力を使用します.
  2. 柔軟な調整可能なパラメータ.この戦略のパラメータは,移動平均の種類,時間枠,長さなど,柔軟に設定され,異なる市場特性と投資家好みに応じて最適化することができます.
  3. 複数の市場への適応性.この戦略の動向判断は,主に価格動向自体に基づいており,市場に強い適応性があり,株式,先物,外貨,暗号通貨など複数の市場で使用できます.
  4. シンプルで明快な論理 この戦略の基本論理は単純で明快で 複雑すぎる数学モデルを必要とせず 分かりやすく実行できます

戦略リスク

  1. この戦略は一般的にレンジバインド市場で実行され,少額の損失を伴う取引が多くなり,純利益が減少する可能性があります.
  2. パラメータ最適化リスク.この戦略は多くのパラメータを使用する.十分な歴史的データバックテストとパラメータ最適化が行われなければ,将来のライブ取引でより大きな引き下げにつながる可能性があります.
  3. トレンド逆転リスク.この戦略は主にトレンド市場に適しています.市場トレンドが逆転すると,この戦略は元のトレンド方向で取引を続け,損失を引き起こす可能性があります.

上記のリスクを軽減するために,次の改善を検討できます.

  1. 範囲限定の市場検出と判断ロジックを追加して,トレンドではない市場で取引の数を減らす.
  2. この戦略で十分なパラメータ最適化テストを行い,堅牢な最適なパラメータ組み合わせを見つけます.
  3. 単一の取引の最大リスクを制御するために,合理的なストップロスのレベルを設定する.同時に,他の指標またはシグナルを使用して,トレンド逆転を確認し,ポジションを間に合うように調整することができます.

戦略の最適化方向

  1. 傾向判断の正確性を向上させるために,MACD,DMIなど,より多くの傾向確認指標を導入する.
  2. レンジバインド市場では,グリッド取引などのレンジバインド市場に適応できるオペレーティングロジックを導入することを検討する.
  3. 異なる市場特性を考慮して,適応性を向上させるために,戦略のパラメータを個別に最適化する.
  4. この戦略を他の戦略,例えばトレンド戦略 + レンジバインド戦略,トレンド戦略 + 対トレンド戦略の組み合わせなどと組み合わせることを検討し,戦略の信頼性を向上させる.

概要

クインチプル・ストロング・ムービング・平均戦略は,複数のトレンド確認に基づく取引戦略である.さまざまなタイムフレームやタイプのムービング・平均値のトレンドと相対ポジション関係を包括的に検討することで,市場の現在のトレンド方向と強さを比較的正確に決定し,トレンドの変化に応じてポジションを適時に調整することができる.戦略論理はシンプルで明確で,パラメータは柔軟で調整可能で,複数の市場に適応できる.しかし,一般的にインバウンド・レンジ市場を実行し,特定のパラメータ最適化リスクとインバウンド・トレンド逆転リスクがある.将来,より多くの指標を導入し,パラメータを最適化し,レンジ市場のためのオペレーティングロジックを追加し,この戦略の安定性と収益性をさらに向上させるために他のタイプの戦略と組み合わせることを検討することができます.


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

//@version=5
strategy("Quintuple Strong Moving Average Strategy","QuisMa", overlay=true, margin_long=100, margin_short=100)

// 1
mav1_show = input.bool(true, 'Show Plot', group='Level 1 ', inline='mav1_0')
mav1_label = input.bool(true, 'Show Label', group='Level 1 ', inline='mav1_0')
mav1_source = input.source(close, '', group='Level 1 ', inline='mav1_1')
mav1_timeframe = input.timeframe('5', '', group='Level 1 ', inline='mav1_1')
mav1_length = input.int(50, 'Length', group='Level 1 ', inline='mav1_3')
mav1_size = input.int(2000, 'Size', minval=1, group='Level 1 ', inline='mav1_3')
mav1_width = input.int(2, '', minval=0, group='Level 1 ', inline='mav1_2')
mav1_color = input.color(color.new(#ffd000, 0), '', group='Level 1 ', inline='mav1_2')
mav1_type = input.string(title='Moving Average Type 1', defval='VAR', options=['SMA', 'EMA', 'WMA', 'TMA', 'VAR', 'WWMA', 'ZLEMA', 'TSF'])

// 2
mav2_show = input.bool(true, 'Show Plot', group='Level 2', inline='mav2_0')
mav2_label = input.bool(true, 'Show Label', group='Level 2', inline='mav2_0')
mav2_source = input.source(close, '', group='Level 2', inline='mav2_1')
mav2_timeframe = input.timeframe('30', '', group='Level 2', inline='mav2_1')
mav2_length = input.int(50, 'Length', group='Level 2', inline='mav2_3')
mav2_size = input.int(2000, 'Size', minval=1, group='Level 2', inline='mav2_3')
mav2_width = input.int(2, '', minval=0, group='Level 2', inline='mav2_2')
mav2_color = input.color(color.new(#ffd000, 0), '', group='Level 2', inline='mav2_2')
mav2_type = input.string(title='Moving Average Type 2', defval='VAR', options=['SMA', 'EMA', 'WMA', 'TMA', 'VAR', 'WWMA', 'ZLEMA', 'TSF'])

// 3
mav3_show = input.bool(true, 'Show Plot', group='Level 3', inline='mav3_0')
mav3_label = input.bool(true, 'Show Label', group='Level 3', inline='mav3_0')
mav3_source = input.source(close, '', group='Level 3', inline='mav3_1')
mav3_timeframe = input.timeframe('60', '', group='Level 3', inline='mav3_1')
mav3_length = input.int(50, 'Length', group='Level 3', inline='mav3_3')
mav3_size = input.int(2000, 'Size', minval=1, group='Level 3', inline='mav3_3')
mav3_width = input.int(2, '', minval=0, group='Level 3', inline='mav3_2')
mav3_color = input.color(color.new(#ffd000, 0), '', group='Level 3', inline='mav3_2')
mav3_type = input.string(title='Moving Average Type 3', defval='VAR', options=['SMA', 'EMA', 'WMA', 'TMA', 'VAR', 'WWMA', 'ZLEMA', 'TSF'])

// 4
mav4_show = input.bool(true, 'Show Plot', group='Level 4', inline='mav4_0')
mav4_label = input.bool(true, 'Show Label', group='Level 4', inline='mav4_0')
mav4_source = input.source(close, '', group='Level 4', inline='mav4_1')
mav4_timeframe = input.timeframe('480', '', group='Level 4', inline='mav4_1')
mav4_length = input.int(50, 'Length', group='Level 4', inline='mav4_3')
mav4_size = input.int(2000, 'Size', minval=1, group='Level 4', inline='mav4_3')
mav4_width = input.int(2, '', minval=0, group='Level 4', inline='mav4_2')
mav4_color = input.color(color.new(#ffd000, 0), '', group='Level 4', inline='mav4_2')
mav4_type = input.string(title='Moving Average Type 4', defval='VAR', options=['SMA', 'EMA', 'WMA', 'TMA', 'VAR', 'WWMA', 'ZLEMA', 'TSF'])

// 5
mav5_show = input.bool(true, 'Show Plot', group='Level 5', inline='mav5_0')
mav5_label = input.bool(true, 'Show Label', group='Level 5', inline='mav5_0')
mav5_source = input.source(close, '', group='Level 5', inline='mav5_1')
mav5_timeframe = input.timeframe('720', '', group='Level 5', inline='mav5_1')
mav5_length = input.int(50, 'Length', group='Level 5', inline='mav5_3')
mav5_size = input.int(2000, 'Size', minval=1, group='Level 5', inline='mav5_3')
mav5_width = input.int(2, '', minval=0, group='Level 5', inline='mav5_2')
mav5_color = input.color(color.new(#ffd000, 0), '', group='Level 5', inline='mav5_2')
mav5_type = input.string(title='Moving Average Type 5', defval='VAR', options=['SMA', 'EMA', 'WMA', 'TMA', 'VAR', 'WWMA', 'ZLEMA', 'TSF'])


// FUNCTIONS {{{
candle_size_ms = time - time[1]  // milliseconds of a candle

timetostring(tms) =>
    d_ = math.floor(tms / 86400)
    h_ = math.floor((tms - d_ * 86400) / 3600)
    m_ = math.floor((tms - d_ * 86400 - h_ * 3600) / 60)
    s_ = math.floor(tms - d_ * 86400 - h_ * 3600 - m_ * 60)
    ret = d_ > 0 ? str.tostring(d_) + ' D ' : ''
    ret += (h_ > 0 ? str.tostring(h_) + ' H ' : '')
    ret += (m_ > 0 ? str.tostring(m_) + ' m ' : '')
    if d_ == 0
        ret += (s_ > 0 ? str.tostring(s_) + ' s ' : '')
        ret
    ret

tftostring(tf) =>
    tfa = str.split(tf, '')
    tfalast = array.get(tfa, array.size(tfa) - 1)
    tfalastIsNum = na(str.tonumber(tfalast)) ? false : true
    txt = tfalastIsNum ? timetostring(str.tonumber(tf) * 60) : tf
    txt

htfLabel(htfy, tf, col) =>
    txt = tftostring(tf)
    htftxt = 'ᐊ ' + txt
    htftip = 'HTF  [ ' + txt + ' ] ' + str.tostring(htfy, '#.##')
    label.new(x=time + candle_size_ms * 2, y=htfy, xloc=xloc.bar_time, yloc=yloc.price, color=color.new(color.black, 100), textcolor=col, style=label.style_label_left, size=size.normal, text=htftxt, tooltip=htftip)

// Moving Averages Functions {{{
Var_Func(src, length) =>
    valpha = 2 / (length + 1)
    vud1 = src > src[1] ? src - src[1] : 0
    vdd1 = src < src[1] ? src[1] - src : 0
    vUD = math.sum(vud1, 9)
    vDD = math.sum(vdd1, 9)
    vCMO = nz((vUD - vDD) / (vUD + vDD))
    VAR = 0.0
    VAR := nz(valpha * math.abs(vCMO) * src) + (1 - valpha * math.abs(vCMO)) * nz(VAR[1])
    VAR

Wwma_Func(src, length) =>
    wwalpha = 1 / length
    WWMA = 0.0
    WWMA := wwalpha * src + (1 - wwalpha) * nz(WWMA[1])
    WWMA

Zlema_Func(src, length) =>
    zxLag = length / 2 == math.round(length / 2) ? length / 2 : (length - 1) / 2
    zxEMAData = src + src - src[zxLag]
    ZLEMA = ta.ema(zxEMAData, length)
    ZLEMA

Tsf_Func(src, length) =>
    lrc = ta.linreg(src, length, 0)
    lrc1 = ta.linreg(src, length, 1)
    lrs = lrc - lrc1
    TSF = ta.linreg(src, length, 0) + lrs
    TSF

getMA(src, length, mav_type) =>
    ma = 0.0
    if mav_type == 'SMA'
        ma := ta.sma(src, length)
    if mav_type == 'EMA'
        ma := ta.ema(src, length)
    if mav_type == 'WMA'
        ma := ta.wma(src, length)
    if mav_type == 'TMA'
        ma := ta.sma(ta.sma(src, math.ceil(length / 2)), math.floor(length / 2) + 1)
    if mav_type == 'VAR'
        ma := Var_Func(src, length)
    if mav_type == 'WWMA'
        ma := Wwma_Func(src, length)
    if mav_type == 'ZLEMA'
        ma := Zlema_Func(src, length)
    if mav_type == 'TSF'
        ma := Tsf_Func(src, length)
    ma

mav1 = request.security(syminfo.tickerid, mav1_timeframe, getMA(mav1_source, mav1_length, mav1_type), gaps=barmerge.gaps_off, lookahead=barmerge.lookahead_on)
plot(mav1_show ? mav1 : na, 'mav 1', color=mav1_color, linewidth=mav1_width, show_last=mav1_size)
var label mav1lbl = na
label.delete(mav1lbl)
mav1lbl := mav1_label ? htfLabel(mav1, mav1_timeframe, mav1_color) : na

mav2 = request.security(syminfo.tickerid, mav2_timeframe, getMA(mav2_source, mav2_length, mav2_type), gaps=barmerge.gaps_off, lookahead=barmerge.lookahead_on)
plot(mav2_show ? mav2 : na, 'mav 2', color=mav2_color, linewidth=mav2_width, show_last=mav2_size)
var label mav2lbl = na
label.delete(mav2lbl)
mav2lbl := mav2_label ? htfLabel(mav2, mav2_timeframe, mav2_color) : na

mav3 = request.security(syminfo.tickerid, mav3_timeframe, getMA(mav3_source, mav3_length, mav3_type), gaps=barmerge.gaps_off, lookahead=barmerge.lookahead_on)
plot(mav3_show ? mav3 : na, 'mav 3', color=mav3_color, linewidth=mav3_width, show_last=mav3_size)
var label mav3lbl = na
label.delete(mav3lbl)
mav3lbl := mav3_label ? htfLabel(mav3, mav3_timeframe, mav3_color) : na

mav4 = request.security(syminfo.tickerid, mav4_timeframe, getMA(mav4_source, mav4_length, mav4_type), gaps=barmerge.gaps_off, lookahead=barmerge.lookahead_on)
plot(mav4_show ? mav4 : na, 'mav 4', color=mav4_color, linewidth=mav4_width, show_last=mav4_size)
var label mav4lbl = na
label.delete(mav4lbl)
mav4lbl := mav4_label ? htfLabel(mav4, mav4_timeframe, mav4_color) : na

mav5 = request.security(syminfo.tickerid, mav5_timeframe, getMA(mav5_source, mav5_length, mav5_type), gaps=barmerge.gaps_off, lookahead=barmerge.lookahead_on)
plot(mav5_show ? mav5 : na, 'mav 5', color=mav5_color, linewidth=mav5_width, show_last=mav5_size)
var label mav5lbl = na
label.delete(mav5lbl)
mav5lbl := mav5_label ? htfLabel(mav5, mav5_timeframe, mav5_color) : na

// Alış ve Satış Koşulları
alisKosulu = close > mav1 and close > mav2 and close > mav3
satisKosulu = close < mav1 and close < mav2 and close < mav3

// Alış ve Satış Sinyalleri
if (alisKosulu and not satisKosulu)
    strategy.entry("Alış", strategy.long)
if (satisKosulu and not alisKosulu)
    strategy.entry("Satış", strategy.short)

// Pozisyonları Kapatma Koşulları
if (strategy.opentrades > 0)
    if (close < mav1 and close < mav2 and strategy.position_size > 0)
        strategy.close("Alış")
    if (close > mav1 and close > mav2 and strategy.position_size < 0)
        strategy.close("Satış")

// Mum Rengi Ayarlama
longKosul = strategy.opentrades > 0 and strategy.position_size > 0
shortKosul = strategy.opentrades > 0 and strategy.position_size < 0

barcolor(longKosul ? color.green : shortKosul ? color.red : color.gray)


関連性

もっと