오픈 하이스 로프 스톱 로스 추적 전략

저자:차오장, 날짜: 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일 1일 직장을 처리할 수 없습니다.

최적화 방향은 다음과 같습니다.

  1. 추세 편향을 위한 다른 지표들을 포함시켜 화이트사 (wipssaws) 를 피합니다.

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



더 많은