指数関数移動平均クロスオーバー量的な取引戦略

作者: リン・ハーンチャオチャン, 日付: 2024-03-29 10:59:57
タグ:

img

概要

この戦略は,2つの指数関数移動平均値 (EMA) のクロスオーバーを買い・売る信号として使用する.短期間EMAが下から長期間EMAを超えると,買い信号を生成する.逆に,短期間EMAが上から長期間EMAを下に越えると,売る信号を生成する.さらに,戦略は,クロスオーバーポイントがトレンドの強さを確認するために過去10取引期間の最高または最低価格であるかどうかを決定する.クロスオーバーポイントが最高価格である場合,背景は緑色;最低価格である場合,赤色になる.さらに,戦略はクロスオーバーポイントの価格をチャートに表示する.

戦略の原則

  1. 2つの異なる期間の EMA を計算し,デフォルト期間の 5 と 10 を計算する.
  2. 2つの EMA が交差するかどうかを判定する.もし短期EMAが下から長期EMAを横切るなら,購入信号を生成する.短期EMAが上から長期EMAを下に横切るなら,売却信号を生成する.
  3. クロスオーバー信号が発生すると,現在のクロスオーバーポイントが過去10取引期間の最高値か最低値かを決定します.最高値であれば上昇傾向が強く,最低値であれば下落傾向が強く見なされます.
  4. 購入信号が生成され,現在のポジションがない場合,ロングポジションを開く.売却信号が生成され,現在のポジションがない場合,ショートポジションを開く.
  5. ロングポジションが保持され,短期EMAが上から長期EMAを下に突破した場合,ロングポジションを閉じる.ショートポジションが保持され,短期EMAが下から長期EMAを下に突破した場合,ショートポジションを閉じる.

戦略 の 利点

  1. 指数関数移動平均値は,単純な移動平均値と比較して価格変化により早く反応し,より迅速な取引信号を生成します.
  2. 交差点が最近の最高値か 最低値かを判断することで,トレンド強度が高い取引機会をフィルタリングし,戦略の収益性を向上させることができます.
  3. グラフにクロスオーバーポイントの価格をマークすることで,トレーダーはより直感的な取引参照を得ることができます.
  4. コードロジックは明確で 分かりやすく 実行できます

戦略リスク

  1. EMAのクロスオーバーによって生成される信号は遅延し,最良の取引機会が逃れられる可能性があります.
  2. 変動する市場では,EMAのクロスオーバーが頻繁に起こり,過剰な取引頻度と取引コストの増加につながる可能性があります.
  3. この戦略にはストップ・ロスの対策がないため,判断が間違っている場合,引き上げリスクが高くなる可能性があります.

戦略の最適化方向

  1. RSI,MACDなどより多くの技術指標を導入し,トレンドの強さと方向性を判断し,信号の精度を向上させる.
  2. 単一の取引リスクを制御するために,合理的なストップ・ロースとテイク・プロフィートのレベルを設定する.
  3. 戦略の適応性を向上させるため,EMA期間やクロスオーバー確認時間窓などの取引パラメータを最適化する.
  4. VIXのような市場情勢指標を組み合わせて 取引信号をフィルターし 誤った信号を減らす
  5. ポジション管理と資本管理モジュールを追加することで,各取引に対する資金額を動的に調整し,資本利用効率を向上させる.

概要

この戦略は,指数的な移動平均交差を核心論理として利用し,近年の交差点価格の相対位置を考慮してトレンド強さを決定する.全体的に見ると,戦略の論理は明確で,利点は明らかですが,一定の制限とリスクもあります.より多くの補助判断指標を導入し,合理的なリスク管理措置を設定し,主要なパラメータを最適化することで,この戦略の安定性と収益性をさらに向上させることができます.


/*backtest
start: 2024-02-01 00:00:00
end: 2024-02-29 23:59:59
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/
// © ZenAndTheArtOfTrading
// @version=5
strategy("ema giao nhau", overlay=true, default_qty_type=strategy.percent_of_equity, default_qty_value=100)

// Get user input
emaLength1 = input.int(title="EMA #1 Length", defval=5)
emaLength2 = input.int(title="EMA #2 Length", defval=10)

// Get MAs
ema1 = ta.ema(close, emaLength1)
ema2 = ta.ema(close, emaLength2)

// Draw MAs
plot(ema1, color=color.blue, title="EMA 1")
plot(ema2, color=color.red, title="EMA 2")

// Detect crossovers
bool crossOver = ta.crossover(ema1, ema2)
bool crossUnder = ta.crossunder(ema1, ema2)
bool cross = crossOver or crossUnder
//float crossPrice = ta.valuewhen(cross, close, 0)
float crossPrice = cross ? close : na

// Check if the crossover price is the highest price over the past 10 bars
bool highestPrice = crossOver
for i = 1 to 10
    if crossPrice <= close[i]
        highestPrice := false
        break

// Check if the crossover price is the lowest price over the past 10 bars
bool lowestPrice = crossUnder
for i = 1 to 10
    if crossPrice >= close[i]
        lowestPrice := false
        break

// Flag the bar if it is a high/low close
bgcolor(highestPrice ? color.new(color.green, 50) : na)
bgcolor(lowestPrice ? color.new(color.red, 50) : na)

// Display crossover price
if cross
    highestEmaPrice = ema1 > ema2 ? ema1 : ema2
    label myLabel = label.new(bar_index, highestEmaPrice, "CrossPrice=" + str.tostring(crossPrice), color=color.white)
    if highestPrice and strategy.position_size == 0
        strategy.entry(id="Buy", direction=strategy.long)
    if lowestPrice and strategy.position_size == 0
        strategy.entry(id="Sell", direction=strategy.short)

// Exit trades when short-term EMA is breached
if strategy.position_size > 0 and crossUnder
    strategy.close("Buy")
if strategy.position_size < 0 and crossOver
    strategy.close("Sell")

もっと