二重EMA戦略分析

作者: リン・ハーンチャオチャン開催日:2024年2月28日 (月) 18:07:59
タグ:

img

概要

双 EMA 戦略は,異なるサイクルの EMA を計算して価格の傾向方向を特定し,それを入口と出口を決定するために使用するトレンドフォロー戦略です.このシンプルで実践的な戦略はトレンド市場でうまく機能します.

戦略の論理

この戦略は主に2つのEMA指標,短期9日間のEMAと21日間のEMAをベースにしています.それらのクロスオーバーはエントリーと出口信号を生成します.

ショート EMA がロング EMA を越えると,上昇傾向に入っている価格とみなされる. 戦略は上昇傾向を追うためにロングに行く. ショート EMA がロング EMA を越えると,ダウントレンドに入っている価格とみなされる. 戦略は下落傾向を追うためにショートに行く.

EMA指標は,価格データからのノイズを効果的にフィルタリングし,トレンドの主な方向性を特定することができます.したがって,戦略は,より長い価格トレンドを把握するために,入口と出口の基礎として二重EMAを使用します.

利点

この戦略には以下の利点があります.

  1. 戦略のアイデアは単純で理解し実行するのが簡単です
  2. 価格動向を効果的に特定し,動向を追跡するためのポジションを間に合うようにすることができます.
  3. EMA の利用はノイズをフィルタリングし,短期的な価格変動による干渉を回避します.
  4. EMA パラメータは,戦略の敏感性を調整するために設定できます.

リスク

この戦略にはいくつかのリスクもあります:

  1. 傾向が逆転すると EMA の遅延特性により損失が増加する可能性があります.
  2. 誤った EMA パラメータ設定は 誤信号率を増加させる
  3. この戦略は,強い傾向の市場と,範囲に限定された期間で脆弱な市場にとってより適しています.

強化

戦略は以下の側面で最適化できます.

  1. 傾向の逆転を特定し損失を減らすために他の指標を組み込む.例えばMACD,KDJなど.
  2. ストップ・ロスのロジックを追加します.良いストップ・ロスの戦略は最大引き下げを大幅に減らすことができます.
  3. EMA パラメータを最適化し,異なる製品の価格特性により良く適合させる.
  4. 機械学習アルゴリズムを使って EMA パラメータの最適化を自動化します

概要

概要すると,ダブルEMA戦略は,トレンドフォロー戦略として非常に有用である. 動作しやすく,理解しやすく,強いトレンド市場では優れたパフォーマンスを発揮する. 戦略には,安定性を向上させるためにさまざまな強化によって軽減できるいくつかのリスクもあります. 全体的に,ダブルEMAは定量取引のための重要な参照テンプレートとして機能します.


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

//@version=5
// This can only draw so many lines. Use bar replay to go back further
strategy("Strategy Lines", shorttitle="Strategy Lines", overlay=true, max_lines_count=500)

//###########################################################################################################################################
// Replace your strategy here
//###########################################################################################################################################

shortEMA = ta.ema(close, input(9, title="Short EMA Length"))
longEMA = ta.ema(close, input(21, title="Long EMA Length"))

// Entry conditions for long and short positions
longCondition = ta.crossover(shortEMA, longEMA)
shortCondition = ta.crossunder(shortEMA, longEMA)

//###########################################################################################################################################
// Strategy Lines
//###########################################################################################################################################

var timeLow = bar_index
var line li = na
var openLPrice = 0.0000
var openSPrice = 0.0000

LongWColor = input.color(color.rgb(0,255,0,0),"Long Win Color", group="Strategy Lines")
LongLColor = input.color(color.rgb(0,0,255,0),"Long Loss Color", group="Strategy Lines")
ShortWColor = input.color(color.rgb(255,255,0,0),"Short Win Color", group="Strategy Lines")
ShortLColor = input.color(color.rgb(255,0,0,0),"Short Loss Color", group="Strategy Lines")
WinFontColor = input.color(color.rgb(0,0,0,0),"Win Font Color", group="Strategy Lines")
LossFontColor = input.color(color.rgb(255,255,255,0),"Loss Font Color", group="Strategy Lines")
LinesShowLabel = input(false,"Show Labels?",group = "Strategy Lines")

// // Start new line when we go long
// if strategy.position_size >0
//     line.delete(li)
//     li := line.new(timeLow, close[bar_index-timeLow], bar_index, close, width=2, color=close>openLPrice?LongWColor:LongLColor)

// // Start new line when we go short
// if strategy.position_size <0
//     line.delete(li)
//     li := line.new(timeLow, close[bar_index-timeLow], bar_index, close, width=2, color=close<openSPrice?ShortWColor:ShortLColor)

// //Delete Lines if we don't have a position open
// if strategy.position_size ==0
//     li := line.new(timeLow, close[bar_index-timeLow], bar_index, close, width=2, color=color.rgb(0,0,0,100))
//     line.delete(li)

if LinesShowLabel
    // Short Label
    if strategy.position_size>=0 and strategy.position_size[1] <0
        label.new(
             timeLow, na, 
             text=str.tostring((openSPrice-close[1])/(syminfo.mintick*10)), 
             color=close[1]<openSPrice?ShortWColor:ShortLColor, 
             textcolor=close[1]<openSPrice?WinFontColor:LossFontColor,
             size=size.small, 
             style=label.style_label_down, yloc=yloc.abovebar)
    // Long Label
    if strategy.position_size<=0 and strategy.position_size[1] >0
        label.new(
             timeLow, na,
             text=str.tostring((close[1]-openLPrice)/(syminfo.mintick*10)), 
             color=close[1]>openLPrice?LongWColor:LongLColor, 
             textcolor=close[1]>openLPrice?WinFontColor:LossFontColor,
             size=size.small, 
             style=label.style_label_down, yloc=yloc.abovebar)

// Open long position and draw line
if (longCondition)
    //strategy.entry("Long", strategy.long)
    // timeLow := bar_index
    // li := line.new(timeLow, close[bar_index-timeLow], bar_index, close, width=2, color=close>openLPrice?LongWColor:LongLColor)
    openLPrice := close

// Open short position and draw line
if (shortCondition)
    //strategy.entry("Short", strategy.short)
    // timeLow := bar_index
    // li := line.new(timeLow, close[bar_index-timeLow], bar_index, close, width=2, color=close<openSPrice?ShortWColor:ShortLColor)
    openSPrice := close

//###########################################################################################################################################
// Strategy Execution (Replace this as well)
//###########################################################################################################################################

if (longCondition)
    strategy.entry("Long", strategy.long)

if (shortCondition)
    strategy.entry("Short", strategy.short)

もっと