EMAのリターン戦略

作者: リン・ハーンチャオチャン, 日付: 2023-12-21 11:48:54
タグ:

img

概要

EMAプルバック戦略は,EMA指標に基づいた定量的な取引戦略である.それは異なる期間を持つ3つのEMA曲線を使用して取引信号を構築し,取引を自動化するために価格プルバックに基づいてストップ損失と収益を設定する.

戦略原則

戦略は3つのEMA曲線を使用します.

  • EMA1: 値引きのサポート/レジスタンスレベルを判断するには,比較的短い期間で, 33期までデフォルトです.
  • EMA2:いくつかの逆転信号をフィルタリングするために,EMA1の5倍の期間で,デフォルトは165期です.
  • EMA3:全体的な傾向の方向性を決定するために,EMA1の11倍の期間で,デフォルトで365期.

取引シグナルは次の論理に従って生成されます.

ロング信号: EMA1 を越えて価格が上昇し,EMA1 を越えて価格が EMA1 を越えて価格が上昇し,EMA1 を越えて価格が上昇し,EMA2 に到達しない後,EMA1 を下回る.

ショートシグナル:価格がEMA1を下回り,EMA1を下回り,PullbackがEMA2に達しない.価格がEMA1を下回るとショートに入ります.

ストップ・ロスはロング・ショートで最低/最高プルバック価格に設定されます. 利益はストップ・ロスの2倍に設定されます.

戦略 の 利点

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

  1. 信頼性の高いEMA指標を用いて構築された取引信号.
  2. 価格の引き下げは 効果的な罠に陥らないようにします
  3. ストップ・ロスは,前回の高/低いコントロールで有効に設定されます.
  4. 利潤を取って リスクと報酬の比率を満足させる
  5. EMAパラメータは,異なるサイクルに調整できます.

戦略リスク

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

  1. EMAは遅延効果を持ち 傾向の逆転点を見逃す可能性があります
  2. EMA2 を超えた Pullback の範囲が大きすぎると,誤った信号が生じる可能性があります.
  3. トレンド市場ではストップ・ロスは破られる.
  4. パラメータの設定が正しくない場合,過剰取引や機会の逃れが起こる.

リスクは,EMA期間,引き戻し制限等を調整することによって軽減できます.フィルター信号に他の指標も追加できます.

オプティマイゼーションの方向性

戦略は,次の側面でも最適化できます.

  1. 逆トレンド取引を避けるためにトレンドインジケーターを追加します.例えばMACDです.
  2. 取引量の指標を追加して,誤ったブレイクアウトを避ける.例えば,OBV.
  3. EMA 期間を最適化するか,適応 EMA を使用する.
  4. 動的にパラメータを最適化します 例えばバッグ・オブ・ワードのような 機械学習モデルを使います
  5. 適応型ストップ・ロスのモデル予測を追加して 利益を取ります

結論

EMAのプルバック戦略は,3つのEMAを使用して取引システムを構築し,取引を自動化するために価格のプルバックに基づいてストップ損失を設定し,利益を得ます.これは効果的に取引リスクを制御し,市場の状況に基づいてパラメータを調整することによって最適化することができます.全体として,戦略は健全な論理を持ち,実際の取引に適用できます.将来の改善はトレンド決定,パラメータ最適化,リスク管理などの側面で行うことができます.


/*backtest
start: 2023-11-20 00:00:00
end: 2023-12-20 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/
// created by Space Jellyfish
//@version=4

strategy("EMA pullback strategy", overlay = true, initial_capital=10000, commission_value = 0.075)

target_stop_ratio = input(title="Take Profit Stop Loss ratio", type=input.float, defval=2.06, minval=0.5, maxval=100)
riskLimit_low =  input(title="lowest risk per trade", type=input.float, defval=0.008, minval=0, maxval=100)
riskLimit_high =  input(title="highest risk per trade", type=input.float, defval=0.02, minval=0, maxval=100)
//give up the trade, if the risk is smaller than limit, adjust position size if risk is bigger than limit

ema_pullbackLevel_period = input(title="EMA1 for pullback level Period", type=input.integer, defval=33, minval=1, maxval=10000)
ema_pullbackLimiit_period = input(title="EMA2 for pullback limit Period", type=input.integer, defval=165, minval=1, maxval=10000)
ema_trend_period = input(title="EMA3 for trend Period", type=input.integer, defval=365, minval=1, maxval=10000)

startDate = input(title="Start Date", type=input.integer, defval=1, minval=1, maxval=31)
startMonth = input(title="Start Month", type=input.integer, defval=1, minval=1, maxval=12)
startYear = input(title="Start Year", type=input.integer, defval=2018, minval=2008, maxval=2200)

inDateRange = (time >= timestamp(syminfo.timezone, startYear, startMonth, startDate, 0, 0))

ema_pullbackLevel = ema(close, ema_pullbackLevel_period)
ema_pullbackLimit = ema(close, ema_pullbackLimiit_period)
ema_trendDirection = ema(close, ema_trend_period)

//ema pullback 
float pricePullAboveEMA_maxClose = na
float pricePullAboveEMA_maxHigh = na

float pricePullBelowEMA_minClose = na
float pricePullBelowMA_minLow = na

if(crossover(close, ema_pullbackLevel))
    pricePullAboveEMA_maxClose := close
    pricePullAboveEMA_maxHigh := high
else
    pricePullAboveEMA_maxClose := pricePullAboveEMA_maxClose[1]
    pricePullAboveEMA_maxHigh := pricePullAboveEMA_maxHigh[1]

if(close > pricePullAboveEMA_maxClose)
    pricePullAboveEMA_maxClose := close
if(high > pricePullAboveEMA_maxHigh)
    pricePullAboveEMA_maxHigh := high

if(crossunder(close, ema_pullbackLevel))
    pricePullBelowEMA_minClose := close
    pricePullBelowMA_minLow := low
else
    pricePullBelowEMA_minClose :=pricePullBelowEMA_minClose[1]
    pricePullBelowMA_minLow:=pricePullBelowMA_minLow[1]
    
if(close < pricePullBelowEMA_minClose)
    pricePullBelowEMA_minClose := close
if(low < pricePullBelowMA_minLow)
    pricePullBelowMA_minLow := low


long_strategy = crossover(close, ema_pullbackLevel) and pricePullBelowEMA_minClose < ema_pullbackLimit and ema_pullbackLevel>ema_trendDirection 
short_strategy = crossunder(close, ema_pullbackLevel) and pricePullAboveEMA_maxClose > ema_pullbackLimit and ema_pullbackLevel<ema_trendDirection


var open_long_or_short = 0// long = 10000, short = -10000, no open = 0

//check if position is closed
if(strategy.position_size == 0)
    open_long_or_short := 0
else
    open_long_or_short := open_long_or_short[1]

float risk_long = na
float risk_short = na
float stopLoss = na
float takeProfit = na
float entry_price = na

float entryContracts = 0



risk_long := risk_long[1]
risk_short := risk_short[1]
    
//open a position determine the position size
if (strategy.position_size == 0 and long_strategy and inDateRange)
    risk_long := (close - pricePullBelowMA_minLow) / close

    if(risk_long < riskLimit_high)
        entryContracts := strategy.equity / close
    else
        entryContracts := (strategy.equity * riskLimit_high / risk_long)/close
    
    if(risk_long > riskLimit_low)
        strategy.entry("long", strategy.long, qty = entryContracts, when = long_strategy)


    open_long_or_short := 10000
    
if (strategy.position_size == 0 and short_strategy and inDateRange)
    risk_short := (pricePullAboveEMA_maxHigh - close) / close
    if(risk_short < riskLimit_high)
        entryContracts := strategy.equity / close
    else
        entryContracts := (strategy.equity * riskLimit_high / risk_short)/close

    if(risk_short > riskLimit_low)
        strategy.entry("short", strategy.short, qty = entryContracts, when = short_strategy)

    
    open_long_or_short := -10000

//take profit / stop loss
if(open_long_or_short == 10000)

    stopLoss :=   strategy.position_avg_price*(1 - risk_long)
    takeProfit :=  strategy.position_avg_price*(1 + target_stop_ratio * risk_long)
    entry_price := strategy.position_avg_price
    strategy.exit("Long exit","long", limit = takeProfit , stop = stopLoss)
    
if(open_long_or_short == -10000)
    stopLoss :=  strategy.position_avg_price*(1 + risk_short)
    takeProfit :=  strategy.position_avg_price*(1 - target_stop_ratio * risk_short)
    entry_price := strategy.position_avg_price
    strategy.exit("Short exit","short", limit = takeProfit, stop = stopLoss)



plot(ema_pullbackLevel, color=color.aqua,  title="ema pullback level")
plot(ema_pullbackLimit, color=color.purple,  title="ema pullback limit")
plot(ema_trendDirection, color=color.white,  title="ema trend")

plot(entry_price, color = color.yellow, linewidth = 1, style = plot.style_linebr)
plot(stopLoss, color = color.red, linewidth = 1, style = plot.style_linebr)
plot(takeProfit, color = color.green, linewidth = 1, style = plot.style_linebr)





//

もっと