この戦略は,平均真の範囲 (ATR) 指標に基づいて移動するストップ損失線と逆転線を設計する.これは価格動きに基づいてストップ損失を追います.特に,価格動きが1%を超えると,ストップ損失は固定比例で利益方向に移動します.価格がストップ損失線を突破すると,ポジションは自動的に閉鎖されます.これは利益をロックし損失を減らすことができます.
この戦略は,ストップ・ロスの線を計算するためにATRインジケーターを使用します. 具体的な式は以下の通りです.
atr = multplierFactor * atr(barsBack)
longStop = hl2 - atr
shortStop = hl2 + atr
倍数因子はATR倍数であり,バーはATR期間である.ATR値が大きいほど,市場の変動は大きい.
ロングストップとショートストップストップストップ損失線は,ATR値に基づいて計算されます.価格がこれらの2つのラインを超えると取引信号が起動します.
さらに,傾向の方向を決定するための方向変数も導入されます.
direction = 1
direction := nz(direction[1], direction)
direction := direction == -1 and close > shortStopPrev ? 1 : direction == 1 and close < longStopPrev ? -1 : direction
方向が1なら,上昇傾向を示します.方向が-1なら,下落傾向を示します.
方向変数値に基づいて,異なる色のストップ損失線が描かれます.
if (direction == 1)
valueToPlot := longStop
colorToPlot := color.green
else
valueToPlot := shortStop
colorToPlot := color.red
これは現在のトレンド方向とストップ・ロスの位置を明確に示しています
この戦略の鍵となる点は,価格動きに基づいてリアルタイムでストップ・ロスを調整できるストップ・ロスのメカニズムを導入することです.
具体的な論理は
strategyPercentege = (close - updatedEntryPrice) / updatedEntryPrice * 100.00
rideUpStopLoss = hasOpenTrade() and strategyPercentege > 1
if (rideUpStopLoss)
stopLossPercent := stopLossPercent + strategyPercentege - 1.0
newStopLossPrice = updatedEntryPrice + (updatedEntryPrice * stopLossPercent) / 100
stopLossPrice := max(stopLossPrice, newStopLossPrice)
updatedEntryPrice := stopLossPrice
価格がエントリー価格に比べて1%以上上昇すると,ストップロスは上昇します.調整範囲は1%を超えた部分です.
損失を減らしながら 利益を増やすことができます
伝統的な移動ストップ損失戦略と比較して,この戦略の最大の利点は,市場の状況に応じてストップ損失ラインを動的に調整できるということです.具体的な利点は:
トレンド市場での利益固定を高めること
ストップ・ロスのメカニズムは,ストップ・ロスの線が利益の方向に進むことを可能にします.これは,市場が強くなっていれば,より高い利益をロックします.
ストップ・ロスのギャップを制限する市場におけるリスクを減らす
市場の動向が変化すると,固定移動ストップ損失はスキップされる傾向があります.この戦略のストップ損失線は,価格変動を合理的に追跡し,統合でスキップされないようにできる市場の変動に基づいて計算されます.
操作が簡単で 自動化も簡単
この戦略は,複雑なトレンド判断論理なしで,完全に指標計算に基づいています.それは簡単に自動化することができます.
異なる製品に適した調整可能なパラメータ
ATR期間,倍数因子,ストップ損失パーセントなどのパラメータはカスタマイズできます.戦略は,より汎用化するために異なる製品に最適化できます.
この戦略には多くの利点がありますが,以下のリスクは注意すべきです.
トレンド逆転点を特定できないため,高値で購入し,低値で販売するリスクがあります
この戦略には,トレンドが終わったかどうかを判断する論理はありません.それは高値で買い,低値で売る傾向があります.
不適切なパラメータ設定は損失を増幅する可能性があります.
ATR 期間パラメータがあまりにも短く設定された場合,ストップ・ロスは過度に敏感になり,変動する市場によって頻繁に引き起こす可能性があります.
底部漁業のリバウンドを止められるリスク
この戦略は,ストップ・ロスのサポートとして重要なポイントを考慮しない.したがって,短期的な引き下げ時に市場から外される可能性があります.
上記のリスクに対処するために,最適化は次の側面で行うことができます:
傾向の逆転を事前に予測するための傾向フィルタリング指標を組み込む
最適なパラメータ組み合わせを選択するためのパラメータ最適化テスト
ストップ・ロスの範囲を特定のサポートレベルに近い範囲に拡大する
この戦略をさらに最適化できる余地があります.
ろうそくのパターン認識を組み込む
トレンド逆転の可能性を判断するために,ダイバージェンスや落星のような典型的なキャンドルスタイクパターンを特定します.これは高い価格で購入し,低い価格で販売するリスクを回避することができます.
トレイリングパラメータのダイナミック最適化
ATR 期間や倍数因子などのパラメータが動的に変化することを許可します.大きく変動する市場では,より長い ATR 期間とより広いストップ損失範囲を使用します.
機械学習モデルを組み込む
LSTM,RNN,その他のディープラーニングモデルを使用して,将来の価格範囲を予測し,ストップ損失距離を動的に調整します.
概要すると,この戦略はATRインジケーターを使用して移動型ストップ損失線を設計し,市場の変化に基づいてリアルタイムでストップ損失ポジションを調整できるトレーリングストップ損失メカニズムを導入します. これにより,リスクを減らすと同時により高い利益ロックを達成できます.さらなる最適化により,この戦略はさまざまな市場状況により適応し,強力な取引戦略として機能することができます.
/*backtest start: 2022-11-21 00:00:00 end: 2023-11-27 00:00:00 period: 1d basePeriod: 1h exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=4 // // ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ // ----------------------------------------------------------------------------- // Copyright 2019 Mauricio Pimenta | exit490 // SuperTrend with Trailing Stop Loss script may be freely distributed under the MIT license. // // Permission is hereby granted, free of charge, // to any person obtaining a copy of this software and associated documentation files (the "Software"), // to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, // publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, // subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, // DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // // ----------------------------------------------------------------------------- // // Authors: @exit490 // Revision: v1.0.0 // Date: 5-Aug-2019 // // Description // =========== // SuperTrend is a moving stop and reversal line based on the volatility (ATR). // The strategy will ride up your stop loss when price moviment 1%. // The strategy will close your operation when the market price crossed the stop loss. // The strategy will close operation when the line based on the volatility will crossed // // The strategy has the following parameters: // // INITIAL STOP LOSS - Where can isert the value to first stop. // POSITION TYPE - Where can to select trade position. // ATR PERIOD - To select number of bars back to execute calculation // ATR MULTPLIER - To add a multplier factor on volatility // BACKTEST PERIOD - To select range. // // ----------------------------------------------------------------------------- // Disclaimer: // 1. I am not licensed financial advisors or broker dealers. I do not tell you // when or what to buy or sell. I developed this software which enables you // execute manual or automated trades multplierFactoriplierFactoriple trades using TradingView. The // software allows you to set the criteria you want for entering and exiting // trades. // 2. Do not trade with money you cannot afford to lose. // 3. I do not guarantee consistent profits or that anyone can make money with no // effort. And I am not selling the holy grail. // 4. Every system can have winning and losing streaks. // 5. Money management plays a large role in the results of your trading. For // example: lot size, account size, broker leverage, and broker margin call // rules all have an effect on results. Also, your Take Profit and Stop Loss // settings for individual pair trades and for overall account equity have a // major impact on results. If you are new to trading and do not understand // these items, then I recommend you seek education materials to further your // knowledge. // // YOU NEED TO FIND AND USE THE TRADING SYSTEM THAT WORKS BEST FOR YOU AND YOUR // TRADING TOLERANCE. // // I HAVE PROVIDED NOTHING MORE THAN A TOOL WITH OPTIONS FOR YOU TO TRADE WITH THIS PROGRAM ON TRADINGVIEW. // // I accept suggestions to improve the script. // If you encounter any problems I will be happy to share with me. // ----------------------------------------------------------------------------- // // ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ // strategy(title = "SUPERTREND ATR WITH TRAILING STOP LOSS", shorttitle = "SUPERTREND ATR WITH TSL", overlay = true, precision = 8, calc_on_order_fills = true, calc_on_every_tick = true, backtest_fill_limits_assumption = 0, default_qty_type = strategy.percent_of_equity, default_qty_value = 100, initial_capital = 1000, currency = currency.USD, linktoseries = true) // // ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ // // === BACKTEST RANGE === backTestSectionFrom = input(title = "═══════════════ FROM ═══════════════", defval = true, type = input.bool) FromMonth = input(defval = 1, title = "Month", minval = 1) FromDay = input(defval = 1, title = "Day", minval = 1) FromYear = input(defval = 2019, title = "Year", minval = 2014) backTestSectionTo = input(title = "════════════════ TO ════════════════", defval = true, type = input.bool) ToMonth = input(defval = 31, title = "Month", minval = 1) ToDay = input(defval = 12, title = "Day", minval = 1) ToYear = input(defval = 9999, title = "Year", minval = 2014) backTestPeriod() => (time > timestamp(FromYear, FromMonth, FromDay, 00, 00)) and (time < timestamp(ToYear, ToMonth, ToDay, 23, 59)) // // ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ // parameterSection = input(title = "═════════════ STRATEGY ═════════════", defval = true, type = input.bool) // === INPUT TO SELECT POSITION === positionType = input(defval="LONG", title="Position Type", options=["LONG", "SHORT"]) // === INPUT TO SELECT INITIAL STOP LOSS initialStopLossPercent = input(defval = 3.0, minval = 0.0, title="Initial Stop Loss") // === INPUT TO SELECT BARS BACK barsBack = input(title="ATR Period", defval=1) // === INPUT TO SELECT MULTPLIER FACTOR multplierFactor = input(title="ATR multplierFactoriplier", step=0.1, defval=3.0) // // ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ // // LOGIC TO FIND DIRECTION WHEN THERE IS TREND CHANGE ACCORDING VOLATILITY atr = multplierFactor * atr(barsBack) longStop = hl2 - atr longStopPrev = nz(longStop[1], longStop) longStop := close[1] > longStopPrev ? max(longStop, longStopPrev) : longStop shortStop = hl2 + atr shortStopPrev = nz(shortStop[1], shortStop) shortStop := close[1] < shortStopPrev ? min(shortStop, shortStopPrev) : shortStop direction = 1 direction := nz(direction[1], direction) direction := direction == -1 and close > shortStopPrev ? 1 : direction == 1 and close < longStopPrev ? -1 : direction longColor = color.blue shortColor = color.blue var valueToPlot = 0.0 var colorToPlot = color.white if (direction == 1) valueToPlot := longStop colorToPlot := color.green else valueToPlot := shortStop colorToPlot := color.red // // ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ // // // === GLOBAL VARIABLES AND FUNCTIONS TO STORE IMPORTANT CONDITIONALS TO TRAILING STOP hasEntryLongConditional() => direction == 1 hasCloseLongConditional() => direction == -1 hasEntryShortConditional() => direction == -1 hasCloseShortConditional() => direction == 1 stopLossPercent = positionType == "LONG" ? initialStopLossPercent * -1 : initialStopLossPercent var entryPrice = 0.0 var updatedEntryPrice = 0.0 var stopLossPrice = 0.0 hasOpenTrade() => strategy.opentrades != 0 notHasOpenTrade() => strategy.opentrades == 0 strategyClose() => if positionType == "LONG" strategy.close("LONG", when=true) else strategy.close("SHORT", when=true) strategyOpen() => if positionType == "LONG" strategy.entry("LONG", strategy.long, when=true) else strategy.entry("SHORT", strategy.short, when=true) isLong() => positionType == "LONG" ? true : false isShort() => positionType == "SHORT" ? true : false // // ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ // // // === LOGIC TO TRAILING STOP IN LONG POSITION if (isLong() and backTestPeriod()) crossedStopLoss = close <= stopLossPrice terminateOperation = hasOpenTrade() and (crossedStopLoss or hasCloseLongConditional()) if (terminateOperation) entryPrice := 0.0 updatedEntryPrice := entryPrice stopLossPrice := 0.0 strategyClose() startOperation = notHasOpenTrade() and hasEntryLongConditional() if(startOperation) entryPrice := close updatedEntryPrice := entryPrice stopLossPrice := entryPrice + (entryPrice * stopLossPercent) / 100 strategyOpen() strategyPercentege = (close - updatedEntryPrice) / updatedEntryPrice * 100.00 rideUpStopLoss = hasOpenTrade() and strategyPercentege > 1 if (isLong() and rideUpStopLoss) stopLossPercent := stopLossPercent + strategyPercentege - 1.0 newStopLossPrice = updatedEntryPrice + (updatedEntryPrice * stopLossPercent) / 100 stopLossPrice := max(stopLossPrice, newStopLossPrice) updatedEntryPrice := stopLossPrice // // ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ // // // === LOGIC TO TRAILING STOP IN SHORT POSITION if (isShort() and backTestPeriod()) crossedStopLoss = close >= stopLossPrice terminateOperation = hasOpenTrade() and (crossedStopLoss or hasCloseShortConditional()) if (terminateOperation) entryPrice := 0.0 updatedEntryPrice := entryPrice stopLossPrice := 0.0 strategyClose() startOperation = notHasOpenTrade() and hasEntryShortConditional() if(startOperation) entryPrice := close updatedEntryPrice := entryPrice stopLossPrice := entryPrice + (entryPrice * stopLossPercent) / 100 strategyOpen() strategyPercentege = (close - updatedEntryPrice) / updatedEntryPrice * 100.00 rideDownStopLoss = hasOpenTrade() and strategyPercentege < -1 if (rideDownStopLoss) stopLossPercent := stopLossPercent + strategyPercentege + 1.0 newStopLossPrice = updatedEntryPrice + (updatedEntryPrice * stopLossPercent) / 100 stopLossPrice := min(stopLossPrice, newStopLossPrice) updatedEntryPrice := stopLossPrice // // ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ // // === DRAWING SHAPES entryPricePlotConditinal = entryPrice == 0.0 ? na : entryPrice trailingStopLossPlotConditional = stopLossPrice == 0.0 ? na : stopLossPrice plotshape(entryPricePlotConditinal, title= "Entry Price", color=color.blue, style=shape.circle, location=location.absolute, size=size.tiny) plotshape(trailingStopLossPlotConditional, title= "Stop Loss", color=color.red, style=shape.circle, location=location.absolute, size=size.tiny) plot(valueToPlot == 0.0 ? na : valueToPlot, title="BuyLine", linewidth=2, color=colorToPlot) plotshape(direction == 1 and direction[1] == -1 ? longStop : na, title="Buy", style=shape.labelup, location=location.absolute, size=size.normal, text="Buy", transp=0, textcolor = color.white, color=color.green, transp=0) plotshape(direction == -1 and direction[1] == 1 ? shortStop : na, title="Sell", style=shape.labeldown, location=location.absolute, size=size.normal, text="Sell", transp=0, textcolor = color.white, color=color.red, transp=0) alertcondition(direction == 1 and direction[1] == -1 ? longStop : na, title="Buy", message="Buy!") alertcondition(direction == -1 and direction[1] == 1 ? shortStop : na, title="Sell", message="Sell!")