피벗 포인트와 경사도를 기반으로 한 실시간 추세선 거래

ATR ADX MA
생성 날짜: 2024-04-26 15:34:28 마지막으로 수정됨: 2024-04-26 15:34:28
복사: 2 클릭수: 859
avatar of ChaoZhang ChaoZhang
1
집중하다
1617
수행원

피벗 포인트와 경사도를 기반으로 한 실시간 추세선 거래

개요

이 전략은 지점 ((PivotHigh와 PivotLow) 을 사용하여 가격의 변동적 고점과 낮은 점을 식별하고, 이를 기반으로 상향과 하향의 트렌드 라인을 그리는 것이다. 트렌드 라인의 기울기는 ATR ((Average True Range)), 표준차 또는 선형 회귀와 같은 방법으로 계산되고, 기울기 인자에 의해 조정된다. 가격이 트렌드 라인을 뚫을 때 이 전략은 구매 또는 판매 신호를 발생시킨다.

전략 원칙

  1. ta.pivothigh() 와 ta.pivotlow() 함수를 사용하여 과거 일정 주기 동안의 변동 고점 ((ph) 과 변동 저점 ((pl) 을 검출한다.
  2. 선택된 계산 방법 ((ATR, 표준편차 또는 선형 회귀) 에 따라 트렌드 라인의 기울기를 계산하고 기울기 인수 ((mult) 로 조정한다.
  3. 기울기와 지점 가격을 사용하여 상향 트렌드 라인 (upper) 과 하향 트렌드 라인 (lower) 의 현재 값을 계산한다.
  4. 현재 마감 가격이 트렌드 라인을 뚫었는지 여부를 판단합니다. 마감 가격이 상향 트렌드 라인보다 높다면 상향 브레이크 신호를 생성합니다. 마감 가격이 하향 트렌드 라인보다 낮다면 하향 브레이크 신호를 생성합니다.
  5. 그래프에 트렌드 라인을 그리고, 트렌드 라인을 연장할 것인지 선택할 수 있습니다.
  6. 브레이크 신호에 따라 거래한다: 상향으로 브레이크하여 더 많은 상표를 열고, 아래로 브레이크하여 공백 상표를 열다.

전략적 이점

  1. 이 전략은 가격 행동의 객관적 사실 (지점과 트렌드 라인) 에 기초하여 거래 신호를 생성하며, 어느 정도의 신뢰성과 안정성을 갖는다.
  2. 트렌드 라인의 기울기는 시장의 변동성에 따라 동적으로 조정되어 다른 시장 환경에 적응할 수 있습니다.
  3. 사용자가 경사 계산 방법과 파라미터 설정을 유연하게 선택하여 전략의 성능을 최적화할 수 있다.
  4. 전략은 실시간 신호와 지연 신호 두 가지 모드를 제공하여 다양한 사용자의 요구를 충족시킬 수 있습니다.
  5. 내장된 경보 기능은 사용자가 거래 기회를 신속하게 얻을 수 있도록 도와줍니다.

전략적 위험

  1. 불안정한 시장이나 추세가 불명확할 때, 이 전략은 빈번하게 잘못된 신호를 발생시켜 수익성을 떨어뜨릴 수 있다.
  2. 전략의 성과는 파라미터 설정에 의존하며, 부적절한 파라미터는 전략의 실패 또는 과도한 거래를 초래할 수 있다.
  3. 지연 신호 모드에서는, 재검토가 존재하기 때문에 실제 거래 결과가 역사 테스트 결과와 차이가 있을 수 있다.

전략 최적화 방향

  1. 트렌드 라인 브레이크 신호를 확인하고 신호의 품질을 향상시키기 위해 거래량, 변동율 등과 같은 기술 지표 또는 가격 행동 특성을 더 많이 도입하십시오.
  2. 거래 신호를 필터링하여 트렌드 라인 돌파의 지속 시간, 돌파의 크기를 고려하여 가짜 신호를 줄이십시오.
  3. 포지션 관리 및 리스크 관리를 최적화하여, 시장 추세 강도 또는 변동률에 따라 포지션 크기를 조정하고, 합리적인 스톱 로즈 및 스톱 포지션을 설정합니다.
  4. 매개 변수를 최적화하기 위해, 예를 들어 기계 학습이나 최적화 알고리즘을 사용하여 최적의 매개 변수 조합을 찾습니다.

요약하다

이 전략은 지점과 트렌드 라인 슬라이드를 활용하여 실시간 트렌드 라인 거래 시스템을 구축한다. 트렌드 라인 돌파 사건을 포착함으로써 전략은 트렌드 형성 초기 단계에서 거래 할 수 있다. 이 전략은 장점이 있기는 하지만, 흔들리는 시장에서의 위험을 주의해야 하며, 더 많은 정보를 도입하고, 신호 필터링과 포지션 관리 등을 최적화함으로써 전략의 안정성과 수익성을 더욱 향상시킬 필요가 있다.

전략 소스 코드
/*backtest
start: 2023-04-20 00:00:00
end: 2024-04-25 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
strategy(" only Ajay ", overlay=true)

//------------------------------------------------------------------------------
//Settings
//------------------------------------------------------------------------------{
length = input.int(14, 'Swing Detection Lookback')
mult = input.float(1., 'Slope', minval = 0, step = .1)
calcMethod = input.string('Atr', 'Slope Calculation Method', options = ['Atr','Stdev','Linreg'])
backpaint = input(true, tooltip = 'Backpainting offset displayed elements in the past. Disable backpainting to see real time information returned by the indicator.')

//Style
upCss = input.color(color.teal, 'Up Trendline Color', group = 'Style')
dnCss = input.color(color.red, 'Down Trendline Color', group = 'Style')
showExt = input(true, 'Show Extended Lines')

//------------------------------------------------------------------------------}
//Calculations
//------------------------------------------------------------------------------{
var upper = 0.
var lower = 0.
var slope_ph = 0.
var slope_pl = 0.

var offset = backpaint ? length : 0

n = bar_index
src = close

ph = ta.pivothigh(length, length)
pl = ta.pivotlow(length, length)

//Slope Calculation Method
slope = switch calcMethod
    'Atr'    => ta.atr(length) / length * mult
    'Stdev'  => ta.stdev(src,length) / length * mult
    'Linreg' => math.abs(ta.sma(src * n, length) - ta.sma(src, length) * ta.sma(n, length)) / ta.variance(n, length) / 2 * mult

//Get slopes and calculate trendlines
slope_ph := ph ? slope : slope_ph
slope_pl := pl ? slope : slope_pl

upper := ph ? ph : upper - slope_ph
lower := pl ? pl : lower + slope_pl

var upos = 0
var dnos = 0
upos := ph ? 0 : close > upper - slope_ph * length ? 1 : upos
dnos := pl ? 0 : close < lower + slope_pl * length ? 1 : dnos

//------------------------------------------------------------------------------}
//Extended Lines
//------------------------------------------------------------------------------{
// var uptl  = line.new(na,na,na,na, color = upCss, style = line.style_dashed, extend = extend.right)
// var dntl  = line.new(na,na,na,na, color = dnCss, style = line.style_dashed, extend = extend.right)

// if ph and showExt
//     uptl.set_xy1(n-offset, backpaint ? ph : upper - slope_ph * length)
//     uptl.set_xy2(n-offset+1, backpaint ? ph - slope : upper - slope_ph * (length+1))

// if pl and showExt
//     dntl.set_xy1(n-offset, backpaint ? pl : lower + slope_pl * length)
//     dntl.set_xy2(n-offset+1, backpaint ? pl + slope : lower + slope_pl * (length+1))

//------------------------------------------------------------------------------}
//Plots
//------------------------------------------------------------------------------{
plot(backpaint ? upper : upper - slope_ph * length, 'Upper', color = ph ? na : upCss, offset = -offset)
plot(backpaint ? lower : lower + slope_pl * length, 'Lower', color = pl ? na : dnCss, offset = -offset)

//Breakouts
upBreakout = upos > upos[1]
dnBreakout = dnos > dnos[1]

if (upBreakout)
    strategy.entry("Up Breakout", strategy.long)

if (dnBreakout)
    strategy.entry("Down Breakout", strategy.short)

//------------------------------------------------------------------------------}
//Alerts
//------------------------------------------------------------------------------{
alertcondition(upos > upos[1], 'Upward Breakout', 'Price broke the down-trendline upward')
alertcondition(dnos > dnos[1], 'Downward Breakout', 'Price broke the up-trendline downward')

//------------------------------------------------------------------------------}