
ダイナミック価格区間とRSI離散取引戦略は,価格区間検出,RSI指数離散信号と移動平均トレンド分析の3つのコアテクニックを組み合わせた総合的な量化取引システムである.この戦略は,ダイナミックポジション調整と部分ポジション平衡の高度な機能を備えたOKXシグナルロボットプラットフォームのために特別に設計されている.この戦略は,主に価格区間の突破点を識別し,RSI指数離散信号と組み合わせ,多周期移動平均線を介して市場トレンドをフィルターし,その結果,下降傾向の中で多くの機会を探し,正確な取引のタイミングを把握する.
この戦略の独特な点は,現在の価格と平均保有価格の間の差に応じて取引規模を動的に調整できるダイナミックなポジション管理システムであり,価格が有利な方向に進んでいるときにポジションを増加させ,価格が逆転し始めるときにポジションを徐々に減退させ,資金効率とリスク報酬率を最適化することを可能にする.
この戦略は,以下の3つのコアコンポーネントの協同作業に基づいています.
価格区間の検出策略: 特定の周期内 ([boxLengthパラメータ設定]) の最高価格と最低価格を計算して価格区間を決定する.これらの価格レベルは,上下境界線としてグラフに描かれ,取引のための可視価格参照範囲を提供します.
RSIは検出から離れています.戦略は,相対強弱指数 (RSI) を用いて市場の動力を計算し,価格とRSIとの間の偏差現象を検出する.価格が新しい低値を記録し,RSIがより高い低値を記録すると,看板の偏差が形成される.価格が新しい高値を記録し,RSIがより低い高値を記録すると,看板の偏差が形成される.戦略は,左右の回転周期 (leftLookbackとrightLookback) を設定することによって局部極値を正確に識別する.
移動平均のトレンド分析策略は,カスタマイズされた時間枠で複数のタイプの移動平均 ((MA20,MA50,MA100,MA200) を計算し,これらの平均線の並び並びと平均線に対する価格の位置を分析して市場トレンドを決定します. 策略は,下降傾向のみで複数のシグナルをトリガーし,取引が全体的な市場環境と一致していることを確認します.
取引の論理は以下の通りです.
多次元確認メカニズム価格区間突破,RSIの信号離散,移動平均のトレンドフィルターと組み合わせた多次元取引確認システムが作成され,取引信号の信頼性と精度が大幅に向上しました.
ダイナミックなポジション管理戦略: 戦略は,市場状況と価格の変化に応じてポジションサイズを動的に調整します. これは,戦略が有利な市場環境で利益の潜在能力を最大化し,不利な条件でリスクを制御できるようにします.math.max(math.min(math.pow((avgPrice - close)* 1000/5,1.1), 100), minEnterPercent)ポジションの調整は柔軟で制限されていることを確認してください.
市場環境への適応: 移動平均の交差と並列分析により,戦略は異なる市場環境に適応し,技術的な形状が全体的なトレンドと一致する場合にのみ取引を実行します.
詳細な出入場地点: 偏離信号と価格区間の突破により,正確な入場・出場点を提供し,偽信号の可能性を減らす. 回顧パラメータ ((leftLookbackとrightLookback) は極限点識別の精度を高めます.
視覚化されたフィードバック策略: 価格区間,移動平均,取引シグナルをグラフに描画し,トレーダーが理解し,取引決定を検証するための直観的な視覚的フィードバックを提供します.
フレキシブルなパラメータ配置複数の可調パラメータにより,戦略はRSIの長さ,価格区間周期,逆転周期などの異なる市場と取引スタイルに対応できます.
偽の突破の危険性価格区間の突破は,実際のトレンドの始まりではなく,時として短期間である可能性があります.これは,不必要な取引を引き起こし,損失を生じます.リスクを軽減する方法は,リターンサイクルを拡張したり,取引量確認を増加したりなどの確認要素を追加することです.
過剰取引のリスク: 動的ポジション調整は,過度取引を引き起こし,取引コストを増加させる可能性があります. 微小な価格変動が頻繁に取引を誘発することを避けるために,合理的な最小調整値 (minEnterPercentとminExitPercent) を設定することをお勧めします.
平均線の遅延リスク: 移動平均は,特に急速な変化する市場において,遅滞性がある.使用する平均線タイプを調整することによって (例えばSMAからEMAに変更) または平均線周期を調整することによって,このリスクを軽減することができます.
パラメータ感度戦略は,RSIの値,平均周期などの複数のパラメータに依存し,これらのパラメータの微小な変化は戦略のパフォーマンスに顕著な影響を与える可能性があります.異なるパラメータの組み合わせをリターンして堅牢な設定を探し,変化する市場条件に対応するために定期的にパラメータを再最適化することをお勧めします.
単一市場への依存戦略は,特定の市場条件下では良好で,他の条件下では良好でない可能性があります. 戦略を異なる市場環境と異なる時間枠でテストし,不適切な市場条件下での取引を一時停止するために市場状態フィルターを追加することを検討してください.
音量を上げる確認:現在の戦略は,価格とRSIの指標のみに依存して取引決定を行う.取引量分析を追加することで,価格区間の突破の有効性を検証し,取引量が不足した偽の突破を避ける.具体的には,突破時の取引量が前回期の平均取引量より高いかどうかをチェックすることによって実現できます.
変動率調整メカニズムを導入する:高波動期には,信号フィルターを追加するか,ポジションサイズ公式を調整して,偽信号のリスクを軽減し,最大リスクのを制御する. ATR (Average True Range) の指標を使用して波動率を量化し,取引パラメータを動的に調整することができます.
収益比率をフィルターする: 各取引の前に潜在的リスク/報酬率を推定し,最小の利益/損失比減価値に達した取引のみを実行し,その結果,戦略全体の予想収益を最適化します. これはATRに基づくダイナミックな止損と止まりのレベルを設定することによって実現できます.
複数の時間枠分析を導入する: より高い時間枠でトレンド確認を追加することで,信号の質を向上させることができます. 例えば,日経トレンドが現在の取引時間枠のトレンドと一致するときにのみ取引を実行します.
ダイナミックポジションアルゴリズムの改善:現在の関数は,極端な状況で過大または過小の調整を生じることがあります.より複雑なアルゴリズム,例えば,市場の変動率と現在の利益の状況に基づく自己適応式,または,個々の取引が全体のポートフォリオに過度に影響しないことを保証するリスクの限を導入することは考えられます.
自動パラメータ最適化を追加する: 自動パラメータ最適化サイクルを実現し,最新の市場データに基づいて定期的に戦略パラメータを調整し,変化する市場条件に戦略がよりうまく適応できるようにする.これは,フィットバックフレームワークまたは機械学習アルゴリズムで実現できる.
ダイナミック価格区間とRSI偏差取引戦略は,複数の技術分析方法を統合した高度な量化取引システムで,価格区間,RSI偏差と移動平均の傾向を組み合わせて,強力な取引意思決定の枠組みを提供します.その最大の優点は,ダイナミックポジション管理システムであり,市場条件に応じて取引規模を自動的に調整し,リスク管理を維持しながら,資金効率を最適化します.
戦略には偽突破やパラメータ感受性などの固有のリスクがあるが,取引量確認の追加,波動率調整の導入,マルチタイムフレーム分析などの推奨された最適化方向によって,戦略の安定性と適応性をさらに強化することができる.自動化された取引プラットフォーム (OKXシグナルロボットなど) で高度な戦略を展開したいトレーダーにとって,これは,個人の取引スタイルと市場の好みに合わせてカスタマイズされ拡張できる柔軟で強力な基礎フレームワークを提供します.
/*backtest
start: 2025-05-07 00:00:00
end: 2025-05-14 00:00:00
period: 1m
basePeriod: 1m
exchanges: [{"eid":"Futures_Binance","currency":"ETH_USDT"}]
*/
//@version=6
// Strategy: Box Range with RSI Divergence (Dynamic Adjustment - OKX Signal Format)
// © aws2333
//I'm chinese
strategy("Kaito Box with RSI Div(Dynamic Adjustment + MA + Long)", overlay=true,default_qty_type=strategy.percent_of_equity, default_qty_value=10)
rsiOverbought = 80
rsiOversold = 13
boxLength = input.int(3, title="Box Length", minval=1)
rsiLength = input.int(2, title="RSI Length", minval=1)
divergenceLookback = input.int(2, title="Divergence Lookback Period", minval=1)
leftLookback = input.int(2, title="Left Lookback", minval=1)
rightLookback = input.int(2, title="Right Lookback", minval=1)
var float avgPrice = na
//var float position_size = 0
signalToken = input.string("**********", "Signal Token")
enterOrderType = input.string("limit", "Order Type", options=["market", "limit"])
enterOrderPriceOffset = input.float(0.05, "Order Price Offset", minval=0, maxval=100, step=0.01)
enterInvestmentType = input.string("percentage_investment", "Investment Type", options=["margin", "contract", "percentage_balance", "percentage_investment"])
exitOrderType = input.string("limit", "Order Type", options=["market", "limit"])
exitOrderPriceOffset = input.float(0.05, "Order Price Offset", minval=0, maxval=100, step=0.01)
exitInvestmentType = input.string("percentage_position", "Investment Type", options=["percentage_position"])
maxLag = input.float(30, "maxLag")
minEnterPercent = 1.3
minExitPercent = 0.09
highestHigh = ta.highest(high, boxLength)
lowestLow = ta.lowest(low, boxLength)
plot(highestHigh, title="Upper Box", color=color.new(color.green, 0), linewidth=1, style=plot.style_line)
plot(lowestLow, title="Lower Box", color=color.new(color.red, 0), linewidth=1, style=plot.style_line)
rsi = ta.rsi(low, rsiLength)
isLowestLeft = low < ta.lowest(low[1], leftLookback)
isLowestRight = low <= ta.lowest(low, rightLookback)
isLowestClose = isLowestLeft and isLowestRight
isHighestLeft = low > ta.highest(low[1], leftLookback)
isHighestRight = low >= ta.highest(low, rightLookback)
isHighestClose = isHighestLeft and isHighestRight
lowestClose = ta.lowest(low, divergenceLookback)
lowestRsi = ta.lowest(rsi, divergenceLookback)
highestClose = ta.highest(low, divergenceLookback)
highestRsi = ta.highest(rsi, divergenceLookback)
lowestClosePrev = ta.lowest(low[1], leftLookback)
lowestRsiPrev = ta.lowest(rsi[1], leftLookback)
highestClosePrev = ta.highest(low[1], leftLookback)
highestRsiPrev = ta.highest(rsi[1], leftLookback)
bullishDivergence = isLowestClose and (low < lowestClosePrev) and (rsi > lowestRsiPrev) and (rsi < rsiOversold)
bearishDivergence = isHighestClose and (low > highestClosePrev) and (rsi < highestRsiPrev) and (rsi > rsiOverbought)
ma(source, length, type) =>
type == "SMA" ? ta.sma(source, length) :type == "EMA" ? ta.ema(source, length) :type == "SMMA (RMA)" ? ta.rma(source, length) :type == "WMA" ? ta.wma(source, length) :type == "VWMA" ? ta.vwma(source, length) :na
custom_timeframe = input.timeframe("3", "Custom time period (leave blank for current period)")
ma_type = input.string("SMA", "Moving average type", options=["SMA", "EMA", "SMMA (RMA)", "WMA", "VWMA"])
ma20_period = input.int(20, "MA20 ", minval=1)
ma50_period = input.int(50, "MA50 ", minval=1)
ma100_period = input.int(100, "MA100 ", minval=1)
ma200_period = input.int(200, "MA200 ", minval=1)
source_close = request.security(syminfo.tickerid, custom_timeframe, close)
ma20 = ma(source_close, ma20_period, ma_type)
ma50 = ma(source_close, ma50_period, ma_type)
ma100 = ma(source_close, ma100_period, ma_type)
ma200 = ma(source_close, ma200_period, ma_type)
up_signal_1 = ma20 > ma200
up_signal_2 = ma50 > ma200
up_signal_3 = ma100 > ma200
up_signal_4 = (high > ma20 and high > ma50 and high > ma100 and high > ma200)
up_trend = (up_signal_1 and up_signal_2 and up_signal_3 and (source_close > ma200)) or up_signal_4
down_signal_1 = ma20 < ma200
down_signal_2 = ma50 < ma200
down_signal_3 = ma100 < ma200
down_signal_4 = (low < ma20 and low < ma50 and low < ma100 and low < ma200)
down_trend = (down_signal_1 and down_signal_2 and down_signal_3 and (source_close < ma200)) or down_signal_4
plot(ma20, color=color.yellow, title="MA20")
plot(ma50, color=color.orange, title="MA50")
plot(ma100, color=color.red, title="MA100")
plot(ma200, color=color.maroon, title="MA200")
var float longAddPercent = na
var float shortAddPercent = na
roundToFourDecimals(value) => math.round(value * 10000) / 10000
if not na(avgPrice)
if close < avgPrice
longAddPercent := roundToFourDecimals(math.max(math.min(math.pow((avgPrice - close)* 1000/5,1.1) , 100), minEnterPercent))
if close > avgPrice
longAddPercent := 1
if close == avgPrice
longAddPercent := 1
if not na(avgPrice)
if close < avgPrice
shortAddPercent := 0.01
if close > avgPrice
shortAddPercent := roundToFourDecimals(math.max(math.min(math.pow((close - avgPrice)*1000,1.1), 100), minExitPercent))
if close == avgPrice
longAddPercent := 1
longSignal = (close <= lowestLow) and bullishDivergence
shortSignal = (close >= highestHigh) and bearishDivergence
plotLongSignal = down_trend and longSignal and close < avgPrice
plotShortSignal = up_trend and shortSignal and close > avgPrice
if plotLongSignal
label.new(bar_index, avgPrice, "average price: " + str.tostring(avgPrice, "#.####"), style=label.style_label_up, color=color.green, textcolor=color.white )
if plotShortSignal
label.new(bar_index, avgPrice,"average price: " + str.tostring(avgPrice, "#.####"), style=label.style_label_down, color=color.red, textcolor=color.white)
if plotLongSignal
label.new(
bar_index,
close,
"LONG :" + str.tostring(longAddPercent, "#.####") + "%, Close: " + str.tostring(close, "#.####"),
style=label.style_label_up,
color=color.new(color.green, 80),
textcolor=color.white
)
if plotShortSignal
label.new(
bar_index,
close,
"EXIT LONG :" + str.tostring(shortAddPercent, "#.####") + "%, Close: " + str.tostring(close, "#.####"),
style=label.style_label_down,
color=color.new(color.red, 80),
textcolor=color.white
)
if longSignal
avgPrice := na(avgPrice) ? close : (avgPrice + close) / 2
if down_trend and longSignal
strategy.entry("Long",strategy.long,qty=longAddPercent )
var float close_size = na
if up_trend and shortSignal
if strategy.position_size > 0
close_size := strategy.position_size * (shortAddPercent/100)
strategy.order("Partial Close Long", strategy.short, close_size)