EMAプルバック戦略は,EMA指標に基づいた定量的な取引戦略である.それは異なる期間を持つ3つのEMA曲線を使用して取引信号を構築し,取引を自動化するために価格プルバックに基づいてストップ損失と収益を設定する.
戦略は3つのEMA曲線を使用します.
取引シグナルは次の論理に従って生成されます.
ロング信号: EMA1 を越えて価格が上昇し,EMA1 を越えて価格が EMA1 を越えて価格が上昇し,EMA1 を越えて価格が上昇し,EMA2 に到達しない後,EMA1 を下回る.
ショートシグナル:価格がEMA1を下回り,EMA1を下回り,PullbackがEMA2に達しない.価格がEMA1を下回るとショートに入ります.
ストップ・ロスはロング・ショートで最低/最高プルバック価格に設定されます. 利益はストップ・ロスの2倍に設定されます.
この戦略には以下の利点があります.
この戦略にはいくつかのリスクもあります:
リスクは,EMA期間,引き戻し制限等を調整することによって軽減できます.フィルター信号に他の指標も追加できます.
戦略は,次の側面でも最適化できます.
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) //