패러볼릭 기간 및 볼린거 대역 결합 이동 스톱 손실 전략

저자:차오장, 날짜: 2024-02-02 11:05:57
태그:

img

전반적인 설명

이 문서에서는 변동 스톱 로스 전략을 설정하기 위해 파라볼릭 페리오드 지표와 볼링거 밴드 지표를 결합한 양적 거래 전략을 소개합니다. 시장 트렌드 방향을 판단하기 위해 변동 스톱 로스 라인을 계산하고 볼링거 밴드의 상부 및 하부 레일을 사용하여 동적으로 스톱 로스 포지션을 설정함으로써 전략은 수익을 잠금하기 위해 이동 스톱 로스를 실현합니다.

전략 원칙

첫째, 이 전략은 현시장 동향을 판단하기 위해 패러볼리 지표를 사용합니다. 오늘의 종료 가격이 어제의 패러볼리 기간선을 넘을 때 시장이 상승세를 전환하고 장기화 될 수 있다고 간주됩니다. 오늘의 종료 가격이 기간선을 넘을 때 시장 전망은 하향적이며 짧을 수 있습니다.

두 번째로, 이 전략은 볼링거 밴드 지표를 결합하여 동적 스톱 로스 포지션을 설정합니다. 볼링거 밴드의 상단 레일은 과잉 구매 구역으로 볼 수 있으며, 하단 레일은 과잉 판매 구역입니다. 장기간 거래 후, 가격이 볼링거 밴드의 하단 레일 아래로 떨어지면 포지션을 닫는 스톱 로스; 단격 후, 가격이 다시 상단 레일 위로 상승하면 출구하기 위해 스톱 로스. 따라서 볼링거 밴드의 상단 레일과 하단 레일은 움직이는 스톱 로스 라인으로 변합니다.

위의 원칙을 통해 이 전략은 수익을 추적하기 위해 동적 스톱 로스 메커니즘을 설정하는 동시에 시장 방향을 판단하는 것을 실현합니다. 이것은 주요 트렌드에서 일부 상승과 하락을 포착 할 수있게하며 위험을 피하기 위해 스톱 로스를 통해 수익을 잠금 할 수 있습니다.

전략 의 장점

전통적인 스톱 로스 전략과 비교하여 고정된 스톱 로스 포지션만을 설정하는 이 전략은 볼링거 밴드 인디케이터를 스톱 로스 라인으로 사용하므로 스톱 로스 라인이 가격 변동에 따라 움직일 수 있습니다. 이것은 상대적으로 큰 움직임에서 더 많은 이익을 잠금 할 수 있습니다. 또한, 파라볼리 기간 라인을 사용하는 것과 비교하여, 이 전략은 더 정확할 수 있는 과잉 구매 및 과잉 판매 영역을 결정하기 위해 볼링거 밴드 인디케이터를 추가합니다.

위험 과 해결책

이 전략의 주요 위험은 패러볼 인디케이터의 트렌드가 강하지 않다는 것입니다. 오스실레이션 시장에서 가격은 패러볼 기간선을 여러 번 넘어서서 전략의 빈번하지만 작은 수익성있는 거래를 유발할 수 있습니다. 이 시점에서 거래 수수료와 슬리프 비용은 큰 비중을 차지하고 전략의 수익성을 감소시킬 수 있습니다.

위의 위험에 대처하기 위해 파라볼리 기간 선의 변화 정도를 증가시키기 위해 매개 변수를 조정하여 잘못된 판단 가능성을 줄일 수 있습니다. 또는 진입 시기를 필터링하기 위해 다른 지표를 결합하는 것을 고려하십시오. 예를 들어, 변동성 지표는 불필요한 거래를 줄이기 위해 시장이 추세 또는 변동하는지 결정하기 위해 추가 될 수 있습니다.

전략 최적화

이 전략은 다음과 같은 측면에서 최적화 될 수 있습니다.

  1. 패러볼 인디케이터 매개 변수를 최적화하여 인디케이터 변화 속도를 조정하여 잘못된 판단 가능성을 줄이십시오.

  2. 시장 유형을 결정하기 위해 MACD, KD를 추가하는 것과 같은 다른 기술 지표 필터링을 증가시키고, 오스실레이션 시장에서 중재를 피하십시오.

  3. 볼링거 밴드 매개 변수를 최적화하여 대역폭 매개 변수를 조정하여 볼링거 밴드가 가격 변화에 더 가깝게 붙어있게하십시오.

  4. 거래 부피와 같은 거래량 지표를 높이고, 잘못된 파장을 피하기 위해 판단에 도움이 되는 포지션

  5. 주식의 기본 요소를 결합하여 주식 보유 전략의 수익에 문제를 피합니다.

요약

이 전략은 시장 트렌드 방향과 강도를 파라볼 인디케이터와 결합하여 판단하고, 이후 볼링거 밴드의 상부 및 하부 레일을 이동 스톱 로스 위치로 사용하여 스톱 로스 전략을 설정하여 트렌드 추적 및 리스크 통제의 조합을 달성합니다. 전통적인 고정 스톱 로스 전략과 비교하면이 전략은 더 큰 움직임에서 더 높은 수익을 얻을 수 있습니다. 매개 변수를 최적화하고 다른 보조 판단 지표를 추가함으로써 전략의 안정성을 더욱 향상시키고 불필요한 거래를 줄일 수 있습니다.


/*backtest
start: 2024-01-02 00:00:00
end: 2024-02-01 00:00:00
period: 3h
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/
// © maxencetajet

//@version=5
strategy("HA_RSI", overlay=true, initial_capital=1000, default_qty_type=strategy.fixed, default_qty_value=0.5, slippage=25)

closeHA = request.security(ticker.heikinashi(syminfo.tickerid), timeframe.period, close)

useDateFilter = input.bool(true, title="Filter Date Range of Backtest",
     group="Backtest Time Period")
backtestStartDate = input(timestamp("5 June 2022"), 
     title="Start Date", group="Backtest Time Period",
     tooltip="This start date is in the time zone of the exchange " + 
     "where the chart's instrument trades. It doesn't use the time " + 
     "zone of the chart or of your computer.")
backtestEndDate = input(timestamp("5 July 2022"),
     title="End Date", group="Backtest Time Period",
     tooltip="This end date is in the time zone of the exchange " + 
     "where the chart's instrument trades. It doesn't use the time " + 
     "zone of the chart or of your computer.")

inTradeWindow = true

swingHighV = input.int(10, title="Swing High", group="number of past candles")
swingLowV = input.int(10, title="Swing Low", group="number of past candles")

emaV = input.int(200, title="Ema Period", group="EMA")

rsiV = input.int(14, title="RSI Period", group="RSI")

start = input(0.02, group="Parabolic SAR")
increment = input(0.02, group="Parabolic SAR")
maximum = input(0.2, "Max Value", group="Parabolic SAR")

ema = ta.ema(closeHA, emaV)
rsi = ta.rsi(closeHA, rsiV)
SAR = ta.sar(start, increment, maximum)

myColor = SAR < low?color.green:color.red

longcondition = closeHA > ema and rsi > 50 and closeHA[1] > SAR and closeHA[1] < SAR[1] 
shortcondition = closeHA < ema and rsi < 50 and closeHA[1] < SAR and closeHA[1] > SAR[1]

float risk_long = na
float risk_short = na
float stopLoss = na
float entry_price = na
float takeProfit = na

risk_long := risk_long[1]
risk_short := risk_short[1]

swingHigh = ta.highest(closeHA, swingHighV)
swingLow = ta.lowest(closeHA, swingLowV)

if strategy.position_size == 0 and longcondition and inTradeWindow
    risk_long := (close - swingLow) / close
    strategy.entry("long", strategy.long, comment="Buy")
    
if strategy.position_size == 0 and shortcondition and inTradeWindow
    risk_short := (swingHigh - close) / close       
    strategy.entry("short", strategy.short, comment="Sell")
    
if strategy.position_size > 0

    stopLoss := strategy.position_avg_price * (1 - risk_long)
    entry_price := strategy.position_avg_price
    strategy.exit("long exit", "long", stop = stopLoss)
    
if strategy.position_size < 0 

    stopLoss := strategy.position_avg_price * (1 + risk_short)
    entry_price := strategy.position_avg_price
    strategy.exit("short exit", "short", stop = stopLoss)

if closeHA[1] < SAR and close > strategy.position_avg_price
    strategy.close("long", comment="Exit Long")
    
if closeHA[1] > SAR and close < strategy.position_avg_price
    strategy.close("short", comment="Exit Short")

p_ep = plot(entry_price, color=color.new(color.white, 0), linewidth=2, style=plot.style_linebr, title='entry price')
p_sl = plot(stopLoss, color=color.new(color.red, 0), linewidth=2, style=plot.style_linebr, title='stopLoss')
fill(p_sl, p_ep, color.new(color.red, transp=85))

plot(SAR, "ParabolicSAR", style=plot.style_circles, color=myColor, linewidth=1)
plot(ema, color=color.white, linewidth=2, title="EMA")

더 많은