Лучшая стратегия трейлинг-стопа с проскальзыванием


Дата создания: 2023-09-21 20:58:22 Последнее изменение: 2023-09-21 20:58:22
Копировать: 0 Количество просмотров: 741
1
Подписаться
1617
Подписчики

Обзор

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

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

Стратегия основана на двойном равновесии, определяющем направление тренда входа, входный сигнал является быстрым равновесием на медленном равновесии.

Новое заключается в разработке механизма сдерживания убытков:

  1. Настройка стартовой линии стоп-лосса. При переходе цены через эту линию начинается отслеживание стоп-лосса.

  2. Стоп-линия отслеживает движение в соответствии с установленным скользящим процентом. Если установлена скользящая точка 3%, то стоп-линия будет ниже 3 процентов от минимальной цены.

  3. Стоп-позиции, когда цена переворачивается в отрицательном направлении и касается отслеживаемой линии стоп-потери.

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

Стратегические преимущества

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

Стратегический риск

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

Риски можно снизить следующими способами:

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

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

Эта стратегия может быть оптимизирована в следующих аспектах:

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

Тестирование различных комбинаций быстрого и медленного контактов

  1. Оптимизировать или удалить стартовую линию

Прямое включение стоп-слежения или настройка различных параметров в зависимости от разновидности

  1. Тестирование различных параметров пропорций скольжения

Поиск оптимального соотношения стоп-пойнтов для разных сортов

  1. Присоединение к механизму реадмиссии

Условия для возобновления после стоп-убыточного выхода

  1. Стойкость к убыткам в зависимости от колебаний

При усилении рыночной волатильности может быть применена соответствующая отступная.

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

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

Исходный код стратегии
/*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