Динамическая стратегия остановки потерь

Автор:Чао Чжан, Дата: 2023-12-29 10:42:27
Тэги:

img

Обзор

Динамическая стратегия стоп-лосса - это количественная стратегия торговли, которая использует механизм стоп-лосса. Она устанавливает линию стоп-лосса на основе теории отслеживания тренда для подтверждения стоп-лосса и корректировки стоп-лосса.

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

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

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

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

  1. Непрерывно блокируйте прибыль с помощью стоп-лосса, избегая предоставления слишком большого пространства для ретраксера.

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

  3. Использовать механизм непрерывного суждения для корректировки стоп-потери с простой работой и легкой реализацией.

  4. Параметры могут быть оптимизированы в соответствии с характеристиками рынка и запасов для повышения эффективности остановки потерь.

  5. Не нужно предсказывать рыночные тенденции, просто следуйте за ними.

Риски

  1. Неправильное настройка параметров может привести либо к слишком свободной, либо к слишком тесной стоп-потере.

  2. В случае разницы в ценах, вызванной внезапными событиями, она может не остановить убытки.

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

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

Контрмеры:

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

Руководство по оптимизации

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

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

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

  4. Добавьте критерии открытых позиций с учетом таких показателей, как тренд, поддержка и сопротивление, чтобы избежать открытия позиций на различных рынках.

Заключение

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


/*backtest
start: 2023-11-28 00:00:00
end: 2023-12-17 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © Thumpyr
//@version=5

/////////////////////////////////////////////////////////////////////////////////////////////
// Comment out Strategy Line and remove // from Indicator line to turn into Indicator  //////
// Do same for alertConidction at bottom                                               //////
/////////////////////////////////////////////////////////////////////////////////////////////
strategy("PCT Trailing Stoploss-Strategy", shorttitle="PCT Trailing Stoploss- Strategy", overlay=true)
//indicator(title="PCT Trailing Stoploss- Indicator", shorttitle="PCT Trailing Stoploss - Indicator", timeframe="", timeframe_gaps=true, overlay=true)//

sellLow=input.float(.035, minval=0, title="Stop Loss Loss: 1% = .01", group="Sell Settings")
trailStopArm=input.float(.0065, minval=0, title="Trailing Stop Arm: 1%=.01", group="Sell Settings")
trailStopPct=input.float(.003, minval=0, title="Trailing Stop Trigger: 1%=.01 ", group="Sell Settings")

/////////////////////////////////////////////////
//               Indicators                    //
/////////////////////////////////////////////////
ema1Len = input.int(14, minval=1, title=" ema 1 Length", group="Trend Line Settings")
ema1Src = input(close, title="ema 1 Source", group="Trend Line Settings")
ema1 = ta.ema(ema1Src, ema1Len)
plot(ema1, title="EMA", color=color.blue)

ema2Len = input.int(22, minval=1, title=" ema 2 Length", group="Trend Line Settings")
ema2Src = input(close, title="ema 2 Source", group="Trend Line Settings")
ema2 = ta.ema(ema2Src, ema2Len)
plot(ema2, title="EMA", color=color.orange)

ema3Len = input.int(200, minval=1, title=" ema 3 Length", group="Trend Line Settings")
ema3Src = input(close, title="ema 2 Source", group="Trend Line Settings")
ema3 = ta.ema(ema3Src, ema3Len)
plot(ema3, title="EMA", color=color.gray)


/////////////////////////////
////   Buy Conditions    ////
/////////////////////////////

alertBuy = ta.crossover(ema1,ema2) and close>ema3

////////////////////////////////////////////////////////////////////
////   Filter redundant Buy Signals if Sell has not happened    ////
////////////////////////////////////////////////////////////////////
var lastsignal = 0
showAlertBuy = 0
if(alertBuy and lastsignal !=1)
    showAlertBuy  := 1
    lastsignal      := 1
buyAlert= showAlertBuy > 0


//////////////////////////////////////////////////////////////////
////          Track Conditions at buy Signal                  ////
//////////////////////////////////////////////////////////////////

alertBuyValue = ta.valuewhen(buyAlert, close,0)
alertSellValueLow = alertBuyValue - (alertBuyValue*sellLow)

////////////////////////////////////////////////////////////
/////            Trailing Stop                         /////
////////////////////////////////////////////////////////////
var TSLActive=0         //Check to see if TSL has been activated
var TSLTriggerValue=0.0 //Initial and climbing value of TSL
var TSLStop = 0.0       //Sell Trigger
var TSLRunning =0       //Continuously check each bar to raise TSL or not

//  Check if a Buy has been triggered and set initial value for TSL //
if buyAlert
    TSLTriggerValue := alertBuyValue+(alertBuyValue*trailStopArm)
    TSLActive := 0
    TSLRunning :=1
    TSLStop := TSLTriggerValue - (TSLTriggerValue*trailStopPct)
    

//  Check that Buy has triggered and if Close has reached initial TSL//  
//  Keeps from setting Sell Signal before TSL has been armed w/TSLActive//
beginTrail=TSLRunning==1 and TSLActive==0 and close>alertBuyValue+(alertBuyValue*trailStopArm) and ta.crossover(close,TSLTriggerValue)
if beginTrail
    TSLTriggerValue :=close
    TSLActive :=1
    TSLStop :=TSLTriggerValue - (TSLTriggerValue*trailStopPct)
    
//  Continuously check if TSL needs to increase and set new value //    
runTrail= TSLActive==1 and (ta.crossover(close,TSLTriggerValue) or close>=TSLTriggerValue)
if runTrail
    TSLTriggerValue :=close
    TSLStop :=TSLTriggerValue - (TSLTriggerValue*trailStopPct)
    
//  Verify that TSL is active and trigger when close cross below TSL Stop//
TSL=TSLActive==1 and (ta.crossunder(close,TSLStop) or (close[1]>TSLStop and close<TSLStop)) 

// Plot point of inital arming of TSL//
TSLTrigger=TSLActive==1 and TSLActive[1]==0
plotshape(TSLTrigger, title='TSL Armed', location=location.abovebar, color=color.new(color.blue, 0), size=size.small, style=shape.cross, text='TSL Armed')


////////////////////////////////////////////////////////////
// Plots used for troubleshooting and verification of TSL //
////////////////////////////////////////////////////////////
//plot(TSLActive,"Trailing Stop", color=#f48fb1)
//plot(TSLRunning,"Trailing Stop", color=#f48fb1)
//plot(TSLTriggerValue,"Trailing Stop Trigger", color.new(color=#ec407a, transp = TSLRunning==1 ? 0 : 100))
//plot(TSLStop,"Trailing Stop", color.new(color=#f48fb1, transp = TSLRunning==1 ? 0 : 100))//


////////////////////////////////////////////////////////////
/////             Sell Conditions                    ///////
////////////////////////////////////////////////////////////
Sell1 = TSL
Sell2 = ta.crossunder(close,alertSellValueLow)

alertSell= Sell1 or Sell2
////////////////////////////////////////////////////////////

////////////////////////////////////////////////////////////
////        Remove Redundant Signals                    ////
////////////////////////////////////////////////////////////
showAlertSell = 0
if(alertSell and lastsignal != -1)
    showAlertSell := 1
    lastsignal      := -1
sellAlert= showAlertSell > 0

if sellAlert
    TSLActive :=0
    TSLRunning :=0

/////////////////////////////////////////
//  Plot Buy and Sell Shapes on Chart  //
/////////////////////////////////////////
plotshape(buyAlert, title='Buy', location=location.belowbar, color=color.new(color.green, 0), size=size.small, style=shape.triangleup, text='Buy')
plotshape(sellAlert, title='Sell', location=location.abovebar, color=color.new(color.red, 0), size=size.small, style=shape.triangledown, text='Sell')

/////////////////////////////////////////////////////////////////////////////////////////////
//                        Remove // to setup for Indicator                                 //
/////////////////////////////////////////////////////////////////////////////////////////////
//Alerts
//alertcondition(title='Buy Alert', condition=buyAlert, message='Buy Conditions are Met')
//alertcondition(title='Sell Alert', condition=sellAlert, message='Sell Conditions are Met')
/////////////////////////////////////////////////////////////////////////////////////////////


////////////////////////////////////////////////////////////
////  Comment out this section if setup as Indicator    ////
////////////////////////////////////////////////////////////
longCondition = buyAlert
if (longCondition)
    strategy.entry("Buy", strategy.long)
    alert(message='Buy', freq=alert.freq_once_per_bar_close)
    
shortCondition = sellAlert
if (shortCondition)
    strategy.close_all(sellAlert,"Sell")
    alert(message='Sell', freq=alert.freq_once_per_bar_close)
/////////////////////////////////////////////////////////////




Больше