この戦略は,指数移動平均値 (EMA) と時間間隔を組み合わせた二方向取引システムである.このシステムは,ユーザーによって定義された固定時間間隔内でEMA関係に基づいて主要な取引方向を決定し,クロスオーバー信号のための別のEMA指標のセットをモニタリングするか,次の取引サイクルに近づいて逆向ヘッジ取引を実行し,それによって二方向取引機会を把握する.
この戦略は2つの基本メカニズムに基づいて機能します.固定間隔で主取引と柔軟なリバース取引です.主取引は,トレンドの相対的な位置に基づいてトレンド方向を判断します.5⁄40-毎分 (デフォルト30分) の間隔で取引を実行する EMA.リバース・トレードは,監視によって起動される.5⁄10- EMAクロスオーバーシグナルを1分または次のメイン取引の前に1分,いずれかが最初に発生します.すべての取引は,取引の有効性を確保するために,ユーザーによって定義された時間枠内で行われます.
この戦略は,トレンドフォローとリバース・トレードを組み合わせ,時間間隔とEMA指標の調整を通じて両方向のチャンスキャプチャを達成する包括的な戦略である.この戦略は強力なカスタマイゼーション機能とリスク制御の良き可能性を提示しているが,実際の市場状況に基づいてパラメータ最適化とリスク管理の精製を必要とする.ライブ取引の実施には,市場の特徴に基づいて徹底的なバックテストとパラメータ最適化,および特定の調整を行うことが推奨される.
/*backtest start: 2025-01-02 00:00:00 end: 2025-01-09 00:00:00 period: 3m basePeriod: 3m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=5 strategy("SPX EMA Strategy with Opposite Trades", overlay=true) // User-defined inputs tradeIntervalMinutes = input.int(30, title="Main Trade Interval (in minutes)", minval=1) oppositeTradeDelayMinutes = input.int(1, title="Opposite Trade time from next trade (in minutes)", minval=1) // Delay of opposite trade (1 min before the next trade) startHour = input.int(10, title="Start Hour", minval=0, maxval=23) startMinute = input.int(30, title="Start Minute", minval=0, maxval=59) stopHour = input.int(15, title="Stop Hour", minval=0, maxval=23) stopMinute = input.int(0, title="Stop Minute", minval=0, maxval=59) // User-defined EMA periods for main trade and opposite trade mainEmaShortPeriod = input.int(5, title="Main Trade EMA Short Period", minval=1) mainEmaLongPeriod = input.int(40, title="Main Trade EMA Long Period", minval=1) oppositeEmaShortPeriod = input.int(5, title="Opposite Trade EMA Short Period", minval=1) oppositeEmaLongPeriod = input.int(10, title="Opposite Trade EMA Long Period", minval=1) // Calculate the EMAs for main trade emaMainShort = ta.ema(close, mainEmaShortPeriod) emaMainLong = ta.ema(close, mainEmaLongPeriod) // Calculate the EMAs for opposite trade (using different periods) emaOppositeShort = ta.ema(close, oppositeEmaShortPeriod) emaOppositeLong = ta.ema(close, oppositeEmaLongPeriod) // Condition to check if it is during the user-defined time window startTime = timestamp(year, month, dayofmonth, startHour, startMinute) stopTime = timestamp(year, month, dayofmonth, stopHour, stopMinute) currentTime = timestamp(year, month, dayofmonth, hour, minute) // Ensure the script only trades within the user-defined time window isTradingTime = currentTime >= startTime and currentTime <= stopTime // Time condition: Execute the trade every tradeIntervalMinutes var float lastTradeTime = na timePassed = na(lastTradeTime) or (currentTime - lastTradeTime) >= tradeIntervalMinutes * 60 * 1000 // Entry Conditions for Main Trade longCondition = emaMainShort > emaMainLong // Enter long if short EMA is greater than long EMA shortCondition = emaMainShort < emaMainLong // Enter short if short EMA is less than long EMA // Detect EMA crossovers for opposite trade (bullish or bearish) bullishCrossoverOpposite = ta.crossover(emaOppositeShort, emaOppositeLong) // Opposite EMA short crosses above long bearishCrossoverOpposite = ta.crossunder(emaOppositeShort, emaOppositeLong) // Opposite EMA short crosses below long // Track the direction of the last main trade (true for long, false for short) var bool isLastTradeLong = na // Track whether an opposite trade has already been executed after the last main trade var bool oppositeTradeExecuted = false // Execute the main trades if within the time window and at the user-defined interval if isTradingTime and timePassed if longCondition strategy.entry("Main Long", strategy.long) isLastTradeLong := true // Mark the last trade as long oppositeTradeExecuted := false // Reset opposite trade status lastTradeTime := currentTime // label.new(bar_index, low, "Main Long", color=color.green, textcolor=color.white, size=size.small) else if shortCondition strategy.entry("Main Short", strategy.short) isLastTradeLong := false // Mark the last trade as short oppositeTradeExecuted := false // Reset opposite trade status lastTradeTime := currentTime // label.new(bar_index, high, "Main Short", color=color.red, textcolor=color.white, size=size.small) // Execute the opposite trade only once after the main trade if isTradingTime and not oppositeTradeExecuted // 1 minute before the next main trade or EMA crossover if (currentTime - lastTradeTime) >= (tradeIntervalMinutes - oppositeTradeDelayMinutes) * 60 * 1000 or bullishCrossoverOpposite or bearishCrossoverOpposite if isLastTradeLong // If the last main trade was long, enter opposite short trade strategy.entry("Opposite Short", strategy.short) //label.new(bar_index, high, "Opposite Short", color=color.red, textcolor=color.white, size=size.small) else // If the last main trade was short, enter opposite long trade strategy.entry("Opposite Long", strategy.long) //label.new(bar_index, low, "Opposite Long", color=color.green, textcolor=color.white, size=size.small) // After entering the opposite trade, set the flag to true so no further opposite trades are placed oppositeTradeExecuted := true // Plot the EMAs for visual reference plot(emaMainShort, title="Main Trade Short EMA", color=color.blue) plot(emaMainLong, title="Main Trade Long EMA", color=color.red) plot(emaOppositeShort, title="Opposite Trade Short EMA", color=color.purple) plot(emaOppositeLong, title="Opposite Trade Long EMA", color=color.orange)