Стратегия стоп-профита и стоп-лосса «Двусторонний моментум»


Дата создания: 2024-01-08 11:58:21 Последнее изменение: 2024-01-08 11:58:21
Копировать: 0 Количество просмотров: 770
1
Подписаться
1617
Подписчики

Стратегия стоп-профита и стоп-лосса «Двусторонний моментум»

Обзор

Эта стратегия является расширением на основе встроенной в TradingView последовательной стратегии повышения / снижения. Она имеет гибкую стратегию направления, которая может быть использована для обратной торговли. В то же время, интегрированы различные способы остановки, такие как колебание высоких / низких, ATR-стоп и отслеживание стоп-убытков, а также соответствующие стоп-устройства. Это позволяет этой стратегии оставаться на основе оригинальных торговых сигналов и получать лучшее управление риском.

Стратегический принцип

Эта стратегия основывается на том, чтобы определить, сколько последовательных подъемов или падений в K-линии, чтобы произвести сигналы покупки и продажи. Пользователь может настроить количество последовательных подъемов K-линий, необходимых для создания сигнала покупки, а также количество последовательных падений K-линий, необходимых для сигнала продажи.

В то же время, в стратегии добавлены параметры для обратного обращения. После открытия обратного обращения, обычный сигнал покупки превращается в сигнал продажи, а сигнал продажи превращается в сигнал покупки, таким образом, сделка завершается.

При входе и выходе стратегии поддерживают прямое обратное равновесие, что позволяет уменьшить невозможность торговли при отсутствии позиции.

С точки зрения остановки и остановки, стратегия предлагает три варианта остановки, включая колебание высоких/низких точек, ATR и встроенную в стратегию. Стоп-модуль может быть объединен с направлением удержания позиции, автоматическим выбором наименьшей долины или наивысшей вершины в качестве радикальной остановки или определением цены остановки в соответствии с динамикой ATR.

При включенном отслеживании стоп-лосса, стратегия может увеличить стоп-промежуток при убытке, уменьшить стоп-промежуток при прибыли и обеспечить автоматическое отслеживание.

Анализ преимуществ

Основным преимуществом этой стратегии является гибкость конфигурации, которая может быть адаптирована к различным рыночным условиям, а именно:

  1. Настраиваемые параметры фильтрации, адаптирующиеся к тенденциям и колебаниям
  2. Поддержка обратной торговли с возможностью выбора направления в зависимости от потребностей
  3. Настройка прямого обратного открытия позиции, уменьшающая свободные позиции
  4. Интеграция различных способов устранения убытков, по мере необходимости
  5. Можно включить отслеживание потерь, автоматическое остановка потерь

Анализ рисков

Основные риски этой стратегии заключаются в том, что слишком много последовательных K-линий может привести к упущенным торговым возможностям, а также в том, что слишком радикальные стоп-убытки могут привести к увеличению убытков. Рекомендации по риску:

  1. Настройка параметров количества линий K вверх/вниз, не слишком радикальная
  2. Испытание различных способов устранения убытков и выбор наиболее подходящего
  3. Следить за остановкой убытков следует с осторожностью, чтобы избежать чрезмерных потерь.

Направление оптимизации

В этой стратегии есть место для дальнейшей оптимизации:

  1. Количество линий K, которые могут быть динамически скорректированы вверх/вниз на основе показателей, таких как ATR или волатильность
  2. Можно проверить эффективность параметров стоп-стоп-принципа при различных периодах хранения позиций
  3. Можно установить фильтр “Открыть”, чтобы предотвратить ложные проникновения.
  4. Можно добавить другие вспомогательные показатели для оценки качества сигнала.

Подвести итог

Эта стратегия является полезным расширением базовой стратегии, позволяющей лучше контролировать риски и получать более гибкий способ торговли. Это эффективная стратегия Momentum, которую легко оптимизировать и реализовать.

Исходный код стратегии
/*backtest
start: 2023-01-07 00:00:00
end: 2023-08-30 05:20:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// Extension of the built-in strategy by Tradingview. The strategy buys after an X amount of
// consecutive bullish bars and viceversa for selling. This logic can be reversed and a Stop Loss
// with Take Profit can be added. There's also an option to adapt the SL into a Trailing Stop.

//@version=4
strategy("Consecutive Up/Down Strategy with Reverse", 
     overlay=true, 
     default_qty_type=strategy.percent_of_equity, 
     default_qty_value=100, 
     initial_capital=10000, 
     commission_value=0.04, 
     calc_on_every_tick=false, 
     slippage=0)

direction = input(0, title = "Strategy Direction", type=input.integer, minval=-1, maxval=1)
strategy.risk.allow_entry_in(direction == 0 ? strategy.direction.all : (direction < 0 ? strategy.direction.short : strategy.direction.long))

/////////////////////// STRATEGY INPUTS ////////////////////////////////////////
title1=input(true, "-----------------Strategy Inputs-------------------")  

consecutiveBarsUp = input(3)
consecutiveBarsDown = input(4)

/////////////////////// BACKTESTER /////////////////////////////////////////////
title2=input(true, "-----------------General Inputs-------------------")  

// Backtester General Inputs
i_SL=input(true, title="Use Stop Loss and Take Profit")
i_SLType=input(defval="ATR Stop", title="Type Of Stop", options=["Strategy Stop", "Swing Lo/Hi", "ATR Stop"])
i_SPL=input(defval=10, title="Swing Point Lookback")
i_PercIncrement=input(defval=2, step=.1, title="Swing Point SL Perc Increment")*0.01
i_ATR = input(14, title="ATR Length")
i_ATRMult = input(5, step=.1, title="ATR Multiple")
i_TPRRR = input(5, step=.1, title="Take Profit Risk Reward Ratio")
TS=input(true, title="Trailing Stop")

// Bought and Sold Boolean Signal
bought = strategy.position_size > strategy.position_size[1] 
 or strategy.position_size < strategy.position_size[1]

// Price Action Stop and Take Profit
LL=(lowest(i_SPL))*(1-i_PercIncrement)
HH=(highest(i_SPL))*(1+i_PercIncrement)
LL_price = valuewhen(bought, LL, 0)
HH_price = valuewhen(bought, HH, 0)
entry_LL_price = strategy.position_size > 0 ? LL_price : na 
entry_HH_price = strategy.position_size < 0 ? HH_price : na 
tp=strategy.position_avg_price + (strategy.position_avg_price - entry_LL_price)*i_TPRRR
stp=strategy.position_avg_price - (entry_HH_price - strategy.position_avg_price)*i_TPRRR

// ATR Stop
ATR=atr(i_ATR)*i_ATRMult
ATRLong = ohlc4 - ATR
ATRShort = ohlc4 + ATR
ATRLongStop = valuewhen(bought, ATRLong, 0)
ATRShortStop = valuewhen(bought, ATRShort, 0)
LongSL_ATR_price = strategy.position_size > 0 ? ATRLongStop : na 
ShortSL_ATR_price = strategy.position_size < 0 ? ATRShortStop : na 
ATRtp=strategy.position_avg_price + (strategy.position_avg_price - LongSL_ATR_price)*i_TPRRR
ATRstp=strategy.position_avg_price - (ShortSL_ATR_price - strategy.position_avg_price)*i_TPRRR


// Strategy Stop
float LongStop = na
float ShortStop = na
float StratTP = na
float StratSTP = na

/////////////////////// STRATEGY LOGIC /////////////////////////////////////////

price = close
ups = 0.0
ups := price > price[1] ? nz(ups[1]) + 1 : 0
dns = 0.0
dns := price < price[1] ? nz(dns[1]) + 1 : 0

BUY=ups >= consecutiveBarsUp and bar_index > 40
SELL=dns >= consecutiveBarsDown and bar_index > 40

//Trading Inputs
DPR=input(true, "Allow Direct Position Reverse")
reverse=input(false, "Reverse Trades")

// Entries
if reverse
    if not DPR
        strategy.entry("long", strategy.long, when=SELL and strategy.position_size == 0)
        strategy.entry("short", strategy.short, when=BUY and strategy.position_size == 0)
    else     
        strategy.entry("long", strategy.long, when=SELL)
        strategy.entry("short", strategy.short, when=BUY)
else
    if not DPR 
        strategy.entry("long", strategy.long, when=BUY and strategy.position_size == 0)
        strategy.entry("short", strategy.short, when=SELL and strategy.position_size == 0)
    else
        strategy.entry("long", strategy.long, when=BUY)
        strategy.entry("short", strategy.short, when=SELL)
        



SL= i_SLType == "Swing Lo/Hi" ? entry_LL_price : i_SLType == "ATR Stop" ? LongSL_ATR_price : LongStop
SSL= i_SLType == "Swing Lo/Hi" ? entry_HH_price : i_SLType == "ATR Stop" ? ShortSL_ATR_price : ShortStop
TP= i_SLType == "Swing Lo/Hi" ? tp : i_SLType == "ATR Stop" ? ATRtp : StratTP
STP= i_SLType == "Swing Lo/Hi" ? stp : i_SLType == "ATR Stop" ? ATRstp : StratSTP

//TrailingStop
dif=(valuewhen(strategy.position_size>0 and strategy.position_size[1]<=0, high,0))
 -strategy.position_avg_price
trailOffset     = strategy.position_avg_price - SL
var tstop = float(na)
if strategy.position_size > 0
    tstop := high- trailOffset - dif
    if tstop<tstop[1]
        tstop:=tstop[1]
else
    tstop := na
StrailOffset     = SSL - strategy.position_avg_price
var Ststop = float(na)
Sdif=strategy.position_avg_price-(valuewhen(strategy.position_size<0 
 and strategy.position_size[1]>=0, low,0))
if strategy.position_size < 0
    Ststop := low+ StrailOffset + Sdif
    if Ststop>Ststop[1]
        Ststop:=Ststop[1]
else
    Ststop := na

strategy.exit("TP & SL", "long", limit=TP, stop=TS? tstop : SL, when=i_SL)
strategy.exit("TP & SL", "short", limit=STP, stop=TS? Ststop : SSL, when=i_SL)

/////////////////////// PLOTS //////////////////////////////////////////////////


plot(i_SL and strategy.position_size > 0 and not TS ? SL : i_SL and strategy.position_size > 0 and TS ? tstop : na , title='SL', style=plot.style_cross, color=color.red)
plot(i_SL and strategy.position_size < 0 and not TS ? SSL : i_SL and strategy.position_size < 0 and TS ? Ststop : na , title='SSL', style=plot.style_cross, color=color.red)
plot(i_SL and strategy.position_size > 0 ? TP : na, title='TP', style=plot.style_cross, color=color.green)
plot(i_SL and strategy.position_size < 0 ? STP : na, title='STP', style=plot.style_cross, color=color.green)
// Draw price action setup arrows
plotshape(BUY ? 1 : na, style=shape.triangleup, location=location.belowbar, 
 color=color.green, title="Bullish Setup", size=size.auto)
plotshape(SELL ? 1 : na, style=shape.triangledown, location=location.abovebar, 
 color=color.red, title="Bearish Setup", size=size.auto)