Лучшая стратегия остановки

Автор:Чао Чжан, Дата: 2021-09-21 20:58:22
Тэги:

Обзор

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

Логика стратегии

Стратегия вступает на основе двойного MA кроссоверов, судя по направлению тренда.

Инновация заключается в дизайне стоп-лосса:

  1. Стоп-триггерная линия установлена, после которой цена переходит эту линию.

  2. Линия стоп-лосса движется в зависимости от параметра процента. Например, 3% движение означает 3% ниже последнего минимума.

  3. Позиция закрывается, когда цена переворачивается, чтобы коснуться линии остановки.

Это гарантирует, что остановка будет автоматически отслеживать прибыль, снижая при этом вероятность остановки, когда прибыль все еще хороша.

Преимущества

  • Автоматическая остановка на основе процента
  • Линия запуска предотвращает преждевременную активацию
  • Динамическое отслеживание защищает прибыль
  • Избегает остановки из-за коротких ретрассов
  • Линия запуска и процентные ставки, регулируемые рынками

Риски

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

Риски могут быть уменьшены:

  • Оптимизация периодов MA для лучших записей
  • Испытание различных значений запуска для лучшего позиционирования
  • Отслеживание идеальных процентов на основе исторических вычетов
  • Рассмотрение возможности повторного вхождения для избежания пропущенных тенденций
  • Добавление фильтров для предотвращения ложных прорывов

Руководство по улучшению

Стратегия может быть улучшена путем:

  1. Оптимизация периодов двойного маркетинга

  2. Оптимизация или удаление линии запуска

    Непосредственно начать отслеживание или использовать различные значения для различных продуктов

  3. Испытание различных процентных значений задержки

    Найти оптимальные значения для различных продуктов

  4. Добавление правил повторного въезда

    Установка условий повторного входа после остановки

  5. Корректировка строгости остановки на основе волатильности

    Более широкие остановки в условиях повышенной волатильности

Резюме

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


/*backtest
start: 2022-09-14 00:00:00
end: 2023-09-20 00:00:00
period: 2d
basePeriod: 1d
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
//@author=Daveatt

SystemName = "BEST Trailing Stop Strategy"
TradeId = "BEST"

InitCapital = 100000
InitPosition = 100
InitCommission = 0.075
InitPyramidMax = 1
CalcOnorderFills = true
CalcOnTick = true
DefaultQtyType = strategy.fixed
DefaultQtyValue = strategy.fixed
Precision = 2
Overlay=true


// strategy(title=SystemName, shorttitle=SystemName, overlay=Overlay, 
//  pyramiding=InitPyramidMax, initial_capital=InitCapital, default_qty_type=DefaultQtyType, default_qty_value=InitPosition, commission_type=strategy.commission.percent, 
//  commission_value=InitCommission, calc_on_order_fills=CalcOnorderFills, calc_on_every_tick=CalcOnTick, precision=2)


src = close
// Calculate moving averages
fastSMA = sma(close, 15)
slowSMA = sma(close, 45)

// Calculate trading conditions
enterLong  = crossover(fastSMA, slowSMA)
enterShort = crossunder(fastSMA, slowSMA)

// trend states
since_buy  = barssince(enterLong)
since_sell = barssince(enterShort)
buy_trend  = since_sell > since_buy
sell_trend = since_sell < since_buy 

change_trend = (buy_trend and sell_trend[1]) or (sell_trend and buy_trend[1])

//plot(buy_trend ? 1 : 0, title='buy_trend', transp=100)
//plot(sell_trend ? 1 : 0, title='sell_trend', transp=100)

// get the entry price
entry_price = valuewhen(enterLong or enterShort, close, 0)

// Plot moving averages
plot(series=fastSMA, color=color.teal)
plot(series=slowSMA, color=color.orange)

// Plot the entries
plotshape(enterLong, style=shape.circle, location=location.belowbar, color=color.green, size=size.small)
plotshape(enterShort, style=shape.circle, location=location.abovebar, color=color.red, size=size.small)



///////////////////////////////
//======[ Trailing STOP ]======//
///////////////////////////////

// use SL?
useSL = input(true, "Use stop Loss")
// Configure trail stop level with input
StopTrailPerc = input(title="Trail Loss (%)", type=input.float, minval=0.0, step=0.1, defval=3) * 0.01
// Will trigger the take profit trailing once reached
use_SL_Trigger = input(true, "Use stop Loss Trigger")
StopTrailTrigger   = input(2.0, "SL Trigger (%)",minval=0,step=0.5,type=input.float) * 0.01


StopLossPriceTrigger = 0.0
StopLossPriceTrigger := if (use_SL_Trigger)
    if buy_trend
        entry_price * (1 + StopTrailTrigger) 
    else
        entry_price * (1 - StopTrailTrigger)
else
    -1


var SL_Trigger_Long_HIT = false
SL_Trigger_Long_HIT := useSL and use_SL_Trigger and buy_trend and high >= StopLossPriceTrigger
 ? true : SL_Trigger_Long_HIT[1]


var SL_Trigger_Short_HIT = false
SL_Trigger_Short_HIT := useSL and use_SL_Trigger and sell_trend and low <= StopLossPriceTrigger
 ? true : SL_Trigger_Short_HIT[1]


display_long_SL_trigger     = useSL and buy_trend  and use_SL_Trigger 
 and SL_Trigger_Long_HIT == false and StopLossPriceTrigger != -1
display_short_SL_trigger    = useSL and sell_trend and use_SL_Trigger 
 and SL_Trigger_Short_HIT == false and StopLossPriceTrigger != -1
display_SL_trigger          = display_long_SL_trigger or display_short_SL_trigger

plot(display_SL_trigger ? StopLossPriceTrigger : na, title='SLPriceTrigger', transp=0, 
 color=color.maroon, style=plot.style_circles, linewidth=3)


// Determine trail stop loss prices
longStopPrice = 0.0, shortStopPrice = 0.0

longStopPrice := if useSL and buy_trend
    stopValue = low * (1 - StopTrailPerc)
    max(stopValue, longStopPrice[1])
else
    0

shortStopPrice := if useSL and sell_trend
    stopValue = high * (1 + StopTrailPerc)
    min(stopValue, shortStopPrice[1])
else
    999999

//////////////////////////////////////////////////////////////////////////////////////////
//*** STOP LOSS HIT CONDITIONS TO BE USED IN ALERTS  ***//
//////////////////////////////////////////////////////////////////////////////////////////

cond_long_stop_loss_hit  = useSL and buy_trend and crossunder(low, longStopPrice[1]) 
 and (SL_Trigger_Long_HIT or use_SL_Trigger == false)
cond_short_stop_loss_hit = useSL and sell_trend and crossover(high, shortStopPrice[1]) 
 and (SL_Trigger_Short_HIT or use_SL_Trigger == false)


// Plot stop loss values for confirmation
plot(series=useSL and buy_trend and low >= longStopPrice 
 and (SL_Trigger_Long_HIT or use_SL_Trigger == false)
 ? longStopPrice : na,
 color=color.fuchsia, style=plot.style_cross,
 linewidth=2, title="Long Trail Stop")

plot(series=useSL and sell_trend and high <= shortStopPrice 
 and (SL_Trigger_Short_HIT or use_SL_Trigger == false)
 ? shortStopPrice : na,
 color=color.fuchsia, style=plot.style_cross,
 linewidth=2, title="Short Trail Stop")

close_long  = cond_long_stop_loss_hit
close_short = cond_short_stop_loss_hit

// Submit entry orders
strategy.entry(TradeId + " L", long=true, when=enterLong)
strategy.close(TradeId + " L", when=close_long)

//if (enterShort)
strategy.entry(TradeId + " S", long=false, when=enterShort)
strategy.close(TradeId + " S", when=close_short)


if change_trend
    SL_Trigger_Long_HIT := false
    SL_Trigger_Short_HIT := false


Больше