マルチソース確認指標バックテストフレームワーク:リスク管理とシグナル検出を統合した定量取引テストシステム

SMA EMA MACD RSI TP/SL R/R ROI VWAP ATR
作成日: 2025-07-08 17:21:11 最終変更日: 2025-07-08 17:21:11
コピー: 0 クリック数: 256
2
フォロー
319
フォロワー

マルチソース確認指標バックテストフレームワーク:リスク管理とシグナル検出を統合した定量取引テストシステム マルチソース確認指標バックテストフレームワーク:リスク管理とシグナル検出を統合した定量取引テストシステム

概要

マルチソース確認指標フィットバックフレームワークは,プロフェッショナル級の定量取引テストシステムであり,カスタム指標と取引シグナルを評価するために設計されています. このフレームワークは,複数の信号検出方法,高度な確認フィルタリングシステム,および専門のリスク管理機能を統合し,トレーダーが取引戦略を全面的にテストできるようにしています. システムの核心的な優点は,ユーザが任意のカスタム指標または内蔵研究を接続し,値の変化,交差点および値のトリガーを含む複数の方法でシグナルを検出できるようにする柔軟性にあります. さらに,このフレームワークは,静止止/止損,本金機能およびポジションサイズ管理,および独立した出場ロジックと明確なビジュアルフィットバックシステムなどの高度なリスク管理機能を提供しています.

戦略原則

この戦略の核心原則は,交易者が様々な指標の有効性を評価できるように,包括的なテスト環境を提供することです.コードは以下の重要な機能を実現します.

  1. 複数の信号検出方法策略:DetectLongSignal () とdetectShortSignal () 関数によって,5つの異なる信号検出方法を実現する.

    • 値変化:指標値が変化し0より大きいときに触発
    • 縦横:指標値が値を横切ったときに発動する
    • ダウンクロス:指数値がダウンして値を越えるとトリガーされる
    • 値が値より高い:指標値が値より低い値から値より高い値に変化したときのトリガー
    • 値が値より低い:指標値が値より高いから値より低い値に変化するとトリガーされる
  2. 確認システム: longConfirmation ((() とshortConfirmation ((() 函数により,取引信号が指定された遡及期間に追加の条件を満たす必要があることを要求する複数のソースの確認システムを実現します.この機能は,偽信号を大幅に減少します.

  3. 入場と出場の論理戦略:strategy.entryとstrategy.exitの関数を使用して取引のエントリーとエクジットを管理する.エントリー条件は,信号検出と確認システムによって共同決定され,エクジットは複数の方法で実現できます.

    • 固定ストップ/ストップ
    • カスタム出場信号
    • 保存機能
  4. パブン論理:取引が指定されたブレイク・エブン・トリガー数に達すると,戦略は自動的にストップ・ロスを入場価格に移動し,既得の利益を保護する.これは,現在の価格と入場価格の差異を検出し,breakEvenTriggerの設定したポイントに達したときにストップ・ロスのレベルを修正することによって実現する.

  5. 視覚化と監視: 戦略は,plotshape関数を使用して,すべての入場と出場シグナルをグラフにマークし,table.newを使用して,現在の戦略の設定と取引状態を表示するリアルタイム状態の表を作成します.

戦略的優位性

  1. 高い柔軟性: 策略は,任意の指標を信号源として接続することを許可し,様々な取引スタイルと市場条件に適用します. ユーザーは,入力ソースを単純に変更することで,異なる指標の組み合わせをテストすることができます.

  2. 多層フィルタリングシステム確認フィルターにより,複数の条件が同時に満たされるように要求し,取引を実行する戦略が可能になり,誤った信号を大幅に削減します.この複数のソースの確認方法は,取引決定する前に複数の指標の一致性を求めるプロのトレーダーの慣行を模倣します.

  3. リスクの管理戦略には,プロレベルのリスク管理機能が組み込まれています.

    • セットアップの停止/止損ポイント
    • 動的保護機能
    • カスタム出場信号 これらの機能は,トレーダーが実際の取引環境におけるリスク管理措置をテスト中に模倣することを保証します.
  4. リアルタイム・フィードバックと監視: 信号標識と状態表によって,トレーダーは戦略の動作状態と性能を直観的に理解し,调度と最適化を容易にすることができます.

  5. 互換性について: 戦略はPine Script v6に対応し,このバージョンをサポートする取引プラットフォームで動作し,トレーダーが過去のパフォーマンスを評価できるように回帰機能をサポートします.

戦略リスク

  1. 信号検出依存性戦略の有効性は,選択された信号検出方法と値設定に大きく依存します. 不適切な配置は,偽信号を過剰に発生させ,重要な取引機会を逃す可能性があります. 特定の指標に最も適した信号検出方法を見つけるために,異なる市場条件下で様々な設定の組み合わせをテストすることをトレーダーにお勧めします.

  2. システムフィルタリングのリスクを確認する: 多源確認システムは偽信号を減らすことができますが,有利な取引の機会を逃すこともあります.過度に厳格な確認要求は,戦略が急速に発展する市場の動きを逃す可能性があります.解決方法は,確認システムの厳格さをバランスさせ,または異なる市場状態のために異なる確認基準を設計することです.

  3. 固定ストップ/止損の限界固定ポイント数を使用するストップ/ストロップは,すべての市場条件,特に波動的な変化が大きい市場には適さない場合があります. 異なる市場環境に対応するために,ストップ/ストップ・ポイントを,市場波動性の指標 (ATRなど) と結び付けるのが推奨されます.

  4. 測量とリールディスクの違い: すべての反測結果は,現実の取引と異なる可能性のあるリスクがあります.反測は,滑り点,取引コスト,流動性の問題を完全に模擬することはできません.トレーダーは,現実の取引の前に,シミュレーション環境で戦略の性能を検証する必要があります.

  5. コードの複雑さ: ポリシーの複雑さはデビューとメンテナンスの難しさを増やす可能性があります. 詳細な注釈とモジュール化デザインは,この複雑さを管理し,コードのメンテナビリティを確保するのに役立ちます.

戦略最適化の方向性

  1. ダイナミックなリスク管理:現在の戦略は,固定ポイントのストップ/ストローを使用し,市場の変動に基づくダイナミックなリスク管理システムに最適化することができる.例えば,ストップ/ストップポイントをATR ((Average True Range) と結び付け,変動が増加するときにストップ範囲を拡大し,変動が減少するときにストップ範囲を縮小する.このようにして,異なる市場条件によりよく適応することができる.

  2. 強化された認証システム:現在の確認システムは,時間フィルター ((特定の市場時間帯での取引を避ける),波動性フィルター ((低波動性環境での取引を避ける),またはトレンドフィルター ((主要トレンドと一致する方向でのみ取引する) など,より多くのフィルタリング条件を含むように拡張できます. これは,偽信号をさらに減少させ,戦略の安定性を向上させます.

  3. 部分ポジション管理: 戦略は,一斉に全ポジションを開くか平置するよりも,入場と出場を分期的に許可する部分的なポジション管理機能を追加することができます.この方法は,単一のエントリー/出場のリスクを軽減し,全体的な戦略のパフォーマンスを向上させることができます.

  4. 機械学習の最適化: 信号パラメータとリスク設定を最適化するために機械学習アルゴリズムを導入し,異なる市場環境に対応するために,歴史データに基づいて戦略パラメータを自動的に調整できます.

  5. パフォーマンス指標の追加戦略は基本的な状態の監視を提供していますが,より多くのパフォーマンスの指標,例えばシャープ比率,最大撤退,損比率などを追加して,より包括的な戦略の評価を提供することができます.これらの指標は,ステータス表で表示され,トレーダーが戦略のパフォーマンスをよりよく評価するのに役立ちます.

要約する

マルチソース確認指標フィットバックフレームワークは,複数のシグナル検出方法,複数の確認システム,および専門的なリスク管理機能を統合することにより,トレーダーに彼らの取引戦略を評価し,最適化するための強力なツールを提供する,機能の豊富な量化取引テストシステムです. このフレームワークの主要な優点は,その柔軟性とカスタマイズ性であり,トレーダーがほぼあらゆるタイプの指標の組み合わせとシグナル生成方法をテストできるようにします.

信号検出依存性や固定リスクパラメータの限界などの固有のリスクや制限があるにもかかわらず,これらの問題は,ダイナミックなリスク管理の実施,確認システムの強化,部分的なポジション管理の導入などの推奨された最適化方向で解決できます.これらの最適化により,このフレームワークは,さらに有効性と適応性を向上させ,トレーダーの武器庫に貴重なツールになります.

要するに,多源確認指標フィットバックフレームワークは,取引戦略のテストと評価のための専門的な,体系的な方法を表しています.これは,単純な信号生成を超えて,リスク管理と多層確認を組み込みます.これらは,成功する取引システムの重要な構成要素です.

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

//@version=6
strategy("FULLY FUNCTIONAL INDICATOR TESTER", overlay=true, margin_long=100, margin_short=100)

// Entry/Exit Signal Inputs
longEntry = input.source(close, 'Long Entry Trigger', 'Source for long signal (connect your indicator here)')
shortEntry = input.source(close, 'Short Entry Trigger', 'Source for short signal (connect your indicator here)')
activateLongExit = input.bool(false, 'Activate Long Exit Signals')
longExit = input.source(high, 'Long Exit Trigger', 'Source for long exit signal')
activateShortExit = input.bool(false, 'Activate Short Exit Signals')
shortExit = input.source(low, 'Short Exit Trigger', 'Source for short exit signal')

// Signal Detection Method
signalMethod = input.string('Value Change', 'Signal Detection Method', options=['Value Change', 'Crossover Above', 'Crossover Below', 'Value Above Threshold', 'Value Below Threshold'])
signalThreshold = input.float(0, 'Signal Threshold', tooltip='Threshold value for signal detection methods')

// Take Profit and Stop Loss
fixedTp = input.int(0, 'Static TP (in ticks)', 0, tooltip='0 = disabled')
initialSL = input.int(0, 'Initial SL (in ticks)', 0, tooltip='0 = disabled')

// Break Even Settings
breakEvenTrigger = input.int(0, 'Break Even Trigger (in ticks)', 0, tooltip='Move SL to break even after this many ticks profit. 0 = disabled')

// Confluence Settings
useConfluence = input.bool(false, 'Use Confluence Filter', 'Activate confluence filter for entries')
longConfluence = input.source(high, 'Long Signal Confluence', 'Source for long confluence filter')
longConfluenceTrigger = input.source(low, 'Long Confluence Trigger', 'Value that must be below confluence source for long entry')
shortConfluence = input.source(high, 'Short Signal Confluence', 'Source for short confluence filter')
shortConfluenceTrigger = input.source(low, 'Short Confluence Trigger', 'Value that must be above confluence source for short entry')
confluenceLookback = input.int(0, 'Confluence Lookback Period', 0, 10, 1, 'Number of candles to look back for confluence')

// Variables to track entry prices for break-even
var float longEntryPrice = na
var float shortEntryPrice = na

// Signal Detection Functions
detectLongSignal() =>
    switch signalMethod
        'Value Change' => longEntry != longEntry[1] and longEntry > 0
        'Crossover Above' => ta.crossover(longEntry, signalThreshold)
        'Crossover Below' => ta.crossunder(longEntry, signalThreshold)
        'Value Above Threshold' => longEntry > signalThreshold and longEntry[1] <= signalThreshold
        'Value Below Threshold' => longEntry < signalThreshold and longEntry[1] >= signalThreshold
        => false

detectShortSignal() =>
    switch signalMethod
        'Value Change' => shortEntry != shortEntry[1] and shortEntry > 0
        'Crossover Above' => ta.crossover(shortEntry, signalThreshold)
        'Crossover Below' => ta.crossunder(shortEntry, signalThreshold)
        'Value Above Threshold' => shortEntry > signalThreshold and shortEntry[1] <= signalThreshold
        'Value Below Threshold' => shortEntry < signalThreshold and shortEntry[1] >= signalThreshold
        => false

detectLongExit() =>
    switch signalMethod
        'Value Change' => longExit != longExit[1] and longExit > 0
        'Crossover Above' => ta.crossover(longExit, signalThreshold)
        'Crossover Below' => ta.crossunder(longExit, signalThreshold)
        'Value Above Threshold' => longExit > signalThreshold and longExit[1] <= signalThreshold
        'Value Below Threshold' => longExit < signalThreshold and longExit[1] >= signalThreshold
        => false

detectShortExit() =>
    switch signalMethod
        'Value Change' => shortExit != shortExit[1] and shortExit > 0
        'Crossover Above' => ta.crossover(shortExit, signalThreshold)
        'Crossover Below' => ta.crossunder(shortExit, signalThreshold)
        'Value Above Threshold' => shortExit > signalThreshold and shortExit[1] <= signalThreshold
        'Value Below Threshold' => shortExit < signalThreshold and shortExit[1] >= signalThreshold
        => false

// Confluence confirmation functions
longConfirmation() => 
    confirmation = false
    if confluenceLookback == 0
        confirmation := longConfluenceTrigger < longConfluence
    else
        for x = 0 to confluenceLookback
            if longConfluenceTrigger[x] < longConfluence[x]
                confirmation := true
                break
    confirmation

shortConfirmation() => 
    confirmation = false
    if confluenceLookback == 0
        confirmation := shortConfluenceTrigger > shortConfluence
    else
        for x = 0 to confluenceLookback
            if shortConfluenceTrigger[x] > shortConfluence[x]
                confirmation := true
                break
    confirmation

// Entry conditions
longConfirmed = useConfluence ? longConfirmation() : true
shortConfirmed = useConfluence ? shortConfirmation() : true

longCondition = detectLongSignal() and longConfirmed
shortCondition = detectShortSignal() and shortConfirmed

// Entry logic
if (longCondition and strategy.opentrades == 0)
    strategy.entry('Long', strategy.long)
    longEntryPrice := close
    // Set initial exit orders
    if fixedTp > 0 or initialSL > 0
        strategy.exit('Long Exit', 'Long', 
                     profit = fixedTp > 0 ? fixedTp : na, 
                     loss = initialSL > 0 ? initialSL : na, 
                     comment_profit = 'TP Hit', 
                     comment_loss = 'SL Hit')

if (shortCondition and strategy.opentrades == 0)
    strategy.entry('Short', strategy.short)
    shortEntryPrice := close
    // Set initial exit orders
    if fixedTp > 0 or initialSL > 0
        strategy.exit('Short Exit', 'Short', 
                     profit = fixedTp > 0 ? fixedTp : na, 
                     loss = initialSL > 0 ? initialSL : na, 
                     comment_profit = 'TP Hit', 
                     comment_loss = 'SL Hit')

// Custom exit signal logic
if (activateLongExit and detectLongExit() and strategy.position_size > 0)
    strategy.close('Long', 'Custom Long Exit')

if (activateShortExit and detectShortExit() and strategy.position_size < 0)
    strategy.close('Short', 'Custom Short Exit')

// Break-even logic
if (breakEvenTrigger > 0)
    // Long position break-even
    if (strategy.position_size > 0 and not na(longEntryPrice))
        ticksProfit = math.round((high - longEntryPrice) / syminfo.mintick)
        if (ticksProfit >= breakEvenTrigger)
            strategy.exit('Long Exit', 'Long', stop = longEntryPrice, comment_loss = 'Break Even')
    
    // Short position break-even  
    if (strategy.position_size < 0 and not na(shortEntryPrice))
        ticksProfit = math.round((shortEntryPrice - low) / syminfo.mintick)
        if (ticksProfit >= breakEvenTrigger)
            strategy.exit('Short Exit', 'Short', stop = shortEntryPrice, comment_loss = 'Break Even')

// Reset entry prices when no position
if (strategy.position_size == 0)
    longEntryPrice := na
    shortEntryPrice := na

// Plot signals for debugging
plotshape(longCondition, title='Long Signal', location=location.belowbar, color=color.green, style=shape.triangleup, size=size.small)
plotshape(shortCondition, title='Short Signal', location=location.abovebar, color=color.red, style=shape.triangledown, size=size.small)
plotshape(activateLongExit and detectLongExit() and strategy.position_size > 0, title='Long Exit', location=location.abovebar, color=color.orange, style=shape.xcross, size=size.small)
plotshape(activateShortExit and detectShortExit() and strategy.position_size < 0, title='Short Exit', location=location.belowbar, color=color.orange, style=shape.xcross, size=size.small)

// Display current settings in a table for easy reference
if barstate.islast
    var table infoTable = table.new(position.top_right, 2, 8, bgcolor=color.white, border_width=1)
    table.cell(infoTable, 0, 0, "Signal Method:", text_color=color.black, bgcolor=color.gray)
    table.cell(infoTable, 1, 0, signalMethod, text_color=color.black)
    table.cell(infoTable, 0, 1, "Threshold:", text_color=color.black, bgcolor=color.gray)
    table.cell(infoTable, 1, 1, str.tostring(signalThreshold), text_color=color.black)
    table.cell(infoTable, 0, 2, "TP (ticks):", text_color=color.black, bgcolor=color.gray)
    table.cell(infoTable, 1, 2, str.tostring(fixedTp), text_color=color.black)
    table.cell(infoTable, 0, 3, "SL (ticks):", text_color=color.black, bgcolor=color.gray)
    table.cell(infoTable, 1, 3, str.tostring(initialSL), text_color=color.black)
    table.cell(infoTable, 0, 4, "Break Even:", text_color=color.black, bgcolor=color.gray)
    table.cell(infoTable, 1, 4, str.tostring(breakEvenTrigger), text_color=color.black)
    table.cell(infoTable, 0, 5, "Confluence:", text_color=color.black, bgcolor=color.gray)
    table.cell(infoTable, 1, 5, useConfluence ? "ON" : "OFF", text_color=color.black)
    table.cell(infoTable, 0, 6, "Position:", text_color=color.black, bgcolor=color.gray)
    table.cell(infoTable, 1, 6, strategy.position_size > 0 ? "LONG" : strategy.position_size < 0 ? "SHORT" : "FLAT", text_color=color.black)
    table.cell(infoTable, 0, 7, "Status:", text_color=color.black, bgcolor=color.gray)
    table.cell(infoTable, 1, 7, "FULLY FUNCTIONAL", text_color=color.green)