移動平均のクロスオーバー戦略

作者: リン・ハーンチャオチャン, 日付: 2023-09-18 17:35:37
タグ:

概要

移動平均クロスオーバー戦略は,移動平均クロスオーバーを取引信号として利用するトレンドフォロー戦略である. 移動平均と価格クロスオーバーと,2つの移動平均間のクロスオーバーを利益を追求するための購入・販売信号として使用する.

戦略原則

この戦略の主な原則は以下のとおりです.

  1. 移動平均を2つ計算します. 一つは速い,もう"つは遅い. SMAやEMAを選択できます.

  2. スローラインを横切る時 ロープポジションです

  3. 価格ブレイクまたは移動平均クロスオーバーを取引信号として選択できます.

  4. 戦略の実行期間を設定できます

  5. 牛市ではロングで,熊市ではショートです.

  6. 移動平均のパラメータをバックテストで最適化する.

この戦略は,移動平均値のトレンドフォロー能力を利用する.短期MAが長期MAを超えると,上昇傾向を示し,長引くべきである.逆に,下落傾向はポジションを減少させるべきである.

利点分析

この戦略の主な利点は:

  1. シンプルな原則 実行が簡単 明確な取引信号

  2. トレンドを効果的に追跡し,取引機会を間に合って把握できる.

  3. 異なる市場環境のための異なるMAパラメータを組み合わせることができる.

  4. 不確実な逆操作を避けるため,長または短だけを選択できます.

  5. 特定の期間を避けるための 戦略の実行時間を設定できます

  6. パラメータの最適化によって 戦略を継続的に改善できます

リスク分析

この戦略の主なリスクは

  1. 誤った信号を受けやすいので 頻繁に取引しないでください

  2. 性能はMAパラメータに依存し,不適切な選択は損失につながる可能性があります.

  3. 遅延があるので 早期入国や遅刻出出出を避けましょう

  4. 範囲限定の市場環境には適さない

  5. 損失を完全に回避することはできません. しかし,この場合,

リスクは,量確認,パラメータ最適化,または他の指標と併用することで軽減できます.

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

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

  1. 傾きフィルターとして % ((ライン - ShortMa) /ShortMa) / ((ライン - LongMa) /LongMa) を追加します.

  2. 移動平均期を最適化し 異なる組み合わせをテストします

  3. MACD や RSI のような指標を複数確認するために追加します.

  4. ストップロスを設定して,単一の取引損失を制限します.

  5. 条件付き利用の傾向市場と範囲市場を区別する.

  6. 最適なスケジュールを見つけるために 異なる保持期間をテストします

概要

移動平均クロスオーバー戦略は,トレンドフォロー戦略のシンプルで実用的な方法です.利点は,容易な実装と効果的なトレンド追跡です.デメリットとしては,遅滞し,誤った信号に易いです. 戦略は,パラメータ最適化と指標フィルタリングを通じて改善され,強いトレンド市場でより良いパフォーマンスを達成することができます.


/*backtest
start: 2023-09-10 00:00:00
end: 2023-09-17 00:00:00
period: 10m
basePeriod: 1m
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/
// © gliese581d

//@version=4
strategy(title="Moving Averages Testing", overlay=true, precision=2, calc_on_every_tick=false, max_bars_back=5000, pyramiding=2,  
 default_qty_type=strategy.percent_of_equity, default_qty_value=50, commission_type=strategy.commission.percent, initial_capital=10000)


//SETTINGS

longs_on = input(title="Long Trades enabled", defval=true)
shorts_on = input(title="Short Trades enabled", defval=true)

long_cond = input(title="Buy/Long Crossover Condition", defval="price x MA1", options=["price x MA1", "price x MA2", "MA1 x MA2"])
short_cond = input(title="Sell/Short Crossunder Condition", defval="price x MA2", options=["price x MA1", "price x MA2", "MA1 x MA2"])

ma1_type = input(title="Moving Average 1 Type", defval="SMA", options=["SMA", "EMA"])
ma1_len = input(defval=20, title="Moving Average 1 Len", type=input.integer, minval=1, maxval=1000, step=1)
ma2_type = input(title="Moving Average 2 Type", defval="SMA", options=["SMA", "EMA"])
ma2_len = input(defval=30, title="Moving Average 2 Len", type=input.integer, minval=1, maxval=1000, step=1)


//MOVING AVERAGES

ma_1 = ma1_type == "EMA" ? ema(close, ma1_len) : sma(close, ma1_len)
ma_2 = ma2_type == "EMA" ? ema(close, ma2_len) : sma(close, ma2_len)


//STRATEGY

//trade entries
long_entry = long_cond == "price x MA1" ? crossover(close, ma_1) : long_cond == "price x MA2" ? crossover(close, ma_2) : long_cond == "MA1 x MA2" ? crossover(ma_1, ma_2) : false
short_entry = short_cond == "price x MA1" ? crossunder(close, ma_1) : short_cond == "price x MA2" ? crossunder(close, ma_2) : short_cond == "MA1 x MA2" ? crossunder(ma_1, ma_2) : false

start_month = input(defval=4, title="Strategy Start Month", type=input.integer, minval=1, maxval=12, step=1)
start_year = input(defval=2018, title="Strategy Start Year", type=input.integer, minval=2000, maxval=2025, step=1)
end_month = input(defval=12, title="Strategy End Month", type=input.integer, minval=1, maxval=12, step=1)
end_year = input(defval=2020, title="Strategy End Year", type=input.integer, minval=2000, maxval=2025, step=1)

in_time = true

strategy.entry("Long", strategy.long, when=longs_on and in_time and long_entry)
strategy.close("Long", when=longs_on and not shorts_on and short_entry)

strategy.entry("Short", strategy.short, when=shorts_on and in_time and short_entry)
strategy.close("Short", when=shorts_on and not longs_on and long_entry)


//PLOTTING

//color background
last_entry_was_long = nz(barssince(long_entry)[1], 5000) < nz(barssince(short_entry)[1], 5000)
bgcol = (longs_on and last_entry_was_long) ? color.green : (shorts_on and not last_entry_was_long) ? color.red : na
bgcolor(color=bgcol, transp=90)

plot((long_cond == "price x MA1" or long_cond == "MA1 x MA2") or (short_cond == "price x MA1" or short_cond == "MA1 x MA2") ? ma_1 : na, color=color.blue)
plot((long_cond == "price x MA2" or long_cond == "MA1 x MA2") or (short_cond == "price x MA2" or short_cond == "MA1 x MA2") ? ma_2 : na, color=color.black)
plotshape(long_entry, style=shape.triangleup, location=location.belowbar, color=color.green)
plotshape(short_entry, style=shape.triangledown, location=location.abovebar, color=color.red)

もっと