VWAP 및 교차 기간 신호를 기반으로 한 롱 및 숏 동적 손절매 및 손절매 전략


생성 날짜: 2024-03-08 17:37:21 마지막으로 수정됨: 2024-03-08 17:37:21
복사: 7 클릭수: 693
avatar of ChaoZhang ChaoZhang
1
집중하다
1617
수행원

VWAP 및 교차 기간 신호를 기반으로 한 롱 및 숏 동적 손절매 및 손절매 전략

개요

이 전략은 일선의 VWAP (거래량 가중 평균 가격) 을 입점과 출구의 신호로 사용한다. VWAP를 종결 가격 위에 통과할 때 더 많이 촉발하고, 상쇄 손실은 VWAP 아래의 전 K선 낮은 지점으로 설정하고, 목표 가격은 개장 가격 위 3점으로 설정한다. VWAP를 종결 가격 아래로 통과할 때 공백을 촉발하고, 상쇄 손실은 VWAP 위의 전 K선 높은 지점으로 설정하고, 목표 가격은 개장 가격 아래 3점으로 설정한다. 이 전략은 출구 조건을 포함하지 않으며, 역전 신호가 나타날 때까지 거래가 계속된다.

전략 원칙

  1. 트렌드 판단과 거래 신호의 기초로 일선의 VWAP 데이터를 얻는다.
  2. VWAP의 상하/상하를 판단하여, 상하/하하의 트리거 조건으로 판단한다.
  3. 더 많이 할 때, 만약 전 K 선의 낮은 지점이 VWAP 아래에 있다면, 그것을 중단 지점으로 사용한다. 그렇지 않으면 VWAP를 직접 중단 지점으로 사용한다.
  4. 포지션 개설 후, 각각 3개의 고정된 정지점을 설정한다.
  5. 이 전략은 역전 신호를 발동할 때까지 계속 실행되며, 새로운 포지션을 개설한다.

동적 스톱 및 고정 점 스톱을 활용하면서 주기간의 VWAP 데이터를 통해 트렌드를 판단하여 트렌드 상황을 효과적으로 파악하고, 회수 위험을 제어하고, 적시에 수익을 잠금 할 수 있습니다.

우위 분석

  1. 간단하고 효과적: 전략 논리가 명확하고, VWAP 단 하나의 지표로 트렌드 판단과 신호 트리거를 구현할 수 있으며, 간단하고 쉽게 구현 및 최적화할 수 있다.
  2. 동적 스톱: 앞의 K 선의 높고 낮은 지점에 따라 스톱을 설정하여 시장의 변동에 더 잘 적응하여 위험을 줄일 수 있다.
  3. 고정 점수 정지: 고정 점수로 목표 가격을 설정하여 수익을 적시에 고정하고 수익 회귀를 피하는 데 도움이됩니다.
  4. 적당히 막는 전략: 전략은 역전 신호가 발생했을 때 즉시 포지션을 청산하여 이미 이윤을 올린 포지션에 추가 손실을 입히지 않으며, 새로운 포지션을 개설하여 새로운 트렌드 상황을 포착합니다.

위험 분석

  1. 파라미터 최적화: 전략은 고정된 3점을 스톱으로 사용하며, 실제 거래에서는 다른 기준과 시장 특성에 따라 최적화를 해야 하며, 최적의 파라미터를 선택해야 한다.
  2. 격동상황: 격동상황에서, 빈번한 출입과 출입은 높은 거래비용으로 인해 수익에 영향을 미칠 수 있다.
  3. 트렌드 지속성: 전략은 트렌드 행태에 의존하며, 시장이 지역 흔들림이나 트렌드 지속성이 떨어지면 더 많은 거래 신호가 발생할 수 있으며 더 많은 위험을 초래할 수 있습니다.

최적화 방향

  1. 트렌드 필터: 이동 평균, MACD 등과 같은 다른 트렌드 지표를 추가하여 트렌드를 2차 확인하여 신호의 신뢰성을 높인다.
  2. 동적 정지: 시장의 변동성, ATR 등 지표에 따라 동적으로 정지 포인트를 조정하여 시장에 더 잘 적응합니다.
  3. 포지션 관리: 계좌 자금, 위험 선호 등에 따라 거래 당 포지션 크기를 동적으로 조정한다.
  4. 거래 시간 선택: 지표의 특성 및 거래 활동 정도에 따라 최적의 거래 시간을 선택하여 전략 효율성을 높인다.

요약하다

이 전략은 트렌드 판단과 신호 트리거를 위해 주기간의 VWAP 데이터를 사용하며, 동적 스톱 및 고정 점 수 스톱을 사용하여 위험을 제어하고 수익을 잠금하는 간단한 효과적 인 양적 거래 전략입니다. 트렌드 필터링, 동적 스톱, 포지션 관리 및 거래 시간 선택과 같은 측면의 최적화를 통해 전략의 안정성과 수익 잠재력을 더욱 향상시킬 수 있습니다. 그러나 실제 응용에서는 여전히 시장 특성과 거래 비용 및 변수 최적화 요소에 주의를 기울여야합니다.

전략 소스 코드
/*backtest
start: 2024-03-06 00:00:00
end: 2024-03-07 00:00:00
period: 45m
basePeriod: 5m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
strategy('Pine Script Tutorial Example Strategy 1', overlay=true, initial_capital=1000, default_qty_value=100, default_qty_type=strategy.percent_of_equity)
// fastEMA = ta.ema(close, 24)
// slowEMA = ta.ema(close, 200)
// Higher Time Frame
float sl = na
float tgt = na
posSize = 1
vwap_1d = request.security(syminfo.tickerid, "1D", ta.vwap(close))
// plot(vwap_1d)

// To avoid differences on historical and realtime bars, you can use this technique, which only returns a value from the higher timeframe on the bar after it completes:
// indexHighTF = barstate.isrealtime ? 1 : 0
// indexCurrTF = barstate.isrealtime ? 0 : 1
// nonRepaintingVWAP = request.security(syminfo.tickerid, "1D", close[indexHighTF])[indexCurrTF]
// plot(nonRepaintingVWAP, "Non-repainting VWAP")

enterLong = ta.crossover(close, vwap_1d)
exitLong  = ta.crossunder(close, vwap_1d)

enterShort = ta.crossunder(close, vwap_1d)
exitShort  = ta.crossover(close, vwap_1d)

if enterLong
    sl := low[1]>vwap_1d ?low[1]:vwap_1d
    tgt:=close+3
    strategy.entry("EL", strategy.long, qty=posSize)
    strategy.exit('exitEL', 'EL', stop=sl, limit=tgt)
if enterShort
    sl := high[1]<vwap_1d ?high[1]:vwap_1d
    tgt := close-3
    strategy.entry("ES", strategy.short, qty=posSize)
    strategy.exit('exitES', 'ES', stop=sl, limit=tgt)

// if exitLong
//     strategy.close("EL")
// if exitShort
//     strategy.close("ES")





// goLongCondition1 = ta.crossover(close, vwap_1d)
// timePeriod = time >= timestamp(syminfo.timezone, 2021, 01, 01, 0, 0)
// notInTrade = strategy.position_size <= 0
// if goLongCondition1 and timePeriod and notInTrade
//     stopLoss = low[1]
//     takeProfit = close+3
//     strategy.entry('long', strategy.long)
//     strategy.exit('exit', 'long', stop=stopLoss, limit=takeProfit)
plot(close, color=color.new(#00c510, 0))
plot(vwap_1d, color=color.new(#f05619, 0))
plot(sl, color=color.new(#fbff00, 0))
plot(tgt, color=color.new(#00e1ff, 0))