トリプルマイクロチャネルモメンタム確率マルチファクター取引戦略

ATR MC EOD TP SL RR
作成日: 2025-05-20 14:16:22 最終変更日: 2025-05-20 14:16:22
コピー: 0 クリック数: 450
2
フォロー
319
フォロワー

トリプルマイクロチャネルモメンタム確率マルチファクター取引戦略 トリプルマイクロチャネルモメンタム確率マルチファクター取引戦略

概要

三重マイクロチャネルの動態確率多因数取引戦略は,価格形状に基づく量化取引方法であり,その戦略の核心は,市場における連続した3つのK線を形成するマイクロチャネルの構造を識別し,10の鍵因子を介して取引信号を量化評価することで取引の成功確率を向上させることにある.この戦略は,様々な時間周期の金融市場に適用され,特に,日中のショートライントレーダーに客観的,体系的な入場・出場機構を提供している.この戦略は,技術分析における形状認識と統計的確率の優位性を組み合わせ,厳格なリスク管理システムを通じて,トレーダーに完全な取引ソリューションを提供している.

戦略原則

三重マイクロチャネルの動態確率多因子取引戦略の核心原理は,市場で3つの連続したK線が形成される一方的な運動チャネルを識別することである.この戦略は以下のステップで動作する.

  1. マイクロチャネル識別戦略は,まず,連続した3つの同方向のK線 ((すべて陽線またはすべて陰線) を探す),これは,市場が短期単方向の傾向にある可能性があることを示している.

  2. 多要素評価システム形質は10の重要な要因を評価して定量的に評価されます.

    • 要素1: K線3本の大きさの統一性
    • ポイント2:上下影線を最小化する
    • 因子3:微小なギャップが存在する ((多頭形における現在のK線の低点は3つのK線前の高点より高い)
    • 要素4:K線実体間の隙間
    • 因子5:閉店価格関係 ((多頭形では,現在の閉店価格が前K線高点より高い)
    • 因子6 より高い低点/より低い高点
    • 因子7:開盤価格が前K線の閉盤価格より高/低
    • 8つ目の要素: 影がない
    • 要素9: 十字星がないか,逆のK線
  3. 確率スコア: 基本勝利率 ((70%) を加えた因数評価に基づいて,各取引シグナルの予想勝利率を計算する.

  4. 入学条件: 総合スコアがデフォルトの値 (>50%) を超えると,システムは取引信号を生成する。

  5. リスク管理

    • 多頭入場点は,ターゲットK線の高点または閉店価格 ((上影線の大きさに応じて) に位置する.
    • スタートラインKの開設価格を下にストップを設定します.
    • 目標価格は,既定のリスク/リターン比率に基づいています.
  6. ポジション管理: 口座資金と取引毎のリスク比率 ((デフォルトは1%), 動的に計算される契約数。

  7. 出場メカニズム: トラッキングストップ・ロズ戦略を採用し,収益が目標に達した後に利益の一部をロックし,固定ストップ・ロズと1日間の強制平仓時間を設定する.

戦略的優位性

この戦略は,コードを深く分析することで,以下の顕著な利点が示されています.

  1. 客観的な数値評価戦略: 10つの要因によって各取引シグナルに定量的に評価することで,主観的な判断を減らし,取引の一貫性と客観性を高めます.

  2. 適応力があるこの戦略は,特定の市場の特徴ではなく,一般的な価格の形状に基づいているため,様々な市場と時間周期に適用できます.

  3. 確率で動いている: 戦略は統計的確率に基づいていて,それぞれの取引シグナルには明確な予想の勝率があり,トレーダーはデータに基づく意思決定をすることができる.

  4. 完璧なリスク管理: 各取引には明確なストップ・ロース位置があり,ダイナミックなポジション調整により,リスクは口座資金の固定パーセントに制限されます.

  5. 複数出場メカニズム戦略は,ストップ追跡,固定ストップ,日内強制平仓など,複数の出場方法を統合し,トレーダーの資金を全面的に保護します.

  6. 視覚化されたフィードバック戦略: 詳細な取引シグナルマークとファクタースコアをグラフで提供し,トレーダーがそれぞれのシグナルの質を直観的に理解できるようにする.

  7. 時間の管理取引時間窓口を制限し,終日ポジションを強制することで,夜間ポジションのリスクを回避した.

戦略リスク

この戦略は多くの利点があるものの,以下の潜在的なリスクと課題があります.

  1. オーバーフィットするリスク10の要素の重みと値設定は,過去のデータに過度に適合するリスクがあり,将来の不良パフォーマンスを引き起こす可能性があります.

  2. 低流動性市場のリスク: 流動性の低い市場では,入場・出場価格が滑り落ちて,実際の取引結果に影響を与える可能性があります.

  3. パラメータ感度戦略性能は,ATRの長さ,勝利率の値,リスク報酬率など,複数のパラメータに非常に敏感である.パラメータを正しく設定しないことは,戦略のパフォーマンスに大きく影響する可能性がある.

  4. 市場環境への依存: この戦略は,トレンドがはっきりした市場環境で最適で,揺れ動いた市場や高波動的な市場では誤信号を生じることがあります.

  5. 信号の希少性: 厳格な条件が複数あるため,戦略は特定の期間に少数の取引信号を発生させ,全体的なリターンに影響を与える可能性があります.

  6. 計算の複雑さ: 多要素評価は,戦略の計算複雑さを増し,リアルタイム取引では遅延の課題に直面する可能性があります.

これらのリスクを軽減する方法は以下の通りです.

  • 戦略を全面的に再テストし,異なる市場と時間周期でその安定性を検証する
  • 小型倉庫での実体テストをしばらくして,徐々にポジションを増やす
  • 異なる市場環境に対応するためにパラメータを定期的に再評価し,調整する
  • トレンド指数や変動率の測定などの追加市場環境フィルターを考慮する

戦略最適化の方向性

この戦略は,以下の方向で最適化できます.

  1. 要素重量最適化:現在,すべての要因の重量は同じである (各影響の5%の勝率),機械学習方法によって最適の要因の重量を決定し,予測の正確性を向上させることができる.この最適化は,より重要な要因の重さを高め,他の要因の影響を低下させることがあります.

  2. 市場環境のフィルター:トレンドの強さや波動率の指標などの市場環境評価コンポーネントを追加し,有利な市場条件でのみ取引する.これはADX,波動率のパーセントなどの指標を追加することで実現し,不利な市場環境で取引シグナルを生じさせることを避ける.

  3. タイムフィルターの改善:現在の戦略は,固定取引時間ウィンドウを使用し,異なる時間帯の戦略のパフォーマンスを分析することによって,取引時間範囲を最適化できます.例えば,ある市場は,特定の時間帯でより方向性があり,他の時間帯ではより揺れ動いている可能性があります.

  4. 適応パラメータ固定パラメータ (ATRの長さ,リスク・リターン比率など) を,市場条件の動的調整によるパラメータに変換する.例えば,高変動の市場でリスク・リターン比率を増やし,低変動の市場で低下させる.

  5. 複数のタイムサイクルを確認: より高い時間周期の確認メカニズムを導入し,例えば,日線トレンドが現在の取引方向と一致することを要求する.これは,戦略の成功率を大幅に高め,逆転取引を避けることができる.

  6. 出場メカニズムの最適化:現在の追跡ストップは,ATRベースのダイナミック追跡ストップに改善したり,抵抗位を支える構造化出場に改善したりできます.この最適化は,トレンドの継続をよりよく捉え,トレンドの終了時にタイムリーに退出することができます.

  7. 機械学習を統合する: 機械学習アルゴリズムを使用して,どのシグナルが成功する可能性が高いかを予測し,各取引シグナルにより正確な確率スコアを割り当てる.例えば,ランダムな森または梯度上昇木モデルを使用して歴史シグナルを分類し,より複雑なパターンを抽出することができます.

要約する

三重マイクロチャネル動量確率多因子取引戦略は,価格形状認識と多因子評価を組み合わせた体系化された取引方法である.連続した3つのK線を形成するマイクロチャネル構造を識別し,10つの鍵因子を使用して信号品質を評価することにより,この戦略は客観的で量化可能な取引意思決定の枠組みを提供します.

この戦略の核心的な優位性は,客観的な信号評価システム,厳格なリスクコントロール,そして柔軟な出場メカニズムにある.各信号の予想勝利率を計算することによって,トレーダーは主観的な感覚に頼るのではなく,よりデータ主導の意思決定を行うことができます.同時に,戦略のダイナミックなポジション管理は,口座規模に関係なく,リスクコントロールの一貫性を保証します.

パラメータセンシビリティや市場環境依存などの課題があるにもかかわらず,提案された最適化方向,特に因子重量最適化,市場環境フィルタリング,出場機構の改善によって,戦略のパフォーマンスはさらに向上する見込みである.さらに,機械学習技術の導入は,戦略の将来の発展の重要な方向であり,歴史的なデータからより複雑なパターンを発見する可能性がある.

量化トレーダーにとって,この戦略は,個人リスクの好みや取引スタイルに応じてカスタマイズ・拡張できる堅固な基礎の枠組みを提供します. 最終的に,戦略の成功は,その技術的な実現だけでなく,トレーダーが戦略のルールを理解し,実行する規律にも依存します.

ストラテジーソースコード
/*backtest
start: 2024-05-20 00:00:00
end: 2025-05-18 08:00:00
period: 1d
basePeriod: 1d
exchanges: [{"eid":"Futures_Binance","currency":"ETH_USDC"}]
*/



//@version=5
strategy("Ali 3-Bar MC v6 10 Factor", overlay=true, pyramiding=0)

// === INPUTS ===
showLabels = input.bool(true, title="Show Entry Labels")
rewardMultiple = input.float(1, title="Reward : Risk")


atrLength = input.int(4, title="ATR Length")
var int bullSignalBarIndex = na
var int bearSignalBarIndex = na

// === ATR ===
atr = ta.sma(ta.tr(true), atrLength)

signalTimeout = 1  // 例如3根bar




// === 风险控制参数 ===
riskPerTradePercent = input.float(1, title="每笔风险占比 (%)")  // 如 1%
pointValue = input.float(5, title="每点价值,例如 ES 是 $50/pt")

// 10 Factor 
//@version=5

baseWinRate = 0.70
tick = syminfo.mintick
tolerance = 0.2  // 用于判断 bar 大小一致的容忍比例


// 获取3根 bar 的关键数据
body(i) => math.abs(close[i] - open[i])
barSize(i)  => math.abs(high[i] - low[i])
upperTailRatio(i) => (high[i] - math.max(close[i], open[i])) / barSize(i)
lowerTailRatio(i) => (math.min(close[i], open[i]) - low[i])/barSize(i)

upperTailTolerance = 0.15
lowerTailTolerance = 0.15
bodyTolerance = 0.7
barUniformTolerance = 0.3
win_threshold = 0.5
// 检测 BL MC(3-bar micro channel 向上)
isBLMC = close[2] > open[2] and close[1] > open[1] and close > open

// === 各项因子判断 ===
//f1_uniform = math.max(barSize(2)/barSize(1), barSize(1)/barSize(2)) < 1 + barUniformTolerance and  math.max(barSize(1)/barSize(0), barSize(1)/barSize(0)) < 1 + barUniformTolerance
f1_uniform = math.max(barSize(2)/barSize(0) , barSize(0)/barSize(2)) < 1 + barUniformTolerance 


f2_mostCOH = ((upperTailRatio(2) < upperTailTolerance? 1:0) +  (upperTailRatio(1) < upperTailTolerance? 1:0)  +  (upperTailRatio(0) < upperTailTolerance? 1:0) )>=2
f3_microGap = low > high[2] 
f4_tickGap = open > close[1] or open[1] > close[2] 
f5_closesAboveHigh = close > high[1] and close[1] > high[2]
f6_higherLows = low > low[1] and low[1] > low[2]
f7_opensAbovePriorClose = open >= close[1] or open[1] >= close[2]
f8_noLowerTail =  ((lowerTailRatio(2) < lowerTailTolerance? 1:0) +  (lowerTailRatio(1) < lowerTailTolerance? 1:0)  +  (lowerTailRatio(0) < lowerTailTolerance? 1:0) )>=1
f9_noDojiOrOpposite  =body(2) /  barSize(2) > bodyTolerance and body(1) /  barSize(1) > bodyTolerance and body(0) /  barSize(0) > bodyTolerance

// === 总评分计算 ===
score = 0
score := score - (f1_uniform ? 0 : 1)
score := score - (f2_mostCOH ? 0 : 1)
score := score - (f3_microGap ? 0 : 4)
score := score - (f4_tickGap ? 0 : 1)
score := score - (f5_closesAboveHigh ? 0 : 1)
score := score - (f6_higherLows ? 0 : 1)
score := score - (f7_opensAbovePriorClose ? 0 : 1)
score := score - (f8_noLowerTail ? 0 : 1)
score := score - (f9_noDojiOrOpposite ? 0 : 1)

winProb = baseWinRate + (score * 0.05)  // 每个因子加5%,最高 1.20

// === 图上标记 ===
if isBLMC


    labelText = str.tostring(winProb * 100, "#.##") + "%\n" +        "1️⃣ uniform: " + str.tostring(f1_uniform) + "\n" +         "2️⃣ mostCOL: " + str.tostring(f2_mostCOH) + "\n" +        "3️⃣ microGap: " + str.tostring(f3_microGap) + "\n" +        "4️⃣ tickGap: " + str.tostring(f4_tickGap) + "\n" +        "5️⃣ closes<priorLow: " + str.tostring(f5_closesAboveHigh) + "\n" +        "6️⃣ lowerHighs: " + str.tostring(f6_higherLows) + "\n" +        "7️⃣ opensBelowClose: " + str.tostring(f7_opensAbovePriorClose) + "\n" +        "8️⃣ noLowerTail: " + str.tostring(f8_noLowerTail) + "\n" +        "9️⃣ noDoji: " + str.tostring(f9_noDojiOrOpposite)    ,
    label.new(        bar_index,         low,         text=labelText,         style=label.style_label_up,         color=color.new(color.green, 0),         textcolor=color.white,         size=size.small    )



// === Ali BULL MC ===


isAliBull =  isBLMC and  winProb>=win_threshold

// === 检测 Bear Micro Channel ===
isBRMC = close[2] < open[2] and close[1] < open[1] and close < open

// === Bear 各项因子 ===
br_f1_uniform = math.max(barSize(2)/barSize(0) , barSize(0)/barSize(2)) < 1 + barUniformTolerance 
br_f2_mostCOL = ((lowerTailRatio(2) < lowerTailTolerance ? 1:0) +  (lowerTailRatio(1) < lowerTailTolerance ? 1:0) +  (lowerTailRatio(0) < lowerTailTolerance ? 1:0)) >= 2
br_f3_microGap = low[2] > high 
br_f4_tickGap = open < close[1] or open[1] < close[2]
br_f5_closesBelowLow = close < low[1] and close[1] < low[2]
br_f6_lowerHighs = high < high[1] and high[1] < high[2]
br_f7_opensBelowPriorClose = open < close[1] or open[1] < close[2]
br_f8_noUpperTail = ((upperTailRatio(2) < upperTailTolerance ? 1:0) +  (upperTailRatio(1) < upperTailTolerance ? 1:0) +  (upperTailRatio(0) < upperTailTolerance ? 1:0)) >= 1
br_f9_noDojiOrOpposite = body(2)/barSize(2) > bodyTolerance and body(1)/barSize(1) > bodyTolerance and body(0)/barSize(0) > bodyTolerance

// === Bear 总评分计算 ===
br_score = 0
br_score := br_score - (br_f1_uniform ? 0 : 1)
br_score := br_score - (br_f2_mostCOL ? 0 : 1)
br_score := br_score - (br_f3_microGap ? 0 : 4)
br_score := br_score - (br_f4_tickGap ? 0 : 1)
br_score := br_score - (br_f5_closesBelowLow ? 0 : 1)
br_score := br_score - (br_f6_lowerHighs ? 0 : 1)
br_score := br_score - (br_f7_opensBelowPriorClose ? 0 : 1)
br_score := br_score - (br_f8_noUpperTail ? 0 : 1)
br_score := br_score - (br_f9_noDojiOrOpposite ? 0 : 1)

br_winProb = baseWinRate + (br_score * 0.05)

// === Bear 图上标记 ===
if isBRMC

    labelText = str.tostring(br_winProb * 100, "#.##") + "%\n" +        "1️⃣ uniform: " + str.tostring(br_f1_uniform) + "\n" +         "2️⃣ mostCOL: " + str.tostring(br_f2_mostCOL) + "\n" +        "3️⃣ microGap: " + str.tostring(br_f3_microGap) + "\n" +        "4️⃣ tickGap: " + str.tostring(br_f4_tickGap) + "\n" +        "5️⃣ closes<priorLow: " + str.tostring(br_f5_closesBelowLow) + "\n" +        "6️⃣ lowerHighs: " + str.tostring(br_f6_lowerHighs) + "\n" +        "7️⃣ opensBelowClose: " + str.tostring(br_f7_opensBelowPriorClose) + "\n" +        "8️⃣ noUpperTail: " + str.tostring(br_f8_noUpperTail) + "\n" +        "9️⃣ noDoji: " + str.tostring(br_f9_noDojiOrOpposite)    ,
    label.new(        bar_index,         low,         text=labelText,         style=label.style_label_up,         color=color.new(color.red, 0),         textcolor=color.white,         size=size.small    )







// === Ali BEAR MC ===



isAliBear = isBRMC  and br_winProb >=win_threshold

// === ENTRY/RISK/TARGET ===
bullEntry = (upperTailRatio(0)<0.1 ? close :high + tick) 
bullStop =  open[2] - tick
bullRisk = bullEntry - bullStop
bullTarget = bullEntry + bullRisk * rewardMultiple

bearEntry = (lowerTailRatio(0)<0.1? close :low - tick) 
bearStop = open[2]  + tick
bearRisk =  bearStop - bearEntry 
bearTarget = bearEntry - bearRisk * rewardMultiple

// === 动态仓位计算(基于账户资金和止损大小) ===
riskAmount = strategy.equity * (riskPerTradePercent / 100)
bullContracts = math.max(math.floor(riskAmount / (bullRisk * pointValue)),1)
bearContracts = math.max(math.floor(riskAmount / (bearRisk * pointValue)),1)


// === STATE ===
var float bullGapCloseLine = na
var float bearGapCloseLine = na
var bool inLong = false
var bool inShort = false
var bool bullStructureExitArmed = false
var bool bearStructureExitArmed = false
var float lastBullOpen = na
var float lastBearOpen = na
var line currentTPLine = na
var line currentSLLine = na
var float fixedBullStop = na
var float fixedBullTarget = na
var float fixedBearStop = na
var float fixedBearTarget = na

canTradeNow = not na(time(timeframe.period, "0930-1545", "America/New_York"))  // 只在盘中前6小时交易




// === BULL ENTRY ===
if isAliBull and na(bullSignalBarIndex) and canTradeNow and strategy.position_size  == 0
    strategy.entry("Ali Long", strategy.long, stop=bullEntry, qty=bullContracts)
    strategy.exit("Close Long", from_entry = "Ali Long", stop = bullStop, trail_price = bullTarget, trail_offset =    atrLength )
    bullSignalBarIndex := bar_index
    fixedBullStop := bullStop
    fixedBullTarget := bullTarget

// === BEAR ENTRY ===
if isAliBear and na(bearSignalBarIndex) and canTradeNow and strategy.position_size  == 0
    strategy.entry("Ali Short", strategy.short, stop=bearEntry, qty=bearContracts)
    strategy.exit("Close Short", from_entry = "Ali Short", stop = bearStop,trail_price = bearTarget, trail_offset =    atrLength)
    bearSignalBarIndex := bar_index
    fixedBearStop := bearStop
    fixedBearTarget := bearTarget





// === RESET ===
if strategy.position_size != 0
    bullSignalBarIndex := na
    bearSignalBarIndex := na

if not na(bullSignalBarIndex) and (bar_index - bullSignalBarIndex >= signalTimeout) and strategy.opentrades == 0
    strategy.cancel("Ali Long")
    bullSignalBarIndex := na
    fixedBullStop := na
    fixedBullTarget := na

if not na(bearSignalBarIndex) and (bar_index - bearSignalBarIndex >= signalTimeout) and strategy.opentrades == 0
    strategy.cancel("Ali Short")
    bearSignalBarIndex := na
    fixedBearStop := na
    fixedBearTarget := na



eodTime = timestamp("America/New_York", year, month, dayofmonth, 15, 55)

if time >= eodTime and strategy.position_size != 0
    strategy.close_all(comment="EOD Exit")
    label.new(bar_index, close, "Exit: EOD", style=label.style_label_down, color=color.gray, textcolor=color.white, size=size.small)
    bearSignalBarIndex := na
    bullSignalBarIndex:=na
    fixedBearStop := na
    fixedBearTarget := na


plot(fixedBearTarget, title="Bull TP", color=color.green, style=plot.style_linebr)
plot(fixedBearStop, title="Bull SL", color=color.red, style=plot.style_linebr)