하이-로우 스톱-로즈 트레일링 전략


생성 날짜: 2024-02-18 14:30:08 마지막으로 수정됨: 2024-02-18 14:30:08
복사: 7 클릭수: 599
avatar of ChaoZhang ChaoZhang
1
집중하다
1617
수행원

하이-로우 스톱-로즈 트레일링 전략

개요

이 전략은 K선에 대한 열고 낮은 데이터를 기반으로 엔트리를 설계하여 트렌드의 반전점을 찾습니다. 엔트리는 ATR 지표에 따라 스톱 라인을 설정하고 스톱 손실을 추적합니다. 전략은 또한 리스크 수익률에 따라 타겟 위치를 계산하여 타겟이 달성되거나 스톱 된 후에 평형합니다.

전략 원칙

이 전략의 엔트리 신호는 오픈 하위에서 나옵니다. K 라인의 오픈 가격이 최저 가격과 같을 때 구매 신호를 생성하고, 오픈 가격이 최고 가격과 같을 때 판매 신호를 생성하여, 트렌드 반전의 기회가있을 수 있음을 나타냅니다.

엔트리들은 ATR 지표에 따라 동적 추적 스톱로스를 계산한다. 구매 후의 스톱로스는 가장 최근의 N근 K선 내의 최저 가격에 ATR 1배를 다. 판매 후의 스톱로스는 가장 최근의 N근 K선 내의 최고 가격에 ATR 1배를 더한다. 스톱로스는 동적으로 업데이트되며, 가격 운행을 추적한다.

목표 수익은 설정된 리스크 수익률에 따라 계산된다. 구매 목표 가격은 엔트리 가격에 더하여 (Entry 가격과 스톱 손실 가격의 차이에 대한 리스크 수익률의 배수); 판매 목표 가격은 엔트리 가격에 빼어 (Stop 손실 가격과 엔트리 가격의 차이에 대한 리스크 수익률의 배수).

가격이 스톱로스 가격이나 목표 가격에 도달했을 때, 평점 명령을 발령한다.

우위 분석

이 전략은 다음과 같은 장점을 가지고 있습니다.

  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.")