
“双ベガスチャネル波動性調整スーパートレンド量化取引戦略”は,異なるパラメータ設定の2つのベガスチャネル波動性調整スーパートレンド指標を組み合わせた高度な量化取引システムであり,市場動向をより正確に捉え,市場全体の方向に一致する取引信号を生成することを目的としています.この戦略は,波動性調整を統合し,ベガスチャネルの幅を利用してスーパートレンドの計算を最適化することで,ダイナミックに反応する取引システムを形成します.さらに,この戦略は,カスタマイズ可能なストップとストップダウスのレベルを組み合わせて,リスク管理のための堅固な枠組みを提供します.
この戦略は,最初に,特定の窓間の長さの間の閉店価格の単純移動平均 (SMA) と標準差 (STD) から派生したベガスの通路を計算します.この通路は,市場の変動性を測定するのに役立ちます.そして,調整されたスーパートレンド指標の基礎を設けている.次に,平均実際の範囲 (ATR) と調整された倍数を使用して,スーパートレンドの上昇と低下を決定します.
“双ベガスチャネル波動性調整スーパートレンド量化取引戦略”の主な利点は,変化する市場条件に合わせてスーパートレンド指標を動的に調整できるという点にある.ベガスチャネル幅を統合することにより,この戦略は市場の波動により良く対応し,トレンドの認識の正確性を向上させることができる.さらに,異なるパラメータの設定を持つ2つのスーパートレンド指標を使用することで,より全面的な市場の視点を提供し,トレンドを確認し,誤った信号をフィルターするのに役立ちます.カスタマイズ可能なストップとストップ・ロスのレベルは,戦略のリスク管理能力をさらに強化します.
この戦略は,トレンドの認識の正確性を向上させることを目的としていますが,いくつかのリスクが残っています. まず,非常に高い波動性または市場が不明な状況下では,この戦略は誤った取引信号を生成する可能性があります. 次に,あまりにも頻繁な取引は,戦略の全体的なパフォーマンスを影響する高額な取引コストを引き起こす可能性があります. これらのリスクを緩和するために,トレーダーは,ATR周期,ベガスチャネルウィンドウの長さ,スーパートレンドの倍数などの戦略パラメータを最適化することを考慮することができます.
“双ベガスチャネル波動性調整スーパートレンド量化取引戦略”は,複数の方法で最適化することができる. 一つの潜在的最適化方向は,相対的に強い指数 ((RSI) または移動平均の収束分散 ((MACD) などの他の技術指標と組み合わせて,トレンド確認の信頼性を高めるためのものです. もう一つの最適化方向は,市場状況に応じて戦略のパラメータを動的に調整する自己適応メカニズムを導入することです. これは,機械学習アルゴリズムまたはルールベースの方法を使用して実現することができます. さらに,ポジションの保持時間とストップダウスのレベルを最適化することで,戦略の全体的なパフォーマンスを向上させることができます.
全体として”,ダブルベガスチャネル波動性調整スーパートレンド量化取引戦略”は,波動性調整を統合し,ベガスチャネル幅を利用することで,トレンド認識の正確性を向上させる強力な取引システムである.この戦略は,異なるパラメータの設定を持つ2つのスーパートレンド指標を使用して,より全面的な市場視点を獲得する.この戦略は,大きな可能性を示しているが,その固有のリスクには慎重に対処する必要があります.戦略のパラメータを最適化し,他の技術指標を導入し,自己適応機構を導入することで,戦略のパフォーマンスをさらに向上させることができます.
/*backtest
start: 2024-05-01 00:00:00
end: 2024-05-31 23:59:59
period: 3h
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/
// © PresentTrading
// The "Double Vegas SuperTrend Enhanced" strategy uses two SuperTrend indicators with different ATR and Vegas Channel settings
// to identify market trends and generate trades. Trades are executed only when both SuperTrends align in the same direction.
// The strategy includes configurable take-profit and stop-loss levels, and plots the SuperTrend levels on the chart.
//@version=5
strategy("Double Vegas SuperTrend Enhanced - Strategy [presentTrading]", shorttitle="Double Vegas SuperTrend Enhanced - Strategy [presentTrading]", overlay=true, overlay = false,
precision=3, commission_value= 0.1, commission_type=strategy.commission.percent, slippage= 1, currency=currency.USD, default_qty_type = strategy.percent_of_equity,
default_qty_value = 10, initial_capital= 10000)
// Input settings allow the user to customize the strategy's parameters.
tradeDirectionChoice = input.string(title="Trade Direction", defval="Both", options=["Long", "Short", "Both"]) // Option to select the trading direction
// Settings for the first Vegas SuperTrend
atrPeriod1 = input(10, "ATR Period for SuperTrend 1") // Length of the ATR for volatility measurement
vegasWindow1 = input(100, "Vegas Window Length 1") // Length of the moving average for the Vegas Channel
superTrendMultiplier1 = input(5, "SuperTrend Multiplier Base 1") // Base multiplier for the SuperTrend calculation
volatilityAdjustment1 = input.float(5, "Volatility Adjustment Factor 1") // Factor to adjust the SuperTrend sensitivity to the Vegas Channel width
// Settings for the second Vegas SuperTrend
atrPeriod2 = input(5, "ATR Period for SuperTrend 2") // Length of the ATR for volatility measurement
vegasWindow2 = input(200, "Vegas Window Length 2") // Length of the moving average for the Vegas Channel
superTrendMultiplier2 = input(7, "SuperTrend Multiplier Base 2") // Base multiplier for the SuperTrend calculation
volatilityAdjustment2 = input.float(7, "Volatility Adjustment Factor 2") // Factor to adjust the SuperTrend sensitivity to the Vegas Channel width
// Settings for Hold Days and TPSL Conditions
useHoldDays = input.bool(true, title="Use Hold Days")
holdDays = input.int(5, title="Hold Days", minval=1, maxval=60, step=1)
TPSLCondition = input.string("None", "TPSL Condition", options=["TP", "SL", "Both", "None"])
takeProfitPerc = input(30.0, title="Take Profit (%)")
stopLossPerc = input(20.0, title="Stop Loss (%)")
// Calculate the first Vegas Channel using a simple moving average and standard deviation.
vegasMovingAverage1 = ta.sma(close, vegasWindow1)
vegasChannelStdDev1 = ta.stdev(close, vegasWindow1)
vegasChannelUpper1 = vegasMovingAverage1 + vegasChannelStdDev1
vegasChannelLower1 = vegasMovingAverage1 - vegasChannelStdDev1
// Adjust the first SuperTrend multiplier based on the width of the Vegas Channel.
channelVolatilityWidth1 = vegasChannelUpper1 - vegasChannelLower1
adjustedMultiplier1 = superTrendMultiplier1 + volatilityAdjustment1 * (channelVolatilityWidth1 / vegasMovingAverage1)
// Calculate the first SuperTrend indicator values.
averageTrueRange1 = ta.atr(atrPeriod1)
superTrendUpper1 = hlc3 - (adjustedMultiplier1 * averageTrueRange1)
superTrendLower1 = hlc3 + (adjustedMultiplier1 * averageTrueRange1)
var float superTrendPrevUpper1 = na
var float superTrendPrevLower1 = na
var int marketTrend1 = 1
// Update SuperTrend values and determine the current trend direction for the first SuperTrend.
superTrendPrevUpper1 := nz(superTrendPrevUpper1[1], superTrendUpper1)
superTrendPrevLower1 := nz(superTrendPrevLower1[1], superTrendLower1)
marketTrend1 := close > superTrendPrevLower1 ? 1 : close < superTrendPrevUpper1 ? -1 : nz(marketTrend1[1], 1)
superTrendUpper1 := marketTrend1 == 1 ? math.max(superTrendUpper1, superTrendPrevUpper1) : superTrendUpper1
superTrendLower1 := marketTrend1 == -1 ? math.min(superTrendLower1, superTrendPrevLower1) : superTrendLower1
superTrendPrevUpper1 := superTrendUpper1
superTrendPrevLower1 := superTrendLower1
// Calculate the second Vegas Channel using a simple moving average and standard deviation.
vegasMovingAverage2 = ta.sma(close, vegasWindow2)
vegasChannelStdDev2 = ta.stdev(close, vegasWindow2)
vegasChannelUpper2 = vegasMovingAverage2 + vegasChannelStdDev2
vegasChannelLower2 = vegasMovingAverage2 - vegasChannelStdDev2
// Adjust the second SuperTrend multiplier based on the width of the Vegas Channel.
channelVolatilityWidth2 = vegasChannelUpper2 - vegasChannelLower2
adjustedMultiplier2 = superTrendMultiplier2 + volatilityAdjustment2 * (channelVolatilityWidth2 / vegasMovingAverage2)
// Calculate the second SuperTrend indicator values.
averageTrueRange2 = ta.atr(atrPeriod2)
superTrendUpper2 = hlc3 - (adjustedMultiplier2 * averageTrueRange2)
superTrendLower2 = hlc3 + (adjustedMultiplier2 * averageTrueRange2)
var float superTrendPrevUpper2 = na
var float superTrendPrevLower2 = na
var int marketTrend2 = 1
// Update SuperTrend values and determine the current trend direction for the second SuperTrend.
superTrendPrevUpper2 := nz(superTrendPrevUpper2[1], superTrendUpper2)
superTrendPrevLower2 := nz(superTrendPrevLower2[1], superTrendLower2)
marketTrend2 := close > superTrendPrevLower2 ? 1 : close < superTrendPrevUpper2 ? -1 : nz(marketTrend2[1], 1)
superTrendUpper2 := marketTrend2 == 1 ? math.max(superTrendUpper2, superTrendPrevUpper2) : superTrendUpper2
superTrendLower2 := marketTrend2 == -1 ? math.min(superTrendLower2, superTrendPrevLower2) : superTrendLower2
superTrendPrevUpper2 := superTrendUpper2
superTrendPrevLower2 := superTrendLower2
// Enhanced Visualization
// Plot the SuperTrend and Vegas Channel for visual analysis for both lengths.
plot(marketTrend1 == 1 ? superTrendUpper1 : na, "SuperTrend Upper 1", color=color.green, linewidth=2)
plot(marketTrend1 == -1 ? superTrendLower1 : na, "SuperTrend Lower 1", color=color.red, linewidth=2)
plot(marketTrend2 == 1 ? superTrendUpper2 : na, "SuperTrend Upper 2", color=color.rgb(31, 119, 130), linewidth=2)
plot(marketTrend2 == -1 ? superTrendLower2 : na, "SuperTrend Lower 2", color=color.rgb(120, 42, 26), linewidth=2)
// Detect trend direction changes and plot entry/exit signals for both lengths.
trendShiftToBullish1 = marketTrend1 == 1 and marketTrend1[1] == -1
trendShiftToBearish1 = marketTrend1 == -1 and marketTrend1[1] == 1
trendShiftToBullish2 = marketTrend2 == 1 and marketTrend2[1] == -1
trendShiftToBearish2 = marketTrend2 == -1 and marketTrend2[1] == 1
// Define conditions for entering long or short positions, and execute trades based on these conditions for both lengths.
enterLongCondition1 = marketTrend1 == 1
enterShortCondition1 = marketTrend1 == -1
enterLongCondition2 = marketTrend2 == 1
enterShortCondition2 = marketTrend2 == -1
// Entry conditions: Both conditions must be met for a trade to be executed.
enterLongCondition = enterLongCondition1 and enterLongCondition2 and not na(superTrendPrevUpper1[1]) and not na(superTrendPrevUpper2[1])
enterShortCondition = enterShortCondition1 and enterShortCondition2 and not na(superTrendPrevLower1[1]) and not na(superTrendPrevLower2[1])
// Variables to track entry times
var float longEntryTime = na
var float shortEntryTime = na
// Variables to track whether we have recently exited a trade to prevent re-entry in the same trend
var bool recentlyExitedLong = false
var bool recentlyExitedShort = false
// Check trade direction choice before executing trade entries.
if (enterLongCondition and (tradeDirectionChoice == "Long" or tradeDirectionChoice == "Both"))
if (strategy.position_size < 0)
strategy.close("Short Position")
strategy.entry("Long Position", strategy.long)
longEntryTime := time
recentlyExitedLong := false
recentlyExitedShort := false
if (enterShortCondition and (tradeDirectionChoice == "Short" or tradeDirectionChoice == "Both"))
if (strategy.position_size > 0)
strategy.close("Long Position")
strategy.entry("Short Position", strategy.short)
shortEntryTime := time
recentlyExitedShort := false
recentlyExitedLong := false
// Exit conditions: Either condition being met will trigger an exit.
exitLongCondition = marketTrend1 == -1 or marketTrend2 == -1
exitShortCondition = marketTrend1 == 1 or marketTrend2 == 1
// Close positions based on exit conditions or hold days.
if (useHoldDays and not na(longEntryTime) and (time >= longEntryTime + holdDays * 86400000) and strategy.position_size > 0)
strategy.close("Long Position")
longEntryTime := na
recentlyExitedLong := true
if (useHoldDays and not na(shortEntryTime) and (time >= shortEntryTime + holdDays * 86400000) and strategy.position_size < 0)
strategy.close("Short Position")
shortEntryTime := na
recentlyExitedShort := true
if (not useHoldDays and exitLongCondition and strategy.position_size > 0)
strategy.close("Long Position")
longEntryTime := na
recentlyExitedLong := true
if (not useHoldDays and exitShortCondition and strategy.position_size < 0)
strategy.close("Short Position")
shortEntryTime := na
recentlyExitedShort := true
// Reset recently exited flags on trend change to allow re-entry on a new trend
if (trendShiftToBullish1 or trendShiftToBullish2)
recentlyExitedLong := false
if (trendShiftToBearish1 or trendShiftToBearish2)
recentlyExitedShort := false
// Conditional Profit and Loss Management
if (TPSLCondition == "TP" or TPSLCondition == "Both")
// Apply take profit conditions
strategy.exit("TakeProfit_Long", "Long Position", limit=close * (1 + takeProfitPerc / 100))
strategy.exit("TakeProfit_Short", "Short Position", limit=close * (1 - takeProfitPerc / 100))
if (TPSLCondition == "SL" or TPSLCondition == "Both")
// Apply stop loss conditions
strategy.exit("StopLoss_Long", "Long Position", stop=close * (1 - stopLossPerc / 100))
strategy.exit("StopLoss_Short", "Short Position", stop=close * (1 + stopLossPerc / 100))
// Ensure that new entry signals can override the hold days condition
if (enterLongCondition and (tradeDirectionChoice == "Long" or tradeDirectionChoice == "Both"))
if (strategy.position_size < 0)
strategy.close("Short Position")
strategy.entry("Long Position", strategy.long)
longEntryTime := time
recentlyExitedLong := false
recentlyExitedShort := false
if (enterShortCondition and (tradeDirectionChoice == "Short" or tradeDirectionChoice == "Both"))
if (strategy.position_size > 0)
strategy.close("Long Position")
strategy.entry("Short Position", strategy.short)
shortEntryTime := time
recentlyExitedShort := false
recentlyExitedLong := false