Стратегия отслеживания потерь с открытой высокой и низкой остановкой

Автор:Чао Чжан, Дата: 2024-02-18 14:30:08
Тэги:

img

Обзор

Эта стратегия разработана на основе открытых, высоких и низких данных свечных графиков для выявления точек обратного тренда для входов. После входов линии остановки потерь будут установлены на основе индикатора ATR и отслеживаться. Цели также будут рассчитываться на основе соотношения риск-вознаграждение. Когда цена достигнет либо стоп-лосса, либо цели прибыли, ордера будут отправлены на закрытие позиций.

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

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

После входа динамический стоп-лосс вычисляется на основе индикатора ATR. Длинный стоп-лосс устанавливается на самом низком уровне последних N-бар минус 1 ATR; короткий стоп-лосс устанавливается на самом высоком уровне последних N-бар плюс 1 ATR. Линия стоп-лосса будет обновляться динамически для движения цены.

Целевые показатели прибыли рассчитываются на основе установки коэффициента риск-прибыль. Долгая цель устанавливается по цене входа плюс (разница риска между ценой входа и стоп-лосом умножена на коэффициент риск-прибыль); короткая цель устанавливается по цене входа минус (разница риска между стоп-лосом и ценой входа умножена на коэффициент риск-прибыль).

Когда цена достигнет стоп-лосса или цели прибыли, ордера будут отправлены на позиции.

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

Преимущества этой стратегии включают:

  1. Простые и четкие сигналы, избегая многократных ударов.

  2. Динамическая ATR-последняя остановка блокирует прибыль и предотвращает погоня за взлетами и падениями.

  3. Контроль соотношения риск-вознаграждение позволяет избежать оставления прибыли на столе и чрезмерной торговли.

  4. Применимо к различным продуктам, легко оптимизировать.

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

В этой стратегии также есть некоторые риски:

  1. Сигналы входа могут отставать до некоторой степени, не достигая лучшего входа на рынок.

  2. Стоп-лосс слишком тесный или слишком свободный, что приводит к ненужным стоп-лос или упущенной прибыли.

  3. Нет определения тренда, склонны к тому, чтобы оказаться в ловушке на различных рынках.

  4. Не в состоянии справиться с ночными позициями.

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

  1. Включите другие индикаторы тенденционного уклонения, чтобы избежать ошибок.

  2. Отрегулируйте параметры ATR или добавьте контроль волатильности для лучшего остановки потерь.

  3. Добавьте фильтрацию тенденции для уменьшения шума сигнала.

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

Заключение

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


/*backtest
start: 2024-01-01 00:00:00
end: 2024-01-31 23:59:59
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
// Open-High-Low strategy

strategy('Strategy: OLH', shorttitle="OLH", overlay=true )

// Inputs
slAtrLen = input.int(defval=14, title="ATR Period for placing SL", group="StopLoss settings")
showSLLines = input.bool(defval=false, title="Show SL lines in chart", tooltip="Show SL lines also as dotted lines in chart. Note: chart may look untidy.", group="Stolploss settings")
// Trade related
rrRatio = input.float(title='Risk:Reward', step=0.1, defval=2.0, group="Trade settings")
endOfDay = input.int(defval=1500, title="Close all trades, default is 3:00 PM, 1500 hours (integer)", group="Trade settings")
mktAlwaysOn = input.bool(defval=true, title="Markets that never closed (Crypto, Forex, Commodity)", tooltip="Some markers never closes. For those cases, make this checked.", group="Trade settings")
lotSize = input.int(title='Lot Size', step=1, defval=1, group="Trade settings")


// Utils
green(open, close) => close > open ? true : false
red(open, close) => close < open ? true : false
body(open, close) => math.abs(open - close)
lowerwick = green(open, close) ? open - low : close - low
upperwick = green(open, close) ? high - close : high - open
crange = high - low
crangep = high[1] - low[1] // previous candle's candle-range
bullish = close > open ? true : false
bearish = close < open ? true : false


// Trade signals
longCond = barstate.isconfirmed and (open == low)
shortCond = barstate.isconfirmed and (open == high)

// For SL calculation
atr = ta.atr(slAtrLen)
highestHigh = ta.highest(high, 7)
lowestLow = ta.lowest(low, 7)
longStop = showSLLines ? lowestLow - (atr * 1) : na
shortStop = showSLLines ? highestHigh + (atr * 1) : na
plot(longStop, title="Buy SL", color=color.green, style=plot.style_cross)
plot(shortStop, title="Sell SL", color=color.red, style=plot.style_cross)

// Trade execute
h = hour(time('1'), syminfo.timezone)
m = minute(time('1'), syminfo.timezone)
hourVal = h * 100 + m
totalTrades = strategy.opentrades + strategy.closedtrades
if (mktAlwaysOn or (hourVal < endOfDay))
    // Entry
    var float sl = na
    var float target = na
    if (longCond)
        strategy.entry("enter long", strategy.long, lotSize, limit=na, stop=na, comment="Enter Long")
        sl := longStop
        target := close + ((close - longStop) * rrRatio)
        alert('Buy:' + syminfo.ticker + ' ,SL:' + str.tostring(math.floor(sl)) + ', Target:' + str.tostring(target), alert.freq_once_per_bar)
    if (shortCond)
        strategy.entry("enter short", strategy.short, lotSize, limit=na, stop=na, comment="Enter Short")
        sl := shortStop
        target := close - ((shortStop - close) * rrRatio)
        alert('Sell:' + syminfo.ticker + ' ,SL:' + str.tostring(math.floor(sl)) + ', Target:' + str.tostring(target), alert.freq_once_per_bar)

    // Exit: target or SL
    if ((close >= target) or (close <= sl))
        strategy.close("enter long", comment=close < sl ? "Long SL hit" : "Long target hit")
    if ((close <= target) or (close >= sl))
        strategy.close("enter short", comment=close > sl ? "Short SL hit" : "Short target hit")
else if (not mktAlwaysOn)
    // Close all open position at the end if Day
    strategy.close_all(comment = "Close all entries at end of day.")



Больше