二重指数移動平均マルチターゲット取引戦略

EMA SMA TP SL 移动平均线 止损 多目标策略 交叉信号
作成日: 2025-08-21 09:01:39 最終変更日: 2025-08-21 09:01:39
コピー: 0 クリック数: 212
2
フォロー
319
フォロワー

二重指数移動平均マルチターゲット取引戦略 二重指数移動平均マルチターゲット取引戦略

概要

双指数移動平均の多目的取引戦略は,短期と長期のインデックス移動平均 (EMA) の交差信号に基づく量化取引システムである.この戦略は,9周期と21周期EMAの交差を入場信号として利用し,最大10の利益目標と利益の最大化のためにストップ・ロスを設定している.この戦略は,多空の双方向取引を同時にサポートし,短期EMAが長期EMAを突破するときに多空を開く,短期EMAが長期EMAを突破するときに空開く,そして逆の交差時に退出する.

戦略原則

この戦略の核心原理は,指数移動平均の交差系に基づいている.具体的には以下のように実現している.

  1. 2つのEMAを計算する:高速EMA ((9サイクル) と遅いEMA ((21サイクル)
  2. 速速EMAが遅速EMAを横断すると,多重信号が生成される.
  3. 高速EMAが低速EMAを通過すると空白信号が生成される.
  4. 入場後,戦略は入場価格に基づいて自動的に10階梯のターゲット価格 ((TP1-TP10) とストップ・ロスの価格を計算します.
  5. 策略は,多頭と空頭ポジションに対して同じパーセントの設定を使用しますが,方向は逆です.
  6. 多頭型では,入場価格より0.5%下でのストップ・ロスの設定,入場価格より0.5%から5.0%の利益目標
  7. 空頭では,入場価格の0.5%上でのストップ・ロスの設定と,入場価格の0.5%から5.0%下の利益目標が設定されている.
  8. 戦略は,逆の交差点が発生したときに平準退出します.

戦略は,システム化されたリスク管理方法を採用し,取引ごとに口座資金の10%をデフォルトで使用し,初期資金は100,000と設定し,加仓操作は禁止する.

戦略的優位性

  1. シンプルで効果的な入口信号EMA交差は,広く使用され,検証された取引信号であり,容易に理解し,実行できます. 9/21周期のパラメータ設定は,中短期トレンドをよりよく捉えます.
  2. 多目的利益管理10階層の利潤目標を設定し,異なる価格レベルで取引者が利益を得ることを可能にし,利潤の一部をロックし,利潤を可能な限り延ばすことができます.
  3. リスクのコントロール: 取引ごとに明確なストップ・ロスを設定し,単一の取引の最大損失割合を制限し,リスクを効果的に制御する.
  4. 視覚的な支援戦略は,入場シグナル,ストップ・ロズ,ターゲットをグラフに明確に表示し,トレーダーが市場状況を直感的に理解できるようにします.
  5. 双方向の取引能力戦略: 複数の空間の取引を同時にサポートし,様々な市場環境で機会を探します.
  6. パラメータの可変性: すべてのキーパラメータ (EMA周期,ストップレート,利益目標を含む) は,入力によってカスタマイズされ,戦略の柔軟性を高めます.
  7. 完全に自動化戦略の実行は完全に自動化され,信号認識から入場まで,ストップ・ロズと利益の目標設定から退場まで,人間の介入を必要としません.

戦略リスク

  1. 偽の突破の危険性:EMA交差システムは,波動的な市場で偽信号を生じやすく,頻繁な取引と損失を引き起こす可能性があります. 戦略は,強い信号と弱い信号を区別するためのフィルターを設定していません.
  2. ストップダメージ偏狭:現在の戦略のデフォルトストップは0.5%で,波動が大きい市場や品種では過密になり,市場騒音に触発されやすい.
  3. 単一の指標依存: 戦略は,他の技術指標または市場条件との組み合わせで確認されない入場信号としてEMA交差のみに依存し,誤判のリスクを増加させる.
  4. 固定資金管理: 取引ごとに10%の口座資金が固定され,市場の変動や信号の強さの動向に調整されず,十分に最適化されていない可能性があります.
  5. 市場環境の認識の欠如: 戦略はトレンド市と振動市を区別せず,EMA交差システムに適さない市場環境で信号を生成する.
  6. 出場戦略は単一: 複数の利益目標が設定されているにもかかわらず,実際には戦略は最初の目標位 ((TP1) で平仓するだけ,または逆交差時に退出し,真の分量利益を達成しない.

これらのリスクを軽減するために,トレンド強度指数などの追加のフィルタリング条件を導入し,市場の波動的動態に応じてストップとターゲット位の設定を調整することを検討することが推奨されています.

戦略最適化の方向性

  1. フィルターを追加: ADX (平均トレンド指数) のようにトレンドの強さを確認するフィルターとして追加の技術指標を導入し,または相対的に強い指標 (RSI) を導入し,超買い超売り区域での取引を避ける.
  2. ダイナミック・ストップ: 固定パーセントストップを市場の変動に基づくダイナミックストップに変更する.例えば,ATR (実変動幅の平均値) を1つの係数で掛けることでストップ距離を設定する.
  3. 真の多目的利益を得ること: 戦略コードの変更により,最初の目標位のみを完全に平準化するのではなく,異なる目標位の一部を平準化することが可能.これは,各取引を複数の小さなポジションに分割することを必要とします.
  4. トレンド認識の強化: トレンド認識ロジックを追加し,トレンドの方向が明確である場合にのみポジションを開き,波動的な市場での頻繁に取引を避ける.
  5. 資金管理の最適化: 信号の強さ,市場の波動性,または撤回状況に応じて,取引毎の資金の割合を動的に調整する. 10%の固定使用ではなく.
  6. 時間フィルターの追加市場開閉前後の波動的な取引や,重要な経済データの発表を避ける.
  7. 移動停止を導入する: 価格が有利な方向に一定の距離移動した後,止損点を損益平衡点またはより有利な位置に移動し,有利なを保護する.
  8. トレンド対策の強化: 極端な市場条件下では,反転指標を警告信号として追加し,市場が急激に逆転したときにポジションを継続することを避ける.

これらの最適化により,戦略の安定性と収益性を大幅に高め,取り下げや損失を伴う取引の頻度を減らすことができます.

要約する

双指数移動平均多目的取引戦略は,構造が明確で,論理がシンプルな量化取引システムで,クラシックなEMA交差信号に基づいており,多目的の利益管理と止損設定が付加されている.この戦略は,中短期のトレンド取引に適しており,明確なトレンド市場ではうまく機能している.

戦略の設計は比較的シンプルですが,取引戦略の核心要素:入場信号,出場条件,ストップ・ロズ・マネジメント,利益目標が含まれています.戦略の主要な優点は,操作が明確で,理解し実行しやすいこと,そして優れたビジュアルサポートを提供することです.

しかし,戦略には,単一の指標に依存し,市場環境の認識が欠如し,資金管理が柔軟でないなどの限界があります.トレンドフィルターを追加し,ストップ・ローズメカニズムを最適化し,真の分期利益を実現し,資金管理方法を改善することによって,戦略には大きな最適化余地があります.

交易者にとって,この戦略は,よりよい取引効果を達成するために,個人リスクの好みや取引品種特性に合わせて個別化された調整と最適化を行うための基礎の枠組みとして使用できます.

ストラテジーソースコード
/*backtest
start: 2024-08-21 00:00:00
end: 2025-08-20 00:00:00
period: 1d
basePeriod: 1d
exchanges: [{"eid":"Futures_OKX","currency":"BNB_USDT","balance":5000}]
*/

//@version=5
strategy("9/21 EMA with 10 Targets + Stoploss", 
     overlay = true,
     initial_capital = 100000,
     default_qty_type = strategy.percent_of_equity,
     default_qty_value = 10,
     pyramiding = 0)

// === Inputs ===
emaFastLen = input.int(9, "Fast EMA Length")
emaSlowLen = input.int(21, "Slow EMA Length")
slPercent  = input.float(0.5, "Stoploss %", step=0.1)

// 10 Targets
tp1Percent = input.float(0.5, "Target 1 %", step=0.1)
tp2Percent = input.float(1.0, "Target 2 %", step=0.1)
tp3Percent = input.float(1.5, "Target 3 %", step=0.1)
tp4Percent = input.float(2.0, "Target 4 %", step=0.1)
tp5Percent = input.float(2.5, "Target 5 %", step=0.1)
tp6Percent = input.float(3.0, "Target 6 %", step=0.1)
tp7Percent = input.float(3.5, "Target 7 %", step=0.1)
tp8Percent = input.float(4.0, "Target 8 %", step=0.1)
tp9Percent = input.float(4.5, "Target 9 %", step=0.1)
tp10Percent = input.float(5.0, "Target 10 %", step=0.1)

// === EMA Calculation ===
emaFast = ta.ema(close, emaFastLen)
emaSlow = ta.ema(close, emaSlowLen)

// === Entry Conditions ===
longCond  = ta.crossover(emaFast, emaSlow)
shortCond = ta.crossunder(emaFast, emaSlow)

// === Entry ===
if (longCond and strategy.position_size <= 0)
    strategy.entry("BUY", strategy.long)

if (shortCond and strategy.position_size >= 0)
    strategy.entry("SELL", strategy.short)

// === Series Variables for Targets ===
var float tp1 = na
var float tp2 = na
var float tp3 = na
var float tp4 = na
var float tp5 = na
var float tp6 = na
var float tp7 = na
var float tp8 = na
var float tp9 = na
var float tp10 = na
var float stopLevel = na

// === Long Positions ===
if strategy.position_size > 0
    stopLevel := strategy.position_avg_price * (1 - slPercent/100)
    tp1 := strategy.position_avg_price * (1 + tp1Percent/100)
    tp2 := strategy.position_avg_price * (1 + tp2Percent/100)
    tp3 := strategy.position_avg_price * (1 + tp3Percent/100)
    tp4 := strategy.position_avg_price * (1 + tp4Percent/100)
    tp5 := strategy.position_avg_price * (1 + tp5Percent/100)
    tp6 := strategy.position_avg_price * (1 + tp6Percent/100)
    tp7 := strategy.position_avg_price * (1 + tp7Percent/100)
    tp8 := strategy.position_avg_price * (1 + tp8Percent/100)
    tp9 := strategy.position_avg_price * (1 + tp9Percent/100)
    tp10 := strategy.position_avg_price * (1 + tp10Percent/100)

    strategy.exit("Exit Long", "BUY", stop=stopLevel, limit=tp1)

// === Short Positions ===
if strategy.position_size < 0
    stopLevel := strategy.position_avg_price * (1 + slPercent/100)
    tp1 := strategy.position_avg_price * (1 - tp1Percent/100)
    tp2 := strategy.position_avg_price * (1 - tp2Percent/100)
    tp3 := strategy.position_avg_price * (1 - tp3Percent/100)
    tp4 := strategy.position_avg_price * (1 - tp4Percent/100)
    tp5 := strategy.position_avg_price * (1 - tp5Percent/100)
    tp6 := strategy.position_avg_price * (1 - tp6Percent/100)
    tp7 := strategy.position_avg_price * (1 - tp7Percent/100)
    tp8 := strategy.position_avg_price * (1 - tp8Percent/100)
    tp9 := strategy.position_avg_price * (1 - tp9Percent/100)
    tp10 := strategy.position_avg_price * (1 - tp10Percent/100)

    strategy.exit("Exit Short", "SELL", stop=stopLevel, limit=tp1)

// === Plotting ===
plot(emaFast, "EMA 9", color=color.yellow, linewidth=2)
plot(emaSlow, "EMA 21", color=color.orange, linewidth=2)

// Global plots (avoid local scope error)
plot(tp1,  "TP1",  color=color.new(color.green, 0))
plot(tp2,  "TP2",  color=color.new(color.green, 10))
plot(tp3,  "TP3",  color=color.new(color.green, 20))
plot(tp4,  "TP4",  color=color.new(color.green, 30))
plot(tp5,  "TP5",  color=color.new(color.green, 40))
plot(tp6,  "TP6",  color=color.new(color.green, 50))
plot(tp7,  "TP7",  color=color.new(color.green, 60))
plot(tp8,  "TP8",  color=color.new(color.green, 70))
plot(tp9,  "TP9",  color=color.new(color.green, 80))
plot(tp10, "TP10", color=color.new(color.green, 90))
plot(stopLevel, "Stoploss", color=color.red, linewidth=2)

// Entry Signals
plotshape(longCond, title="BUY Signal", style=shape.labelup, color=color.green, text="BUY")
plotshape(shortCond, title="SELL Signal", style=shape.labeldown, color=color.red, text="SELL")