双 EMA クロスオーバー トレンド トラッキング 戦略

作者: リン・ハーンチャオチャン,日付: 2024-02-29 11時45分42秒
タグ:

img

概要

ダブルEMAクロスオーバートレンドトラッキング戦略は,価格トレンド方向を決定するためにダブルEMA指標を使用する定量的な取引戦略である.この戦略は,異なるパラメータを持つ2つのEMA指標を計算し,価格トレンドを判断するためにゴールデンクロスとデッドクロスシグナルを組み合わせる.短い期間のEMAが長い期間のEMAを超えると購入信号,短い期間のEMAが長い期間のEMAを下回ると販売信号を生成する.

戦略の論理

この戦略の主な指標は,より長いサイクルEMA1とより短いサイクルEMA2を含む2つのEMAセットである.EMA1パラメータは21であり,EMA2パラメータは10である.この戦略は,4時間のサイクルに基づいてこれらの2つのEMAを計算する.

短いサイクルEMA2が長いサイクルEMA1を横切ると,購入信号が生成される.これは,短期的な価格傾向が強化され,上昇傾向が始まっていることを示唆する.短いサイクルEMA2が長いサイクルEMA1を下回ると,販売信号が生成される.これは,短期的な価格上昇傾向が中断され,下落傾向が始まっていることを示唆する.

誤ったシグナルをフィルタリングするために,戦略は2つのセットの黄金十字と死十字指標を設定します. 両セットの指標が同じ信号を出したときのみシグナルが起動し,価格変動によるエラーを効果的に削減できます.

利点分析

  • 双重EMA構造は,短期・中期トレンドの変化を効果的に把握し,トレンドを決定することができます.

  • 黄金十字と死十字の指標の2つのセットの追加フィルタリングは,誤った信号を削減し,価格変動による不必要な取引を回避することができます.

  • 指標を計算するために4時間のレベルを使用することで,高周波の価格変動に対応できます.

  • 戦略構造は単純で明確で,理解し実行しやすいもので,定量的な取引アプリケーションに適しています.

リスク分析

  • EMAの二重構造は,統合市場を判断する際の効果が低い.長期間の統合は,誤った信号を生む可能性があります.

  • 4時間のレベルインジケーターは突然の出来事に対応するのに十分敏感ではありません.突然のニュースは4時間以内に大きな動きを引き起こし,リスクを効果的に制御することはできません.

  • 戦略は,基本的分析を組み合わせることなく,技術指標のみをベースにしている.企業の基本面に大きな変化が起これば,技術指標は失敗する可能性があります.

これらのリスクは以下で制御できます.

  1. モデル組み合わせを確立するために,時間周期 EMA 指標を追加します.

  2. テキスト・センチメント分析を使って 突発的な重大事件を特定し ポジションを動的に調整します

  3. 経済環境,政策,企業基本面の変化を関連付け,パラメータを動的に調整する.

最適化

戦略はさらに最適化できます.

  1. モデル組み合わせを追加する.戦略の安定性を高めるために,異なるパラメータを持つより多くの指標組み合わせを確立することができます.

  2. ストップ・ロスのメカニズムを追加します.合理的なストップ・ロスのポイントは単一の損失を効果的に制御できます.

  3. ダイナミックパラメータ最適化. EMAパラメータは,異なる市場環境に基づいて自動的に最適化することができます.

  4. 機械学習技術を組み込む.テンソルフローのようなモデルをリアルタイムで価格動向を分類するように訓練することができます.

結論

双 EMA 黄金クロスデッドクロストレンドトラッキング戦略は,シンプルで実践的なトレンドトレード戦略である. 双 EMA インディケーターを使用して,指向的な市場機会を把握するために短期および中期価格トレンドを決定する. 同時に,二つのセットの黄金クロスとデッドクロスフィルタリングインディケーターを組み合わせることで,誤ったトレードを減らすことができる. 戦略はシンプルな構造を持ち,実装が簡単で,定量的な取引アプリケーションに適している. 継続的な最適化と改善を通じて,戦略の利点をさらに拡大し,安定した収益性を向上させる可能性がある.


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

//@version=3


/// Component Code Startt
testStartYear = input(2017, "Backtest Start Year")
testStartMonth = input(01, "Backtest Start Month")
testStartDay = input(1, "Backtest Start Day")
testPeriodStart = timestamp(testStartYear,testStartMonth,testStartDay,0,0)

testStopYear = input(2020, "Backtest Stop Year")
testStopMonth = input(1, "Backtest Stop Month")
testStopDay = input(1, "Backtest Stop Day")
testPeriodStop = timestamp(testStopYear,testStopMonth,testStopDay,0,0)

// A switch to control background coloring of the test period
testPeriodBackground = input(title="Color Background?", type=bool, defval=false)
testPeriodBackgroundColor = testPeriodBackground and (time >= testPeriodStart) and (time <= testPeriodStop) ? #00FF00 : na
bgcolor(testPeriodBackgroundColor, transp=97)

testPeriod() => true
// Component Code Stop

strategy(title="Ema cross strat", overlay=true)
margin = input(true, title="Margin?")
Margin = margin  ? margin : false
resCustom = input(title="EMA Timeframe", defval="240" )
source = close,
len2 = input(21, minval=1, title="EMA1")
len3 = input(10, minval=1, title="EMA2")
ema2 = request.security(syminfo.tickerid,resCustom,ema(source,len2), lookahead=barmerge.lookahead_off)
ema3 = request.security(syminfo.tickerid,resCustom,ema(source,len3), lookahead=barmerge.lookahead_off)


mylong = crossover(ema3, ema2)
myshort = crossunder(ema3,ema2)

last_long = na
last_short = na
last_long := mylong ? time : nz(last_long[1])
last_short := myshort ? time : nz(last_short[1])

in_long = last_long > last_short ? 2 : 0
in_short = last_short > last_long ? 2 : 0

mylong2 = crossover(ema3, ema2)
myshort2 = crossunder(ema3, ema2)

last_long2 = na
last_short2 = na
last_long2 := mylong2 ? time : nz(last_long2[1])
last_short2 := myshort2 ? time : nz(last_short2[1])

in_long2 = last_long2 > last_short2 ? 0 : 0
in_short2 = last_short2 > last_long2 ? 0 : 0

condlongx =   in_long + in_long2
condlong = crossover(condlongx, 1.9)
condlongclose = crossunder(condlongx, 1.9)

condshortx =  in_short + in_short2
condshort = crossover(condshortx, 1.9)
condshortclose = crossover(condshortx, 1.9)




if crossover(condlongx, 1.9) and testPeriod() and strategy.position_size <= 0
    strategy.entry("Long", strategy.long, comment="Long")

if crossover(condshortx, 1.9) and testPeriod() and strategy.position_size > 0    
    strategy.close("Long",when = not Margin)
    
if crossover(condshortx, 1.9) and testPeriod() and strategy.position_size >= 0
    strategy.entry("Short", strategy.short, comment="Short", when = Margin)

もっと