これは,二重移動平均クロスオーバー,RSIオーバーバイト/オーバーセール条件,およびリスク・リターン比率管理を組み合わせる定量的な取引戦略である.この戦略は,より正確な取引信号フィルタリングのためにオーバーバイト/オーバーセールゾーンを識別するためにRSI指標を使用しながら,短期および長期移動平均クロスオーバーを通じて市場傾向の方向性を決定する.また,ATRベースのダイナミックストップ・ロスの設定と固定リスク・リターン比率の利益目標管理システムを統合する.
この戦略は,トレンド決定の基礎として9日および21日間の移動平均値を使用し,RSIインジケーターのオーバーバイト/オーバーセールゾーン (35/65) をシグナル確認のために使用する.ロングエントリー条件では,オーバーセール領域の長期MAとRSIより高い短期MAが要求される (35未満);ショートエントリーでは,オーバーバイト領域の長期MAとRSIより低い短期MAが要求される (65以上).この戦略は,ストップロスト距離のATR値の1.5倍を使用し,リスク・リターン比2:1に基づいて利益目標を自動的に計算する.オーバートレードを防ぐために,最低3時間の保持期間が実装される.
この戦略は,複数の技術指標の調整を通じて比較的完全な取引システムを構築する.入口信号品質だけでなく,リスク管理と利益目標設定にも焦点を当てています.最適化のための領域がある一方で,全体的なフレームワークデザインは,良い実用的な価値と拡張のための余地があり,合理的です.モジュール式デザインは,後の最適化にも便利性を提供します.
/*backtest start: 2024-10-01 00:00:00 end: 2024-10-31 23:59:59 period: 1h basePeriod: 1h exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=5 strategy("JakeJohn", overlay=true) // Input parameters smaShortLength = input(9, title="Short SMA Length") smaLongLength = input(21, title="Long SMA Length") lengthRSI = input(14, title="RSI Length") rsiOverbought = input(65, title="RSI Overbought Level") rsiOversold = input(35, title="RSI Oversold Level") riskRewardRatio = input(2, title="Risk/Reward Ratio") // 2:1 atrMultiplier = input(1.5, title="ATR Multiplier") // Multiplier for ATR to set stop loss // Calculate indicators smaShort = ta.sma(close, smaShortLength) smaLong = ta.sma(close, smaLongLength) rsi = ta.rsi(close, lengthRSI) atr = ta.atr(14) // Entry conditions longCondition = (smaShort > smaLong) and (rsi < rsiOversold) // Buy when short SMA is above long SMA and RSI is oversold shortCondition = (smaShort < smaLong) and (rsi > rsiOverbought) // Sell when short SMA is below long SMA and RSI is overbought // Variables for trade management var float entryPrice = na var float takeProfit = na var int entryBarIndex = na // Entry logic for long trades if (longCondition and (strategy.position_size == 0)) entryPrice := close takeProfit := entryPrice + (entryPrice - (entryPrice - (atr * atrMultiplier))) * riskRewardRatio strategy.entry("Buy", strategy.long) entryBarIndex := bar_index // Record the entry bar index label.new(bar_index, high, "BUY", style=label.style_label_up, color=color.green, textcolor=color.white, size=size.small) // Entry logic for short trades if (shortCondition and (strategy.position_size == 0)) entryPrice := close takeProfit := entryPrice - (entryPrice - (entryPrice + (atr * atrMultiplier))) * riskRewardRatio strategy.entry("Sell", strategy.short) entryBarIndex := bar_index // Record the entry bar index label.new(bar_index, low, "SELL", style=label.style_label_down, color=color.red, textcolor=color.white, size=size.small) // Manage trade duration and exit after a minimum of 3 hours if (strategy.position_size != 0) // Check if the trade has been open for at least 3 hours (180 minutes) if (bar_index - entryBarIndex >= 180) // 3 hours in 1-minute bars if (strategy.position_size > 0) strategy.exit("Take Profit Long", from_entry="Buy", limit=takeProfit) else strategy.exit("Take Profit Short", from_entry="Sell", limit=takeProfit) // Background colors for active trades var color tradeColor = na if (strategy.position_size > 0) tradeColor := color.new(color.green, 90) // Light green for long trades else if (strategy.position_size < 0) tradeColor := color.new(color.red, 90) // Light red for short trades else tradeColor := na // No color when no trade is active bgcolor(tradeColor, title="Trade Background") // Plotting position tools if (strategy.position_size > 0) // Plot long position tool strategy.exit("TP Long", limit=takeProfit) if (strategy.position_size < 0) // Plot short position tool strategy.exit("TP Short", limit=takeProfit) // Plotting indicators plot(smaShort, color=color.green, title="Short SMA", linewidth=2) plot(smaLong, color=color.red, title="Long SMA", linewidth=2) // Visual enhancements for RSI hline(rsiOverbought, "Overbought", color=color.red) hline(rsiOversold, "Oversold", color=color.green) plot(rsi, color=color.blue, title="RSI", linewidth=2) // Ensure there's at least one plot function plot(close, color=color.black, title="Close Price", display=display.none) // Hidden plot for compliance