二重移動平均交差取引戦略に基づく


作成日: 2023-12-27 16:07:49 最終変更日: 2023-12-27 16:07:49
コピー: 2 クリック数: 681
1
フォロー
1623
フォロワー

二重移動平均交差取引戦略に基づく

概要

この戦略は,移動平均の黄金交差と死交差に基づいて,買入と売却の信号を生成する.具体的には,この戦略は,5日指数移動平均 ((EMA) と34日双指数移動平均 ((DEMA) を同時に使用する.短期5日EMAが,下から長期34日DEMAを横切るとき,買入の信号を生成する.短期5日EMAが,上から下から長期34日DEMAを横切るとき,売出の信号を生成する.

戦略原則

  1. 5日EMAと34日DEMAを計算する
  2. 短期5日EMAが長期34日DEMAを上から横切ると,買入シグナルが生じます.
  3. 短期5日EMAが上下から34日DEMAを横切ると,売り込み信号が作られます.
  4. 特定の時間帯での取引のみを選択できます.
  5. 追跡停止を使用するか選択できます.

この戦略は,トレンドフォローと均線交差の2つのファクターを同時に融合させ,安定した効果をもたらします.移動平均は,トレンドフォローの指標として,市場動向を効果的に識別します.EMAとDEMAの組み合わせを使用すると,価格データを効果的に平滑して取引信号を生成できます.短期と長期の均線交差は,大きなトレンドの変化時に取引信号を事前に与えることができます.

優位分析

  1. 戦略はシンプルでわかりやすく,実行は簡単です.
  2. 移動平均の組み合わせは,トレンド判断と価格データのスムーズな処理の両方を考慮します.
  3. 短期と長期の均線交差は,大きな市場転換点において取引シグナルを事前に与えることができる
  4. 平均線の長さをパラメータで最適化して,異なる品種と周期に対応できます.
  5. この2つの要素を統合することで,戦略の安定性を高めることができます.

リスク分析

  1. 震災時には誤信号が多く発生する可能性があります.
  2. 平均線長が不適切である場合,信号が遅れる可能性があります.
  3. 不適切な取引時間とストップ・ロスの設定は,戦略的利益に影響を与える可能性があります.

平均線の長さを調整し,取引時間を最適化し,合理的なストップを設定することで,これらのリスクを軽減することができます.

最適化の方向

  1. 平均線長パラメータを異なる取引品種と周期に対応するように調整
  2. トレードタイムパラメータを最適化して,主要アクティブの時間帯で取引する
  3. 固定ストップとトラッキングストップの優劣を比較する
  4. 異なる価格設定が戦略に与える影響を検証する

要約する

この戦略は,双均線交差によって取引シグナルを生成し,同時にトレンド追跡とデータ平滑処理を組み合わせ,シンプルで実用的トレンド追跡戦略である.パラメータ調整とルール最適化により,異なる品種と取引周期に適応し,大きなトレンドの変化時に取引シグナルを事前に与え,誤信号を避ける.推奨され,適用される.

ストラテジーソースコード
/*backtest
start: 2023-11-01 00:00:00
end: 2023-11-30 23:59:59
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
args: [["v_input_1",false]]
*/

//@version=2
strategy(title='[STRATEGY][RS]MicuRobert EMA cross V2', shorttitle='S', overlay=true)
USE_TRADESESSION = input(title='Use Trading Session?', type=bool, defval=true)
USE_TRAILINGSTOP = input(title='Use Trailing Stop?', type=bool, defval=true)
trade_session = input(title='Trade Session:',  defval='0400-1500', confirm=false)
istradingsession = not USE_TRADESESSION ? false : not na(time('1', trade_session))
bgcolor(istradingsession?gray:na)
trade_size = input(title='Trade Size:', type=float, defval=1)
tp = input(title='Take profit in pips:', type=float, defval=55.0) * (syminfo.mintick*10)
sl = input(title='Stop loss in pips:', type=float, defval=22.0) * (syminfo.mintick*10)
ma_length00 = input(title='EMA length:', defval=5)
ma_length01 = input(title='DEMA length:',  defval=34)
price = input(title='Price source:', defval=open)

//  ||--- NO LAG EMA, Credit LazyBear:  ---||
f_LB_zlema(_src, _length)=>
    _ema1=ema(_src, _length)
    _ema2=ema(_ema1, _length)
    _d=_ema1-_ema2
    _zlema=_ema1+_d
//  ||-------------------------------------||

ma00 = f_LB_zlema(price, ma_length00)
ma01 = f_LB_zlema(price, ma_length01)
plot(title='M0', series=ma00, color=black)
plot(title='M1', series=ma01, color=black)

isnewbuy = change(strategy.position_size)>0 and change(strategy.opentrades)>0
isnewsel = change(strategy.position_size)<0 and change(strategy.opentrades)>0

buy_entry_price = isnewbuy ? price : buy_entry_price[1]
sel_entry_price = isnewsel ? price : sel_entry_price[1]
plot(title='BE', series=buy_entry_price, style=circles, color=strategy.position_size <= 0 ? na : aqua)
plot(title='SE', series=sel_entry_price, style=circles, color=strategy.position_size >= 0 ? na : aqua)
buy_appex = na(buy_appex[1]) ? price : isnewbuy ? high : high >= buy_appex[1] ? high : buy_appex[1]
sel_appex = na(sel_appex[1]) ? price : isnewsel ? low : low <= sel_appex[1] ? low : sel_appex[1]
plot(title='BA', series=buy_appex, style=circles, color=strategy.position_size <= 0 ? na : teal)
plot(title='SA', series=sel_appex, style=circles, color=strategy.position_size >= 0 ? na : teal)
buy_ts = buy_appex - sl
sel_ts = sel_appex + sl
plot(title='Bts', series=buy_ts, style=circles, color=strategy.position_size <= 0 ? na : red)
plot(title='Sts', series=sel_ts, style=circles, color=strategy.position_size >= 0 ? na : red)

buy_cond1 = crossover(ma00, ma01) and (USE_TRADESESSION ? istradingsession : true)
buy_cond0 = crossover(price, ma00) and ma00 > ma01 and (USE_TRADESESSION ? istradingsession : true)
buy_entry = buy_cond1 or buy_cond0
buy_close = (not USE_TRAILINGSTOP ? low <= buy_entry_price - sl: low <= buy_ts) or high>=buy_entry_price+tp//high>=last_traded_price + tp or low<=last_traded_price - sl //high >= hh or 
sel_cond1 = crossunder(ma00, ma01) and (USE_TRADESESSION ? istradingsession : true)
sel_cond0 = crossunder(price, ma00) and ma00 < ma01 and (USE_TRADESESSION ? istradingsession : true)
sel_entry = sel_cond1 or sel_cond0
sel_close = (not USE_TRAILINGSTOP ? high >= sel_entry_price + sl : high >= sel_ts) or low<=sel_entry_price-tp//low<=last_traded_price - tp or high>=last_traded_price + sl //low <= ll or 

strategy.entry('buy', long=strategy.long, qty=trade_size, comment='buy', when=buy_entry)
strategy.close('buy', when=buy_close)
strategy.entry('sell', long=strategy.short, qty=trade_size, comment='sell', when=sel_entry)
strategy.close('sell', when=sel_close)