デュアルタイムフレームストキャスティクスオシレーター裁定取引戦略

STOCH KDJ MA RSI VWMA SMA EMA WMA
作成日: 2025-06-18 13:47:35 最終変更日: 2025-06-18 13:47:35
コピー: 0 クリック数: 318
2
フォロー
319
フォロワー

デュアルタイムフレームストキャスティクスオシレーター裁定取引戦略 デュアルタイムフレームストキャスティクスオシレーター裁定取引戦略

概要

二時間枠ランダム振動指数アベレート取引戦略は,ランダム振動指数 (Stochastic Oscillator) に基づく日中高周波取引システムであり,その戦略の核心は,異なるパラメータの設定の2つのランダム振動指数を使用して15秒の時間枠で取引シグナルを生成し,確認するものである.主要ロジックは,主要ランダム指数の%Kラインと%Dラインの交差によって潜在的なエントリーポイントを識別する,そして,次要のランダム指数の%D値を参考にして,市場状態フィルターとして,移動平均線と市場時間フィルタリング条件を組み合わせ,多層の確認メカニズムを構成する取引システムである.この戦略には,高低パターン識別機能が含まれ,牛市と熊市の継続形状を捕捉し,偽信号を減らすために多種リスクパラメータを制御することができます.

戦略原則

戦略は,主指数と参照指数と呼ばれる二重のランダムな震動指標システムを採用しています.

  1. 主にランダムな振動指標の設定:

    • タイムフレーム: 15秒
    • K線長:12
    • K線平度:12
    • D 線長:12
  2. ランダムな振動指標の設定を参照してください.

    • タイムフレーム: 15秒
    • K線長:12
    • K線平度:15
    • D 線長:30

入場論理は精巧で,信号の有効性を複数のレベルで確認する.

  • 条件は以下の通りです.

    • 主要指標%K線に%D線を穿い,そして
    • 基準指数%D値≥50または<20または
    • 主要指標%Kは参照指標%Dに近い (差値は0.15以内)
    • 価格が移動平均線上にある (MAフィルタが有効である場合)
    • 取引時間は通常の市場時間 (9:30 AM - 4:00 PM ET) でなければなりません.
  • 裸足の入場条件:

    • 主要指標%Kは%D線の下を通過し,
    • 参照指数%Dの容量差の範囲内にあるか,または特定の下穿着条件を満たす
    • 価格が移動平均より下にある
    • 取引時間は通常の市場時間帯でなければなりません.

退出の論理は,時間と技術信号の組み合わせに基づいています.

  • 退会する時間:
    • 東方時間午後3時30分 (通常市場時間終了前)
  • テクノロジーからの脱退:
    • 多頭ポジション:主要指数%Kの下の参照指数%D穿越
    • 空頭ポジション:主指数%K上に参照指数%Dを履いて,参照指数%D>20

この戦略には,形状認識機能も組み込まれています.

  • より高い低点形態:現在の上穿点の%K値は前の一上穿点の%K値より高い ((看継続形態)
  • より低い高点形:現在の下破点の%K値は前破点の%K値より低い ((下落の継続形)

戦略的優位性

  1. 多層認証機構: 2つの異なる配置のランダムな振動指標によって相互確認し,単一の指標によって生成される偽信号を減らす,信号の信頼性を高める.

  2. 入国・退出の正確なルール戦略は,入場と退出の条件を明確に定義し,取引決定の主観性を排除し,完全に体系化された取引を実現します.

  3. 形を認識する能力市場における”高低”と”低高”の形状を識別し,多くの単純な戦略では実現できないトレンドの継続の機会を捉える能力.

  4. タイムフィルター取引時間を通常の市場時間に制限することで,開盤と閉盤前の高波動の低流動性の時間を回避し,滑り場とコストを削減します.

  5. 移動平均のフィルター: 選択可能な移動平均フィルタ機能により,トレンド確認層が追加され,取引の方向が全体的なトレンドと一致することを保証します.

  6. 価格差と容量差のパラメータ: 策略は,価格変動の幅と指標差の範囲を制御する複数のパラメータを導入し,微小な変動から生じるノイズ信号を効果的にフィルターします.

  7. ダイナミックロジック変換: システムは,市場状況の動態に基づいて多頭から空頭へ,空頭から多頭への変換条件に調整することができ,適応性がより高い.

  8. 全面的な警報システム戦略は,リアルタイムで取引を監視し,実行するために,豊富な警報条件を統合しています.

戦略リスク

  1. 短期間の高頻度取引のリスク策略:15秒の時間枠を使用すると,過剰なシグナルが発生し,取引が頻繁になり,取引コストが増加し,市場の変動が大きい場合,大量に偽のシグナルが発生する可能性があります.

  2. リスクの抑制の欠如: コードに明示的なストップ・ロスが実装されていないため,トレンドが突然逆転した場合に大きな損失のリスクに直面する可能性がある. リスクコントロールの欠如は戦略の主要な弱点の一つである.

  3. パラメータ感度策略で使用される複数の正確なパラメータ (例えば0.15の差差の値,0.1%の価格差の上限など) は,異なる市場条件に過度に敏感であり,頻繁に調整する必要がある.

  4. 時間の制限による機会コスト取引は通常の市場時間のみで行われ,特に重要なニュースリリース後の市場の反応により,重要な取引前後の機会を逃す可能性があります.

  5. 流動性への依存:高周波戦略は,低流動性市場において滑り点の問題に直面し,実際の実行価格が,信号生成時の価格と有意な差異がある可能性がある.

  6. 技術指標の遅延: ランダムな振動指標は,それ自体には遅延性があり,特に急速な反転する市場では,ターニングポイントを間に合うように捉えることができないかもしれません.

  7. オーバーフィットするリスク戦略パラメータの微調整は,過去のデータに過度に適合し,将来の市場環境で不十分なパフォーマンスをもたらす可能性があります.

戦略最適化の方向性

  1. 損失防止の強化最も重要な最適化ポイントは,スマートなストップシステムを実現することであり,ATR (平均リアル波動範囲) に基づくストップ戦略を考慮するか,技術レベル (前期高低点など) をストップポイントとして使用し,単一の取引の最大損失を制限する.

  2. ポジション管理の導入: 市場の変動と口座のリスク承受能力に基づいて取引規模を動的に調整し,異なる信号強さで異なるポジション配置を使用し,資金活用率とリスク収益率を最適化します.

  3. 添付量確認: 取引量指標をシステムに統合し,重要な入場信号が十分な取引量サポートを備え,低取引量環境で信頼できない信号をフィルタリングすることを要求する.

  4. 多指標融合RSI,MACD,ブリン帯などの他の動力とトレンド指標を考慮して,より包括的な市場視点を構築し,システムの安定性を向上させる.

  5. タイムフレームを最適化する: 1分または5分のような異なる基礎時間枠をテストし,騒音を軽減しながら十分な取引機会を保持し,信号の質と量の最適なバランスを探す.

  6. 統計の追跡を追加する戦略のパフォーマンスをより科学的に評価するために,最大撤退,シャープ比率,勝利率,損益比率などのより包括的な反射性能指標を実現する.

  7. 適応パラメータ: 固定パラメータを市場波動的動態による調整による自律パラメータに変換し,戦略を異なる市場環境に適応させる.

  8. 市場環境のフィルターを増やすこと:VIX ((波動率指数) または類似の指標を市場環境フィルター条件として加え,高波動環境下で戦略パラメータを調整するか,取引を一時停止する.

要約する

二時間枠ランダム振動指数レバレッジ取引戦略は,二重ランダム振動指数,移動平均フィルター,時間フィルターなどの多層の確認メカニズムによって取引信号の信頼性を向上させる精巧に設計された短期高周波取引システムである.この戦略は,短期的な超買超売の転換点とトレンドの継続形態を,規則市場時間内に識別し,十分な流動性と適度な波動性の市場に適しています.

戦略の設計構造が完善であるにも関わらず,HFT取引に固有のリスクや,ストップ・ロスの欠如などの重要なリスク管理機構の欠如が残っている.戦略の安定性と長期の収益性を高めるために,ストップ・ロスの仕組み,ポジション管理システム,取引量確認,多指標融合などの最適化措置を加えるのが推奨されている.さらに,固定パラメータを自律的なパラメータに変換し,総合的な回帰統計追跡を追加することは,戦略が異なる市場環境で安定したパフォーマンスを維持するのに役立ちます.

取引者がこの戦略を深く理解し,継続的に最適化するにつれて,この取引システムは,特に技術指標を深く理解し,市場をタイムリーに監視できるトレーダーにとって, intraday取引のツールキットの有効な構成要素になる可能性があります.

ストラテジーソースコード
/*backtest
start: 2025-01-01 00:00:00
end: 2025-06-17 00:00:00
period: 4h
basePeriod: 4h
exchanges: [{"eid":"Binance","currency":"ETH_USDT"}]
*/

//@version=6
strategy("Dual TF Stochastic Strategy", overlay=false)

// Input parameters with updated defaults
primaryLen = input.int(12, "Primary Stoch K Length", minval=1)  // Changed from 14 to 12
primarySmooth = input.int(12, "Primary Stoch K Smoothing", minval=1)  // Changed from 3 to 12
primaryDLen = input.int(12, "Primary Stoch D Length", minval=1)  // Changed from 3 to 12
primaryRes = input.timeframe("15S", "Primary Timeframe")  // Changed from "" to "15S"

refLen = input.int(12, "Reference Stoch K Length", minval=1)  // Changed from 14 to 12
refSmooth = input.int(15, "Reference Stoch K Smoothing", minval=1)  // Changed from 3 to 15
refDLen = input.int(30, "Reference Stoch D Length", minval=1)  // Changed from 3 to 30
refRes = input.timeframe("15S", "Reference Timeframe")  // Changed from "D" to "15S"

tolerance = input.float(0.1, "Ref D Tolerance %", minval=0.1, maxval=10.0, step=0.1)  // Changed from 1.0 to 0.1
maxPriceDiff = input.float(0.1, "Maximum Price % Difference", minval=0.1, maxval=5.0, step=0.1)  // Changed from 1.0 to 0.1
closeKThreshold = input.float(0.7, "Close %K Tolerance %", minval=0.1, maxval=10.0, step=0.1)  // Changed from 5.0 to 0.7
minPriceDiffShort = input.float(0.1, "Min Price % Diff for Close %K Short", minval=0.1, maxval=5.0, step=0.1)  // Changed from 0.5 to 0.1
showLabels = input.bool(true, "Show Crossover/Crossunder Labels")

// Time Filters (America/New_York timezone, UTC-4)
is_premarket = hour(time, "America/New_York") < 9
is_postmarket = hour(time, "America/New_York") >= 16
is_regular_hours = hour(time, "America/New_York") >= 9 and hour(time, "America/New_York") < 16
is_exit_time = hour(time, "America/New_York") >= 15 and minute(time, "America/New_York") >= 30  // 3:30 PM ET

// Moving Average Settings
useMAFilter = input.bool(true, "Use Moving Average Filter")
maLength = input.int(200, "Moving Average Length", minval=1)
maType = input.string("SMA", "Moving Average Type", options=["SMA", "EMA", "WMA", "VWMA"])
maTimeframe = input.timeframe("", "Moving Average Timeframe")

// Stochastic Calculations
primaryHighest = ta.highest(high, primaryLen)
primaryLowest = ta.lowest(low, primaryLen)
primaryK_raw = 100 * (close - primaryLowest) / (primaryHighest - primaryLowest)
primaryK = ta.sma(primaryK_raw, primarySmooth)
primaryD = ta.sma(primaryK, primaryDLen)
[primaryK_tf, primaryD_tf] = request.security(syminfo.tickerid, primaryRes, [primaryK, primaryD])

refHighest = ta.highest(high, refLen)
refLowest = ta.lowest(low, refLen)
refK_raw = 100 * (close - refLowest) / (refHighest - refLowest)
refK = ta.sma(refK_raw, refSmooth)
refD = ta.sma(refK, refDLen)
[refK_tf, refD_tf] = request.security(syminfo.tickerid, refRes, [refK, refD])

// Calculate Moving Average
var float ma = na
if useMAFilter
    if maType == "SMA"
        ma := request.security(syminfo.tickerid, maTimeframe, ta.sma(close, maLength))
    else if maType == "EMA"
        ma := request.security(syminfo.tickerid, maTimeframe, ta.ema(close, maLength))
    else if maType == "WMA"
        ma := request.security(syminfo.tickerid, maTimeframe, ta.wma(close, maLength))
    else if maType == "VWMA"
        ma := request.security(syminfo.tickerid, maTimeframe, ta.vwma(close, maLength))

// Price relative to MA
priceAboveMA = not useMAFilter or close > ma
priceBelowMA = not useMAFilter or close < ma

// Crossover Detection and Tracking
crossOver = ta.crossover(primaryK_tf, primaryD_tf)
crossUnder = ta.crossunder(primaryK_tf, primaryD_tf)

// Separate tracking for crossover and crossunder %K and price
var float lastCrossOverK = na
var float lastCrossOverPrice = na
var float currentCrossOverK = na
var float currentCrossOverPrice = na

var float lastCrossUnderK = na
var float lastCrossUnderPrice = na
var float currentCrossUnderK = na
var float currentCrossUnderPrice = na

// Update crossover tracking variables
if crossOver
    lastCrossOverK := nz(currentCrossOverK, primaryK_tf[1])
    lastCrossOverPrice := nz(currentCrossOverPrice, close[1])
    currentCrossOverK := primaryK_tf
    currentCrossOverPrice := close

// Update crossunder tracking variables
if crossUnder
    lastCrossUnderK := nz(currentCrossUnderK, primaryK_tf[1])
    lastCrossUnderPrice := nz(currentCrossUnderPrice, close[1])
    currentCrossUnderK := primaryK_tf
    currentCrossUnderPrice := close

// Calculate differences separately
crossOverPriceDiffPercent = math.abs((currentCrossOverPrice - lastCrossOverPrice) / lastCrossOverPrice * 100)
crossOverKDiffPercent = math.abs((currentCrossOverK - lastCrossOverK) / lastCrossOverK * 100)
crossUnderPriceDiffPercent = math.abs((currentCrossUnderPrice - lastCrossUnderPrice) / lastCrossUnderPrice * 100)
crossUnderKDiffPercent = math.abs((currentCrossUnderK - lastCrossUnderK) / lastCrossUnderK * 100)

isKCloseCrossUnder = crossUnderKDiffPercent <= closeKThreshold and not na(lastCrossUnderK)

// New condition for long entry based on %K and refD_tf difference
kAndRefDDiffClose = crossOver and math.abs(currentCrossOverK - refD_tf) <= 0.15

// Labels for crossover and crossunder (optional)
if showLabels
    if crossOver
        diffKandRefD = math.abs(currentCrossOverK - refD_tf)
        label.new(bar_index, 50, "CrossOver\nDiff K-RefD: " + str.tostring(diffKandRefD, "#.###"), color=color.green, textcolor=color.black, style=label.style_label_up)
    if crossUnder
        diffKandRefD = math.abs(currentCrossUnderK - refD_tf)
        label.new(bar_index, 50, "CrossUnder\nDiff K-RefD: " + str.tostring(diffKandRefD, "#.###"), color=color.red, textcolor=color.black, style=label.style_label_down)

// Entry Conditions
longKCondition = crossOver and (na(lastCrossOverK) or currentCrossOverK > lastCrossOverK)
shortKCondition = crossUnder and (crossUnderPriceDiffPercent <= maxPriceDiff)
closeKShortCondition = crossUnder and isKCloseCrossUnder and (crossUnderPriceDiffPercent > minPriceDiffShort)
crossUnderBetween50and45 = crossUnder and currentCrossUnderK <= 50 and currentCrossUnderK > 45

// Long to Short if crossunder %K > 80 OR < 60
longToShortCondition = crossUnder and (currentCrossUnderK > 80 or currentCrossUnderK < 60) and strategy.position_size > 0 and is_regular_hours

upperLimit = refD_tf * (1 + tolerance/100)
lowerLimit = refD_tf * (1 - tolerance/100)
withinToleranceLong = primaryK_tf >= lowerLimit and primaryK_tf <= upperLimit
withinToleranceShort = primaryK_tf >= lowerLimit and primaryK_tf <= upperLimit

// Final Entry Conditions with MA filter
longCondition = ((longKCondition and (refD_tf >= 50 or refD_tf < 20)) or kAndRefDDiffClose) and is_regular_hours and not is_exit_time and priceAboveMA
shortCondition = (shortKCondition or (crossUnder and withinToleranceShort and (crossUnderPriceDiffPercent <= maxPriceDiff)) or closeKShortCondition or longToShortCondition or crossUnderBetween50and45) and is_regular_hours and not is_exit_time and priceBelowMA

// Short-to-Long Transition Condition with MA filter
shortToLongCondition = crossOver and currentCrossOverK < 25 and strategy.position_size < 0 and is_regular_hours and not is_exit_time and priceAboveMA

// Tracking for %K crossing under refD_tf
var float lastPrimaryKCrossUnderRefD = na
var float currentPrimaryKCrossUnderRefD = na
var bool isPrimaryKCrossUnderRefD = false

// Check if primary %K crosses under reference %D
isPrimaryKCrossUnderRefD := ta.crossunder(primaryK_tf, refD_tf)

// Update tracking for %K crossing under refD
if isPrimaryKCrossUnderRefD
    lastPrimaryKCrossUnderRefD := currentPrimaryKCrossUnderRefD
    currentPrimaryKCrossUnderRefD := primaryK_tf

// Exit Conditions
if is_exit_time
    strategy.close("Long")
    strategy.close("Short")
else if isPrimaryKCrossUnderRefD and not na(lastPrimaryKCrossUnderRefD) and currentPrimaryKCrossUnderRefD < lastPrimaryKCrossUnderRefD
    strategy.close("Long")
else if (ta.crossunder(primaryK_tf, primaryD_tf) and primaryK_tf < refD_tf and refD_tf < 60)
    strategy.close("Long")

if (ta.crossover(primaryK_tf, primaryD_tf) and primaryK_tf > refD_tf and refD_tf > 20) and not is_exit_time
    strategy.close("Short")

// Track if crossunder happens above 85
var bool crossUnderAbove85 = false

// Detect crossunder above 85
if crossUnder and currentCrossUnderK > 85
    crossUnderAbove85 := true

// Reset condition if %K crosses over %D
if ta.crossover(primaryK_tf, primaryD_tf)
    crossUnderAbove85 := false

// Track previous crossover/crossunder values for Higher Low/Lower High detection
var float prevCrossOverK = na
var float prevCrossUnderK = na

// Update previous values on new crossovers/crossunders
if crossOver
    prevCrossOverK := currentCrossOverK
if crossUnder
    prevCrossUnderK := currentCrossUnderK

// Higher Low and Lower High conditions
higherLowCondition = crossOver and not na(prevCrossOverK) and currentCrossOverK > prevCrossOverK
lowerHighCondition = crossUnder and not na(prevCrossUnderK) and currentCrossUnderK < prevCrossUnderK

// Strategy Entries and Transitions
if longCondition
    strategy.entry("Long", strategy.long)

if shortCondition
    if strategy.position_size > 0  // If in a long position, close it first
        strategy.close("Long")
    strategy.entry("Short", strategy.short)

if shortToLongCondition
    strategy.close("Short")
    if ((longKCondition and (refD_tf >= 50 or refD_tf < 20)) or kAndRefDDiffClose)  // Check full longCondition minus time (already checked)
        strategy.entry("Long", strategy.long)

// Add label for Short to Long Transition
if shortToLongCondition
    label.new(bar_index, na, "T", color=color.green, textcolor=color.white, style=label.style_label_up)

// Add label for Long to Short Transition
if longToShortCondition
    label.new(bar_index, na, "T", color=color.red, textcolor=color.white, style=label.style_label_down)

// Plotting
plot(primaryK_tf, "Primary %K", color=color.white, linewidth=1)
plot(primaryD_tf, "Primary %D", color=color.orange, linewidth=1)
plot(refK_tf, "Reference %K", color=color.navy, linewidth=1)
plot(refD_tf, "Reference %D", color=color.rgb(33, 233, 243), linewidth=2)

// Plot current and last %K only for crossUnder when isKCloseCrossUnder is true and currentCrossUnderK < lastCrossUnderK
plot(crossUnder and isKCloseCrossUnder and currentCrossUnderK < lastCrossUnderK ? currentCrossUnderK : na, "Current CrossUnder %K (Close)", color=color.green, style=plot.style_cross, linewidth=2)
plot(crossUnder and isKCloseCrossUnder and currentCrossUnderK < lastCrossUnderK ? lastCrossUnderK : na, "Last CrossUnder %K (Close)", color=color.red, style=plot.style_cross, linewidth=2)

h0 = hline(85, "Upper Band", color=color.rgb(242, 187, 21))
hline(50, "Middle Band", color=#eaff04)
h1 = hline(20, "Lower Band", color=color.rgb(242, 187, 21))
h2 = hline(40, "Lower Band", color=#787B86)
h3 = hline(60, "Lower Band", color=#787B86)
h = hline(0, "Lower Band", color=#787B86)
h5 = hline(100, "Lower Band", color=#787B86)
fill(h0, h1, color=color.rgb(33, 150, 243, 90), title="Background")
fill(h, h1, color=#1be2781d, title="Background")
fill(h0, h5, color=#e21b742d, title="Background")

// Plot the MA if enabled
plot(useMAFilter ? ma : na, "Moving Average", color=color.yellow, linewidth=2)

// Add plot for visualization (optional)
plot(isPrimaryKCrossUnderRefD ? primaryK_tf : na, "Primary %K CrossUnder RefD", color=color.purple, style=plot.style_cross, linewidth=2)
plot(isPrimaryKCrossUnderRefD and not na(lastPrimaryKCrossUnderRefD) ? lastPrimaryKCrossUnderRefD : na, "Last Primary %K CrossUnder RefD", color=color.fuchsia, style=plot.style_cross, linewidth=2)

// Add new alert conditions
alertcondition(higherLowCondition, title="Stoch Higher Low", message="Stoch Higher Low Pattern Detected")
alertcondition(lowerHighCondition, title="Stoch Lower High", message="Stoch Lower High Pattern Detected")

// Plot markers for Higher Low and Lower High patterns
plot(higherLowCondition ? currentCrossOverK : na, "Higher Low", color=color.green, style=plot.style_cross, linewidth=2)
plot(lowerHighCondition ? currentCrossUnderK : na, "Lower High", color=color.red, style=plot.style_cross, linewidth=2)

// Alert conditions
alertcondition(crossOver, title="Stochastic %K Crossed Over %D", message="Stochastic %K crossed over %D")
alertcondition(crossUnder, title="Stochastic %K Crossed Under %D", message="Stochastic %K crossed under %D")
alertcondition(crossOver and primaryK_tf > 50, title="Stochastic %K Crossed Over %D Above 50", message="Stochastic %K crossed over %D above 50")
alertcondition(crossOver and primaryK_tf > refD_tf, title="Stochastic %K Crossed Over %D Above Reference %D", message="Stochastic %K crossed over %D above Reference %D")
alertcondition(longCondition, title="Long Entry Signal", message="Long entry signal triggered")
alertcondition(shortCondition, title="Short Entry Signal", message="Short entry signal triggered")
alertcondition(shortToLongCondition, title="Short to Long Transition", message="Short to Long transition triggered")
alertcondition(longToShortCondition, title="Long to Short Transition", message="Long to Short transition triggered")
alertcondition(isPrimaryKCrossUnderRefD, title="Primary %K Crossed Under Reference %D", message="Primary %K crossed under Reference %D")
alertcondition(crossOver and primaryK_tf > refD_tf, title="Bullish Crossover Above Ref %D", message="Bull: Dual Stoch")
alertcondition(crossUnder and primaryK_tf < refD_tf, title="Bearish Crossunder Below Ref %D", message="Bear: Dual Stoch")