물결 트렌드 기반의 양적 거래 전략

저자:차오장, 날짜: 2023-11-28 16:17:31
태그:

img

전반적인 설명

이 전략은 웨이브 트렌드 지표에 기초하여 설계되었습니다. 웨이브 트렌드 지표는 가격 채널과 이동 평균을 결합하여 시장 트렌드를 효과적으로 식별하고 거래 신호를 생성합니다. 웨이브 트렌드 라인이 과소매 또는 과소매 상태를 나타내는 주요 수준을 넘을 때 이 전략은 긴 또는 짧은 포지션을 입력합니다.

전략 논리

  1. 가격의 삼각형 이동평균 ap를 계산하고, AP의 기하급수적인 이동평균 esa를 계산합니다.
  2. AP와 esa 사이의 절대차의 지수 이동평균 d를 계산합니다.
  3. 변동성 지표 ci를 도출합니다.
  4. 물결 트렌드 지표 wt1을 얻기 위해 ci의 n2 기간 이동 평균을 계산합니다.
  5. 과잉 구매와 과잉 판매의 경계선을 설정합니다.
  6. wt1이 과판 라인을 넘어서면 장가가 되고, wt1이 과판 라인을 넘어서면 단가가 됩니다.

이점 분석

  1. 과잉 구매/ 과잉 판매 수준의 파동 트렌드 파업은 트렌드 반전 지점을 효과적으로 잡으며 정확한 거래 신호를 생성합니다.
  2. 가격 채널과 이동 평균 이론을 결합하여 지표는 빈번한 잘못된 신호를 피합니다.
  3. 모든 기간과 다양한 거래 수단에 적용됩니다.
  4. 사용자 지정 가능한 매개 변수는 좋은 사용자 경험을 제공합니다.

위험 과 해결책

  1. 중요한 윙사브는 나쁜 신호, 높은 위험을 유발할 수 있습니다. 짧은 대기 기간을 사용할 수 있습니다.
  2. 포지션 사이즈 및 스톱 로스 메커니즘이 없습니다. 손실 위험이 있습니다. 고정된 포지션 사이즈 규칙과 이동 스톱을 설정할 수 있습니다.

최적화 방향

  1. KDJ와 MACD와 같은 다른 지표와 결합하여 전략 콤보를 형성하여 안정성을 높이는 것을 고려하십시오.
  2. 트래일링 스톱과 같은 자동 스톱 손실을 설계하고, 거래 손실에 따라 변동성을 제한합니다.
  3. 기계 학습 알고리즘을 활용하여 역사적인 데이터를 자동으로 조정하고 전략 성능을 향상시킵니다.

결론

이 전략은 웨이브 트렌드 지표를 사용하여 트렌드와 과잉 구매/ 과잉 판매 수준을 식별하여 전략에 따른 효과적인 트렌드를 형성합니다. 단기 오시레이터와 비교하면 웨이브 트렌드는 잘못된 신호를 피하고 더 나은 안정성을 제공합니다. 적절한 리스크 제어 방법으로 안정적인 이익을 얻을 수 있습니다. 매개 변수 및 모델 조정에서 더 많은 성능 증가를 기대할 수 있습니다.


/*backtest
start: 2023-11-20 00:00:00
end: 2023-11-27 00:00:00
period: 1m
basePeriod: 1m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/


//@author SoftKill21
//@version=4

strategy(title="WaveTrend strat", shorttitle="WaveTrend strategy")
n1 = input(10, "Channel Length")
n2 = input(21, "Average Length")
Overbought = input(70, "Over Bought")
Oversold = input(-30, "Over Sold ")

// BACKTESTING RANGE
 
// From Date Inputs
fromDay = input(defval = 1, title = "From Day", minval = 1, maxval = 31)
fromMonth = input(defval = 1, title = "From Month", minval = 1, maxval = 12)
fromYear = input(defval = 2001, title = "From Year", minval = 1970)
 
// To Date Inputs
toDay = input(defval = 1, title = "To Day", minval = 1, maxval = 31)
toMonth = input(defval = 12, title = "To Month", minval = 1, maxval = 12)
toYear = input(defval = 2020, title = "To Year", minval = 1970)
 
// Calculate start/end date and time condition
DST = 1 //day light saving for usa
//--- Europe
London = iff(DST==0,"0000-0900","0100-1000")
//--- America
NewYork = iff(DST==0,"0400-1500","0500-1600")
//--- Pacific
Sydney = iff(DST==0,"1300-2200","1400-2300")
//--- Asia
Tokyo = iff(DST==0,"1500-2400","1600-0100")

//-- Time In Range
timeinrange(res, sess) => time(res, sess) != 0

london = timeinrange(timeframe.period, London)
newyork = timeinrange(timeframe.period, NewYork)

startDate = timestamp(fromYear, fromMonth, fromDay, 00, 00)
finishDate = timestamp(toYear, toMonth, toDay, 00, 00)
time_cond = true //and (london or newyork)

ap = hlc3 
esa = ema(ap, n1)
d = ema(abs(ap - esa), n1)
ci = (ap - esa) / (0.015 * d)
tci = ema(ci, n2)
 
wt1 = tci
wt2 = sma(wt1,4)

plot(0, color=color.gray)
plot(Overbought, color=color.red)
plot(Oversold, color=color.green)

plot(wt1, color=color.green)
longButton = input(title="Long", type=input.bool, defval=true)
shortButton = input(title="Short", type=input.bool, defval=true)

if(longButton==true)
    strategy.entry("long",1,when=crossover(wt1,Oversold) and time_cond)
    strategy.close("long",when=crossunder(wt1, Overbought))
    
if(shortButton==true)
    strategy.entry("short",0,when=crossunder(wt1, Overbought) and time_cond)
    strategy.close("short",when=crossover(wt1,Oversold))

//strategy.close_all(when= not (london or newyork),comment="time")
if(dayofweek == dayofweek.friday)
    strategy.close_all(when= timeinrange(timeframe.period, "1300-1400"), comment="friday") 

더 많은