
ADR均線交差策略は,TradingViewプラットフォームに基づく数値取引策略で,複数の技術指標を融合してトレンドを判断し,シグナルをフィルターし,ストップ・ロスを設定する.この戦略は,2つの異なる周期の指数移動平均 (EMA) を採用して主要なトレンドを識別し,平均真波幅 (ATR) を波動率フィルターとして使用し,リスク・リターン比のダイナミックな設定に基づいてストップ・ロスを設定する.さらに,この戦略は,取引時間ウィンドウ,損益バランス,最大日損益などのリスク管理策を導入し,トレンドの機会を把握しながら,下行リスクを厳格に制御する.
双均線交差:戦略は,2つの異なる周期のEMA線を使用してトレンドを判断する. 短期EMAの上に長期EMAを穿越すると,トレンドが向上すると考えられ,多値シグナルを生成する. 逆に,短期EMAの下に長期EMAを穿越すると,トレンドが下がると考えられ,空値シグナルを生成する.
ADR変動率フィルター:低変動率の環境で取引シグナルの発生を避けるために,戦略はADR指標を変動率フィルターとして導入した. ADR値がデフォルトの最小の値よりも高い場合にのみ,ポジションを開くことが許可される.
取引時間ウィンドウ:この戦略は,ユーザが1日の取引の開始時刻を設定することを許可する. 取引は,指定された時間ウィンドウ内でのみ実行されます. これは,流動性の低いまたは波動性の高い時間を回避するのに役立ちます.
ダイナミックストップ・ロスト:戦略は,最近のN根K線の平均最高価格と最低価格に基づいて,かつ,既定のリスク・リターン比率と組み合わせて,ダイナミックにストップ・ロストとストップ・価格を計算する.これは,各取引のリスク・リターンが制御可能であることを保証する.
負債均衡:ポジションが一定の利益率に達した後に (ユーザはリスク・リターン比率を設定できます) 戦略は,ストップ・ロスをポジション開設価格,つまり負債均衡に移動します. これは,既得利益を保護するのに役立ちます.
最大日損失制限: 戦略は,1日の最大損失を制御するために,毎日の損失制限を設定します. 当日の損失がその制限に達すると,戦略は次の日の開場まで取引を停止します.
清算平定ポジション:保有ポジションがストップまたはストップ損失ラインに触れたかどうかに関係なく,戦略は,毎取引日の固定時間 (例えば16:00) にすべてのポジションを平定し,夜間リスクを回避する.
トレンド追跡能力: 双均線交差によってトレンドを判断し,市場の主要トレンドを効果的に捉え,戦略の勝利率と収益の潜在性を向上させる.
波動率の適応性:波動率フィルターとしてADR指標を導入することで,波動率の低い環境で頻繁に取引を避け,無効信号と偽突破による損失を減らす.
リスクコントロールの厳しさ:この戦略は,ダイナミックなストップ・ストップ・損失,負債の均衡,最大日損失の制限など,複数の次元からリスクコントロールの措置を設定し,戦略の下行リスクを効果的に制御し,リスク調整後の収益を向上させる.
パラメータの柔軟性:戦略のパラメータ,例えば平均線周期,ADRの長さ,リスク・リターン比率,取引時間ウィンドウなど,ユーザーの好みや市場の特徴に応じて柔軟に設定することができ,その結果戦略のパフォーマンスを最適化することができる.
高度な自動化:この戦略はTradingViewプラットフォームに基づいており,取引ロジックはプログラムによって完全に自動的に実行され,人間の感情と主観的な判断による干渉が軽減され,戦略の長期の安定した動作に有利である.
パラメータ最適化のリスク:この戦略のパラメータは柔軟に調整できるが,過剰に最適化すると,過剰フィットが起こり,サンプル外での不良なパフォーマンスになる可能性がある.したがって,パラメータ設定時に十分な反射と分析が行われ,戦略の健全性を確保する必要がある.
突発事件リスク:この戦略は主に技術指標取引に基づいています.政策の変化や経済データの大幅な変動などの突発的な重大基本的イベントには,反応が不十分になり,大きな撤退を引き起こす可能性があります.
トレンドリバースのリスク: トレンドリバースの重要な時期には,対均線交差信号が遅れており,戦略が最適なポジションのタイミングを逃すか,またはトレンドリバースの初期に損失を被る可能性があります.
流動性リスク:戦略が取引時間窓を設定したにもかかわらず,取引の標識の流動性が低い場合,滑り点,取引遅延などのリスクに直面し,戦略のパフォーマンスを影響する可能性があります.
技術指標の失敗リスク:この戦略は技術指標に高度に依存しており,市場環境が大きく変化して指標が元の指示的意味を失ってしまう場合,戦略の有効性が低下する可能性があります.
より多くの次元の指標を導入する.既存の二重均線とADRの基礎に,信号の信頼性と安定性を高めるために,MACD,RSIなどのより効果的な技術指標を導入することを検討することができます.
動的最適化パラメータ:異なる市場状態 (トレンド型,震動型など) に応じてパラメータの最適化メカニズムを確立し,市場の変化に対応するために戦略の重要なパラメータを動的に調整できます.
基本要素の追加: 経済データや政策動向などの重要な基本指標を適切に考慮すると,市場動向をよりよく把握し,システム上のリスクを早期に回避するのに役立ちます.
ストップ・ストップ・メカニズムの改善:既存のダイナミック・ストップ・ストップの基礎に,トラッキング・ストップ,部分ストップなどの方法を導入することで,利益の保護とリスクの管理をより良くするために,ストップ・ストップの論理をさらに最適化することができます.
多標数,多時間周期:この戦略を多標数および多時間周期に拡張し,分散投資および時間周期の最適化により,戦略の適応性と安定性を向上させる.
ADR均線交差策略は,技術分析に基づく定量化取引策略で,双均線交差によってトレンドを判断し,ADR指標を用いて波動率をフィルターする. この策略は,下行リスクを制御するために,ダイナミックなストップ・ローズ,負債バランス,最大日負債制限などを含む厳格なリスク管理策を設定している. 策略の優点は,トレンド追跡能力の強さ,波動率の適応性,リスク管理の厳しさ,パラメータの柔軟性,自動化の高い程度にある. しかし,パラメータ最適化リスク,突発リスク,トレンド転換リスク,流動性リスク,技術指標の不効率化リスクなどのリスクも存在している. 将来,この策略は,より多くの指標の次元を考慮して,動向優位,基本的偏差要素の追加,ストップ・ローズの改善,多周期的なモデルやメカニズムを拡張するなどに厳格なリスク管理策を設定している.
/*backtest
start: 2024-02-26 00:00:00
end: 2024-03-27 00:00:00
period: 2h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
// This Pine Script™ code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © Sameh_Hussein
//@version=5
strategy('EMA Cross ADR Strategy with Stats', overlay=true)
// Adjustable Parameters
shortEmaLength = input(10, title='Short EMA Length')
longEmaLength = input(50, title='Long EMA Length')
adrLength = input(14, title='ADR Length')
riskRewardRatio = input(2.0, title='Risk/Reward Ratio')
lookbackCandles = input(10, title='Lookback Candles for Stop Loss')
startTime = input(0900, title='Start Time')
endTime = input(1600, title='End Time')
minAdrValue = input(10, title='Minimum ADR Value for Entry')
breakEvenProfit = input.float(1.0, title='Break-Even Profit', minval=0.0)
breakEvenRR = input.float(1.0, title='Break-Even Risk-Reward Ratio', minval=0.0)
dailyLossLimit = input(-2000.0, title='Daily Loss Limit')
// Exponential Moving Averages
shortEma = ta.ema(close, shortEmaLength)
longEma = ta.ema(close, longEmaLength)
// Average Daily Range
adr = ta.sma(ta.tr, adrLength)
// Time Filter Function
timeFilter() => true
// Entry Conditions with ADR filter
longCondition = ta.crossover(shortEma, longEma) and timeFilter() and adr > minAdrValue
shortCondition = ta.crossunder(shortEma, longEma) and timeFilter() and adr > minAdrValue
// Calculate the average low and average high of the previous 'lookbackCandles' candles
averageLow = ta.sma(low, lookbackCandles)
averageHigh = ta.sma(high, lookbackCandles)
// Risk and Reward Calculation
stopLossLong = averageLow
takeProfitLong = close + (close - averageLow) * riskRewardRatio
stopLossShort = averageHigh
takeProfitShort = close - (averageHigh - close) * riskRewardRatio
// Entry Control Variables
var longEntryAllowed = true
var shortEntryAllowed = true
// Update entry price on trade execution
var float entryPriceLong = na
var float entryPriceShort = na
if (strategy.position_size > 0)
if (strategy.position_size[1] <= 0)
entryPriceLong := strategy.opentrades.entry_price(strategy.opentrades - 1)
else
entryPriceLong := entryPriceLong
else
entryPriceLong := na
if (strategy.position_size < 0)
if (strategy.position_size[1] >= 0)
entryPriceShort := strategy.opentrades.entry_price(strategy.opentrades - 1)
else
entryPriceShort := entryPriceShort
else
entryPriceShort := na
// Adjust stop loss to break-even plus the defined profit when the specified risk-reward ratio is reached
breakEvenTriggerLong = entryPriceLong + (entryPriceLong - stopLossLong) * breakEvenRR
breakEvenTriggerShort = entryPriceShort - (stopLossShort - entryPriceShort) * breakEvenRR
if (longEntryAllowed and close >= breakEvenTriggerLong)
stopLossLong := entryPriceLong + breakEvenProfit
if (shortEntryAllowed and close <= breakEvenTriggerShort)
stopLossShort := entryPriceShort - breakEvenProfit
// Close all trades at 1600
if (hour == 15 and minute == 59)
strategy.close_all(comment='Close at 1600')
// Define the daily loss variable and last trade day
var float[] dailyLossArray = array.new_float(1, 0.0)
var int[] lastTradeDayArray = array.new_int(1, na)
// Function to update the daily loss
updateDailyLoss() =>
_dailyLoss = array.get(dailyLossArray, 0)
_lastTradeDay = array.get(lastTradeDayArray, 0)
if na(_lastTradeDay) or dayofmonth != _lastTradeDay
_dailyLoss := 0.0
array.set(lastTradeDayArray, 0, dayofmonth)
if not na(strategy.closedtrades.entry_bar_index(strategy.closedtrades - 1))
_dailyLoss += strategy.closedtrades.profit(strategy.closedtrades - 1)
array.set(dailyLossArray, 0, _dailyLoss)
// Call the function to update the daily loss
updateDailyLoss()
// Execute Strategy
if longCondition and longEntryAllowed
strategy.entry('Long', strategy.long)
strategy.exit('Take Profit/Stop Loss', 'Long', stop=stopLossLong, limit=takeProfitLong)
longEntryAllowed := false
if shortCondition and shortEntryAllowed
strategy.entry('Short', strategy.short)
strategy.exit('Take Profit/Stop Loss', 'Short', stop=stopLossShort, limit=takeProfitShort)
shortEntryAllowed := false
// Reset entry control variables on position close
if strategy.position_size == 0
longEntryAllowed := true
shortEntryAllowed := true
// // Statistics
// winRate = strategy.wintrades / strategy.closedtrades * 100
// totalTrades = strategy.closedtrades
// averageProfit = strategy.grossprofit / strategy.wintrades
// averageLoss = strategy.grossloss / strategy.losstrades
// // Plotting
// plot(shortEma, color=color.new(color.red, 0), title='Short EMA')
// plot(longEma, color=color.new(color.blue, 0), title='Long EMA')
// // Display Table
// table statsTable = table.new(position=position.top_right, columns=2, rows=4, bgcolor=color.gray, border_width=1)
// table.cell(statsTable, column=0, row=0, text='Win Rate (%)', bgcolor=color.blue)
// table.cell(statsTable, column=1, row=0, text=str.tostring(winRate), bgcolor=color.blue)
// table.cell(statsTable, column=0, row=1, text='Total Trades', bgcolor=color.blue)
// table.cell(statsTable, column=1, row=1, text=str.tostring(totalTrades), bgcolor=color.blue)
// table.cell(statsTable, column=0, row=2, text='Average Profit', bgcolor=color.blue)
// table.cell(statsTable, column=1, row=2, text=str.tostring(averageProfit), bgcolor=color.blue)
// table.cell(statsTable, column=0, row=3, text='Average Loss', bgcolor=color.blue)
// table.cell(statsTable, column=1, row=3, text=str.tostring(averageLoss), bgcolor=color.blue)