複数の移動平均追跡戦略と動的ポジション管理システム

EMA ATR
作成日: 2025-02-27 10:20:18 最終変更日: 2025-02-27 10:20:18
コピー: 0 クリック数: 478
2
フォロー
319
フォロワー

複数の移動平均追跡戦略と動的ポジション管理システム 複数の移動平均追跡戦略と動的ポジション管理システム

概要

多重平均線追跡戦略と動的ポジション管理システムは,多重指数移動平均 ((EMA)) をベースとする量化取引戦略である.この戦略は,5つの異なる周期 ((12,144,169,576および676) のEMA指標を監視することによって,トレンド判断,入場シグナル識別,バッチ構築,ポジションの動的止損および動的停止を含む完全な取引システムを構築する.この戦略は,複数回のポジション加算をサポートするだけでなく,最大5つの取引ポジションを確立することができ,また,各ポジションに対して独立したリスク管理手段があります.このシステムは,EMA指標の配列と価格とキーライン平均の交差関係を介して,市場トレンドの転換点を正確に捉え,トレンドを維持する前提で分量化してポジションを構築し,バッチを獲得します.

戦略原則

この戦略の核心的な論理は,複数のEMAの指標間の位置関係と,価格と重要なEMAの相互作用に基づいています.

  1. トレンド判断の仕組み:

    • 複数のトレンド条件: EMA12 > EMA144 > EMA169 > EMA576 > EMA676
    • 空気トレンド条件: EMA12 < EMA144 < EMA169 < EMA576 < EMA676
  2. 入口信号:

    • 多頭入場:多頭トレンドを満たす基礎で,低値がEMA144を突破し,閉店価格がEMA169上にあるとき
    • 空頭入場:空頭トレンドを満たした上で,高値がEMA144を突破し,閉店価格はEMA169以下であるとき
  3. 貯蔵庫の建設:

    • 最初のポジション:入場信号に準拠し,ポジションを保有していない
    • 2度目のポジション:入場信号を満たし,現在1つのポジションを保有している
    • 3回から5回:入場信号を満たす基礎で,また,前回から50K線以上の時間間隔が必要
  4. ダイナミック・ストップ・ストップ:

    • 各ポジションは動的ストップ・ロスを採用し,倉庫を建てる時に12本のK線の最低価格 (多頭) または最高価格 (空頭) に基づいています.
    • 対称的ストップ戦略を適用し,ターゲット価格は”入場価格 + (入場価格 - ストップ価格) “
    • 配当利益: ストップポイントに達した時点で50%をオフに,残りはストップポイントに達するまで保持する
  5. 全体的なリスク管理:

    • EMA12とEMA144の指標が交差するとき ((多頭トレンドではEMA12がEMA144を下回る,または空頭トレンドではEMA12がEMA144を突破する),全平仓

全体として,この戦略は,複数のEMAを並べて市場のトレンド方向を確立し,価格とEMA144の相互作用によって入場時間を決定し,近期価格変動区間を通じて動的ストップ・ローズ・ストップポイントを設定し,分期して倉庫を建設し,利潤を分割して資金管理を最適化し,最終的に完全な取引システムを形成します.

戦略的優位性

  1. システム化傾向判断:

    • 5つの異なる周期のEMAを3つに分けてトレンド判断システムを使用して,偽ブレイクのリスクを軽減します.
    • EMAの指標の配列は,トレンドの強さや弱さに対する量的な基準を提供し,取引決定をより客観的にします.
  2. 具体的入学方法:

    • 価格と均等線の交差行動が,入場条件のトリガーとして,入場時間の効率性を向上させる.
    • 入場シグナルを12K線内で確認し,取引遅れのリスクを軽減する
  3. 賢明な資金管理:

    • 最大5つの倉庫を支える,異なる市場開発段階に適応する,分期的な倉庫建設
    • 続建倉庫は,最小時間間隔を満たす必要がある ((50根K線),短時間で過度に倉庫を建設することを避ける
  4. 柔軟な収益戦略:

    • “対称性停止”の原則を適用し,入場価格とストップポイントの動的計算に基づいて目標の利点を獲得する
    • 配当利益 ((50%のポジション)),上スペースを保持しながら部分利益をロックする
  5. リスクのコントロール:

    • 各ポジションは,最近の波動範囲に基づいて独立したストップポイントを設定します (12K線)
    • トレンド反転シグナル ((EMA12とEMA144の交差点) が全平を触発し,タイミングで止損する
  6. 適応性が高い:

    • 多頭と空頭取引をサポートし,さまざまな市場環境に対応します.
    • パラメータの調整 (ATR倍数,K線数など) により,異なる品種と周期に対応できる

戦略リスク

  1. 平均線遅れのリスク:

    • EMAの指標には一定の遅滞があり,市場が急激に変動するときに,入場または出場のタイミングが悪い可能性があります.
    • 緩和方法: 短期的な運動量指数と組み合わせて,システムの反応速度を向上させるための補助策として考えられる
  2. 貯蔵庫を積み重ねるための資金の圧迫:

    • 5つのポジションまで支持する加仓戦略は,過度に集中する資金につながる可能性があります.
    • 緩和策: 総資金量に応じて合理的に設定された資金の割合を,倉庫の建設ごとに設定し,資金の均衡な配分を確保する.
  3. 固定周期パラメータの限界:

    • コード内のEMA周期 ([12,144,169,576,676]) は固定値であり,すべての市場環境には適用されない可能性があります.
    • 緩和方法:適応周期計算方法の導入,または異なる品種に対して特別のパラメータ最適化プロセスを構築
  4. 対称性抑制の潜在的な問題:

    • 強いトレンドの市場では,対称制約は早めに利益を得て,より大きな利益の余地を見逃す可能性があります.
    • 緩和策: 強いトレンドの状況に対応するために,残りの50%のポジションにストップトラッキングを設定することを考慮することができます.
  5. 入学条件が厳格すぎる:

    • 多重条件の組み合わせ ((均線並び+価格交差+閉盘確認) は,部分的に有効な信号を逃す可能性があります.
    • 緩和方法:異なる市場段階に合わせて,選択可能な入場メカニズムを設定し,信号の捉え方の感性を向上させる
  6. データ依存のリスク:

    • 戦略は長期周期のEMA (例えば576,676) に依存し,有効に動作するには十分な長い歴史データが必要です.
    • 緩和方法:データ不足の場合,代替指標を使用するか,長周期EMAの計算方法を調整することを考慮する

戦略最適化の方向性

  1. 適応パラメータメカニズムの導入:

    • 固定のEMA周期を[12,144,169,576,676]を,市場の変動に基づく自己適応パラメータに変更する.
    • 最適化理由: 市場環境によって最適なEMA周期の有意な差異があり,自己適応メカニズムは戦略の普遍性を向上させる
  2. 入口信号のフィルタリング強化:

    • 取引量,市場波動率 (ATRなど) などの指標を組み合わせて,入場シグナルに追加の確認条件を追加します.
    • 最適化理由: 純均線交差信号は市場騒音による干渉に容易であり,追加のフィルタリング条件により信号品質が向上する
  3. 資金管理システムの改善:

    • 口座の総額と市場の変動率を動的に調整した,各ポジションの資金比率
    • 最適化理由:現在の戦略の資金配分比率は固定で,リスクレベルに合わせて自動的に調整できない.ダイナミックな資金管理を導入することで,資金利用の効率が向上する
  4. ストップダスの最適化:

    • 異なる倉庫位置のために設計された異なるストップストロップ戦略,例えば,最初の倉庫では固定比率ストップストロップを採用し,後の倉庫ではトラッキングストロップを採用
    • 最適化理由: 統一されたストップ・ストップ・ストラスト戦略は,異なる市場段階の需要に適応することが困難であり,差別化戦略は,市場の変化により柔軟に対応できます.
  5. フィルターを追加する:

    • 取引時間フィルタリングを導入し,高波動期 (開盤前,閉盤前など) または重大データ発表期間を避ける
    • 最適化理由:特定の時間帯の市場の波動は方向性がなく,時間フィルターを追加することで,不必要な取引を回避できます.
  6. トレンド強度評価を追加する:

    • トレンド強度指標を開発し,トレンド強度が値に達したときにのみ取引を許可する
    • 最適化理由:現在の策略は,弱傾向の環境でもシグナルを生成し,トレンドの強度評価を導入することで,波動的な市場における偽信号を減らす
  7. 多周期協同システムを構築する:

    • トレンド判断は,より高い時間周期を組み合わせて,取引方向のフィルターとして
    • 最適化理由:単周期の取引システムは,短期的な変動による干渉に容易であり,多周期の協調はシステムの安定性を高める

要約する

多重平均線追跡戦略とダイナミックポジション管理システムとは,構造的で論理的に明確な量化取引戦略である.この戦略は,多重EMAの配列組合せによってトレンド判断の枠組みを確立し,価格と重要な平均線の相互作用によって入場のタイミングを決定し,分量的にポジションを建設し,ダイナミックストップ・ローズ・ストップによって精巧な資金管理とリスク管理を実現する.戦略の優点は,システム化されたトレンド判断,精巧な入場機構,スマートな資金管理と厳格なリスク管理にある.これは,異なる市場環境において適性がある.

しかし,この戦略には均線遅れ,固定パラメータの限界,資金管理の圧力などのリスクもあります.戦略の効果をさらに高めるために,適応パラメータのメカニズム,信号フィルタリングの強化,資金管理システムの改善,停止損失のメカニズムの最適化,多周期の協調システムの構築などの最適化方向を考慮することができます.

全体として,この戦略は,トレンド追跡とリスク制御を均衡させることで,量化取引のための操作性の強い枠組みを提供します.この戦略は,継続的な最適化と特定の市場環境に対するパラメータの調整によって,実際の取引で安定したパフォーマンスを期待しています.

ストラテジーソースコード
/*backtest
start: 2024-09-08 00:00:00
end: 2024-12-08 00:00:00
period: 2h
basePeriod: 2h
exchanges: [{"eid":"Binance","currency":"ETH_USDT"}]
*/

//@version=6
strategy("专业级交易系统", overlay=false, close_entries_rule = "ANY")
x1 = input.float(1.5,"atr倍数",step=0.1)
x2 = input.int(50,"k线数量",step=1)
s1 = strategy.opentrades.entry_price(0)
s2 = strategy.opentrades.entry_price(1)
s3 = strategy.opentrades.entry_price(2)
s4 = strategy.opentrades.entry_price(3)
s5 = strategy.opentrades.entry_price(4)
s6 = strategy.opentrades.entry_price(5)
s7 = strategy.opentrades.entry_price(6)
s8 = strategy.opentrades.entry_price(7)
s9 = strategy.opentrades.entry_price(8)
c = strategy.position_size,o = strategy.opentrades
ema12_len = input.int(12,"EMA12长度")
ema144_len = input.int(144, "EMA144长度")
ema169_len = input.int(169,"EMA169长度")
ema576_len = input.int(376, "EMA576长度")
ema676_len = input.int(576,"EMA676长度")
ema12 = ta.ema(close,ema12_len)
ema144 = ta.ema(close, ema144_len)
ema169 = ta.ema(close, ema169_len)
ema576 = ta.ema(close, ema576_len)
ema676 = ta.ema(close, ema676_len)
e3 = ta.valuewhen(o ==2 and o[1] == 1 and c > 0,bar_index,0)
e4 = ta.valuewhen(o ==3 and o[1] == 2 and c > 0,bar_index,0)
e5 = ta.valuewhen(o ==4 and o[1] == 3 and c > 0,bar_index,0)
le1 = false
le1 := c <= 0 and ema12 > ema144 and ema144 > ema169 and ema169 > ema576 and ema576 > ema676 and low < ema144 and low[1] > ema144 and close > ema169? true :  close < ema169 or ema12 < ema144 ? false : le1[1]
le11 = false
le11 := le1 and bar_index - ta.valuewhen(low < ema144 and low[1] > ema144,bar_index,0) < 12 ? true : false
le2 = false
le2 := c > 0 and o == 1 and o[1] == 1 and ema12 > ema144 and ema144 > ema169 and ema169 > ema576 and ema576 > ema676 and low < ema144 and low[1] > ema144 and close > ema169? true :  close < ema169 or ema12 < ema144 or o < 1? false : le2[1]
le21 = false
le21 := le2 and bar_index - ta.valuewhen(low < ema144 and low[1] > ema144 and o == 1 and o[1]==1,bar_index,0) < 12 ? true : false
le3 = false
le3 := c > 0 and o == 2 and o[1] == 2 and ema12 > ema144 and ema144 > ema169 and ema169 > ema576 and ema576 > ema676 and low < ema144 and low[1] > ema144 and close > ema169? true :  close < ema169 or ema12 < ema144 or o < 2? false : le3[1]
le31 = false
le31 := le3 and bar_index - e3 > 50 and bar_index - ta.valuewhen(low < ema144 and low[1] > ema144 and o == 2 and o[1]==2,bar_index,0) < 12 ? true : false
le4 = false
le4 := c > 0 and o == 3 and o[1] == 3 and ema12 > ema144 and ema144 > ema169 and ema169 > ema576 and ema576 > ema676 and low < ema144 and low[1] > ema144 and close > ema169? true :  close < ema169 or ema12 < ema144 or o < 3? false : le4[1]
le41 = false
le41 := le4 and bar_index - e4 > 50 and bar_index - ta.valuewhen(low < ema144 and low[1] > ema144 and o == 3 and o[1]==3,bar_index,0) < 12 ? true : false
le5 = false
le5 := c > 0 and o == 4 and o[1] == 4 and ema12 > ema144 and ema144 > ema169 and ema169 > ema576 and ema576 > ema676 and low < ema144 and low[1] > ema144 and close > ema169? true :  close < ema169 or ema12 < ema144 or o < 4? false : le5[1]
le51 = false
le51 := le5 and bar_index - e5 > 50 and bar_index - ta.valuewhen(low < ema144 and low[1] > ema144 and o == 4 and o[1]==4,bar_index,0) < 12 ? true : false
d1 = ta.valuewhen(o == 1 and o[1] == 0 and c > 0,ta.lowest(12),0)
d2 = ta.valuewhen(o == 2 and o[1] == 1 and c > 0,ta.lowest(12),0)
d3 = ta.valuewhen(o == 3 and o[1] == 2 and c > 0,ta.lowest(12),0)
d4 = ta.valuewhen(o == 4 and o[1] == 3 and c > 0,ta.lowest(12),0)
d5 = ta.valuewhen(o == 5 and o[1] == 4 and c > 0,ta.lowest(12),0)
if le11 and close > ema12 and o == 0
    strategy.order("l1",strategy.long,comment="第一单")
if c > 0 and o > 0
    strategy.exit("出场1","l1",limit = 2*s1- d1,stop= d1,qty_percent = 50)
    strategy.exit("出场11","l1",stop= d1)

if le21 and close > ema12 and o == 1
    strategy.order("l2",strategy.long,comment="第二单")
if c > 0 and o == 2
    strategy.exit("出场2","l2",limit = 2*s2- d2,stop= d2,qty_percent = 50)
    strategy.exit("出场21","l2",stop= d2)

if le31 and close > ema12 and o == 2
    strategy.order("l3",strategy.long,comment="第三单")
if c > 0 and o == 3
    strategy.exit("出场3","l3",limit = 2*s3- d3,stop= d3,qty_percent = 50)
    strategy.exit("出场31","l3",stop= d3)

if le41 and close > ema12 and o == 3
    strategy.order("l4",strategy.long,comment="第四单")
if c > 0 and o == 4 
    strategy.exit("出场4","l4",limit = 2*s4- d4,stop= d4,qty_percent = 50)
    strategy.exit("出场41","l4",stop= d4)

if le51 and close > ema12 and o == 4
    strategy.order("l5",strategy.long,comment="第五单")
if c > 0 and o == 5
    strategy.exit("出场5","l5",limit = 2*s5- d5,stop= d5,qty_percent = 50)
    strategy.exit("出场51","l5",stop= d5)
bgcolor(le2?color.red:na)
if c > 0 and ema12 < ema144
    strategy.close_all("跌破均线全部出场")

//做空
es3 = ta.valuewhen(o ==2 and o[1] == 1 and c < 0,bar_index,0)
es4 = ta.valuewhen(o ==3 and o[1] == 2 and c < 0,bar_index,0)
es5 = ta.valuewhen(o ==4 and o[1] == 3 and c < 0,bar_index,0)
se1 = false
se1 := c >= 0 and ema12 < ema144 and ema144 < ema169 and ema169 < ema576 and ema576 < ema676 and high > ema144 and high[1] < ema144 and close < ema169? true :  close > ema169 or ema12 > ema144 ? false : se1[1]
se11 = false
se11 := se1 and bar_index - ta.valuewhen(high > ema144 and high[1] < ema144,bar_index,0) < 12 ? true : false
se2 = false
se2 := c < 0 and o == 1 and o[1] == 1 and ema12 < ema144 and ema144 < ema169 and ema169 < ema576 and ema576 < ema676 and high > ema144 and high[1] < ema144 and close < ema169? true :  close > ema169 or ema12 > ema144 or o < 1? false : se2[1]
se21 = false
se21 := se2 and bar_index - ta.valuewhen(high > ema144 and high[1] < ema144 and o == 1 and o[1]==1,bar_index,0) < 12 ? true : false
se3 = false
se3 := c < 0 and o == 2 and o[1] == 2 and ema12 < ema144 and ema144 < ema169 and ema169 < ema576 and ema576 < ema676 and high > ema144 and high[1] < ema144 and close < ema169 ? true :  close > ema169 or ema12 > ema144 or o < 2? false : se3[1]
se31 = false
se31 := se3 and bar_index - es3 > 50 and bar_index - ta.valuewhen(high > ema144 and high[1] < ema144 and o == 2 and o[1]==2,bar_index,0) < 12 ? true : false
se4 = false
se4 := c < 0 and o == 3 and o[1] == 3 and ema12 < ema144 and ema144 < ema169 and ema169 < ema576 and ema576 < ema676 and high > ema144 and high[1] < ema144 and close < ema169? true :  close > ema169 or ema12 > ema144 or o < 3? false : se4[1]
se41 = false
se41 := se4 and bar_index - es4 > 50 and bar_index - ta.valuewhen(high > ema144 and high[1] < ema144 and o == 3 and o[1]==3,bar_index,0) < 12 ? true : false
se5 = false
se5 := c < 0 and o == 4 and o[1] == 4 and ema12 < ema144 and ema144 < ema169 and ema169 < ema576 and ema576 < ema676 and high > ema144 and high[1] < ema144 and close < ema169 ? true :  close > ema169 or ema12 > ema144 or o < 4? false : se5[1]
se51 = false
se51 := se5 and bar_index - es5 > 50 and bar_index - ta.valuewhen(high > ema144 and high[1] < ema144 and o == 4 and o[1]==4,bar_index,0) < 12 ? true : false
ds1 = ta.valuewhen(o == 1 and o[1] == 0 and c < 0 ,ta.highest(12),0)
ds2 = ta.valuewhen(o == 2 and o[1] == 1 and c < 0,ta.highest(12),0)
ds3 = ta.valuewhen(o == 3 and o[1] == 2 and c < 0,ta.highest(12),0)
ds4 = ta.valuewhen(o == 4 and o[1] == 3 and c < 0,ta.highest(12),0)
ds5 = ta.valuewhen(o == 5 and o[1] == 4 and c < 0,ta.highest(12),0)
if se11 and close < ema12 and o == 0
    strategy.order("s1",strategy.short,comment="第一单")
if c < 0 and o > 0
    strategy.exit("出场1","s1",limit = 2*s1- ds1,stop= ds1,qty_percent = 50)
    strategy.exit("出场11","s1",stop= ds1)

if se21 and close < ema12 and o == 1
    strategy.order("s2",strategy.short,comment="第二单")
if c < 0 and o == 2
    strategy.exit("出场2","s2",limit = 2*s2- ds2,stop= ds2,qty_percent = 50)
    strategy.exit("出场21","s2",stop= ds2)

if se31 and close < ema12 and o == 2
    strategy.order("s3",strategy.short,comment="第三单")
if c < 0 and o == 3
    strategy.exit("出场3","s3",limit = 2*s3- ds3,stop= ds3,qty_percent = 50)
    strategy.exit("出场31","s3",stop= ds3)

if se41 and close < ema12 and o == 3
    strategy.order("s4",strategy.short,comment="第四单")
if c < 0 and o == 4 
    strategy.exit("出场4","s4",limit = 2*s4- ds4,stop= ds4,qty_percent = 50)
    strategy.exit("出场41","s4",stop= ds4)

if se51 and close < ema12 and o == 4
    strategy.order("s5",strategy.short,comment="第五单")
if c < 0 and o == 5
    strategy.exit("出场5","s5",limit = 2*s5- ds5,stop= ds5,qty_percent = 50)
    strategy.exit("出场51","s5",stop= ds5)
bgcolor(se1?color.red:na)
if c < 0 and ema12 > ema144
    strategy.close_all("跌破均线全部出场")
kaiguan = input.bool(true,"均线开关")
plot(ema12,force_overlay=true)
plot(ema144, "EMA144", color=color.new(#008000, 0),force_overlay=true)
plot(ema169, "EMA169", color=color.red,force_overlay=true)
plot(kaiguan?ema576:na,color=color.yellow,force_overlay=true)
plot(kaiguan?ema676:na,color=color.yellow,force_overlay=true)
//plotshape(series=entrySignal,title="买入信号",location=location.belowbar,color=color.new(color.green, 0),style=shape.labelup,text="BUY",textcolor=color.new(color.white, 0))