압축 모멘텀 지표를 기반으로 한 추세 추종 전략


생성 날짜: 2023-11-13 17:46:01 마지막으로 수정됨: 2023-11-13 17:46:01
복사: 0 클릭수: 883
avatar of ChaoZhang ChaoZhang
1
집중하다
1617
수행원

압축 모멘텀 지표를 기반으로 한 추세 추종 전략

개요

이 전략은 LazyBear의 압축 동력 지표에 기반하여, 브린 벨트와 켈트너 채널과 결합하여, 가격 돌파 채널이 형성된 압축과 확장 형태를 식별하고, 주식 가격의 잠재적인 트렌드 방향을 판단하고, 트렌드 추적 방식을 사용하여 포지션 방향을 결정한다. 전략의 장점은 동력 지표의 잠재적인 트렌드를 식별하는 능력을 최대한 활용하고, 거래 신호의 질을 제어하기 위해 여러 조건 필터를 설정하여, 불확실한 거래 신호를 효과적으로 필터링하여, 흔들림 상반에서 너무 자주 거래되는 것을 피한다.

전략 원칙

  1. 브린 벨트에서 중간, 상단, 하단 궤도를 계산한다. 중간 궤도는 n일 종결 가격의 간단한 이동 평균이며, 상단, 하단 궤도는 중간 궤도 더하기 m배의 n일 종결 가격의 표준 차이다.

  2. 켈트너 통로의 중선, 상선 및 하선 △ 중선은 n일 종전 가격의 간단한 이동 평균, 상선 및 하선은 중선 △ m배의 n일 실제 파장의 간단한 이동 평균이다.

  3. 가격의 부린 띠와 켈트너 통로의 상하 궤도를 돌파했는지 여부를 판단하는 것은 압축 및 확장 형태를 구성한다. 가격이 위쪽에서 하하 궤도를 돌파 할 때 압축 형태이며, 가격이 아래쪽에서 상하 궤도를 돌파 할 때 확장 형태이다.

  4. 동력 지표로서 선형 회귀 곡선의 수치를 계산한다. 동력 선 상단 0을 통과하면 구매 신호이며, 아래 0을 통과하면 판매 신호이다.

  5. 압축 확장 형태, 동력 지표 방향, 평균 필터 등의 여러 조건과 결합하여 최종 거래 신호를 판단한다. 모든 조건이 충족될 때만 거래 신호를 생성하여 잘못된 거래를 피한다.

전략적 이점

  1. 브린 벨트와 켈트너 채널의 듀얼 필터링을 사용하여 고품질의 압축 및 확장 형태를 식별한다.

  2. 동량 지표는 가격 트렌드 반전을 적시에 포착할 수 있으며, 통로 지표와 상호 작용한다.

  3. 이 사이트는 유저들이 더 많은 돈을 벌 수 있도록 지원합니다.

  4. 여러 가지 조건으로 판단하여, 지진 상황에서 자주 입장을 피하십시오.

  5. 각 기술 지표의 매개 변수는 다양한 품종과 매개 변수 조합에 맞게 사용자 정의 할 수 있습니다.

  6. 특정 시간 주기에 대한 최적화 테스트를 위해 재검토 시간대를 설정할 수 있다.

전략적 위험

  1. 트렌드 추적 전략, 트렌드가 반전되면 손실이 발생할 수 있다.

  2. 잘못된 매개 변수 설정으로 인해 거래 빈도가 너무 높거나 신호 품질이 좋지 않을 수 있습니다.

  3. 역사적인 데이터 테스트에 의존하는 것은 미래 복귀가 지속될 수 있다는 것을 보장하지 않습니다.

  4. 시장의 격동과 가격의 급격한 변동에 대처할 수 없는 상황이다.

  5. 탐지 시간 창 설정이 잘못되어 오버매칭이 발생할 수 있습니다.

전략 최적화 방향

  1. 브린 벨트와 켈트너 통로의 파라미터를 최적화하여 최적의 조합을 찾는다.

  2. 테스트는 단일 거래의 최대 손실을 제어하기 위해 이동 스톱을 추가합니다.

  3. 특정 품종, 주기적 파라미터 조합에 따라 더 많은 최적화를 시도한다.

  4. 기계학습 모형에 참여하여 트렌드 반전을 탐구한다.

  5. 다른 입점 순서와 포지션 관리 전략을 테스트하십시오.

  6. 트렌드 반전 신호를 인식하고 적시에 손실을 막는 방법을 연구한다.

요약하다

이 전략은 가격 트렌드 방향을 판단하고 트렌드 추적을 수행하는 여러 가지 기술 지표를 통합하여 강력한 적응력을 가지고 있습니다. 매개 변수 사용자 정의 및 다중 조건 필터링을 통해 거래 주파수를 효과적으로 제어하고 신호 품질을 향상시킬 수 있습니다. 그러나 역전 거래 및 갑작스러운 사건은 여전히 경계해야하며, 트렌드 역전 신호 및 위험 제어 장치의 최적화를 계속 탐색하여 전략을 더 튼튼하게 만들 수 있습니다.

전략 소스 코드
/*backtest
start: 2022-11-06 00:00:00
end: 2023-11-12 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=3
//Strategy based on LazyBear Squeeze Momentum Indicator
//I added some custom feature and filters
//
// @author LazyBear
// List of all my indicators:
// https://docs.google.com/document/d/15AGCufJZ8CIUvwFJ9W-IKns88gkWOKBCvByMEvm5MLo/edit?usp=sharing
// v2 - fixed a typo, where BB multipler was always stuck at 1.5. [Thanks @ucsgears]
//
strategy(shorttitle = "SQZMOM_LB", title="Strategy for Squeeze Momentum Indicator [LazyBear]", overlay=false, calc_on_every_tick=true, pyramiding=0,default_qty_type=strategy.percent_of_equity,default_qty_value=100,currency=currency.USD)

length = input(14, title="BB Length")
mult = input(2.0,title="BB MultFactor")
lengthKC=input(16, title="KC Length")
multKC = input(1.5, title="KC MultFactor")
 
useTrueRange = input(true, title="Use TrueRange (KC)", type=bool)

//FILTERS
useExtremeOrders  = input(false, title="Early entry on momentum change", type=bool)
useMomAverage = input(false, title="Filter for Momenutum value", type=bool)
MomentumMin = input(20, title="Min for momentum")

// Calculate BB
src = close
basis = sma(src, length)
dev = mult * stdev(src, length)
upperBB = basis + dev
lowerBB = basis - dev
 
// Calculate KC
ma = sma(src, lengthKC)
range = useTrueRange ? tr : (high - low)
rangema = sma(range, lengthKC)
upperKC = ma + rangema * multKC
lowerKC = ma - rangema * multKC
 
sqzOn  = (lowerBB > lowerKC) and (upperBB < upperKC)
sqzOff = (lowerBB < lowerKC) and (upperBB > upperKC)
noSqz  = (sqzOn == false) and (sqzOff == false)
 
val = linreg(src  -  avg(avg(highest(high, lengthKC), lowest(low, lengthKC)),sma(close,lengthKC)), lengthKC,0)
 
bcolor = iff( val > 0,            iff( val > nz(val[1]), lime, green),            iff( val < nz(val[1]), red, maroon))
scolor = noSqz ? blue : sqzOn ? black : aqua
plot(val, color=bcolor, style=histogram, linewidth=4)
plot(0, color=scolor, style=cross, linewidth=2)

//LOGIC
//momentum filter
filterMom=useMomAverage?abs(val)>(MomentumMin/100000)?true:false:true

//standard condition
longCondition = scolor[1]!=aqua and scolor==aqua and bcolor==lime and filterMom
exitLongCondition = bcolor==green and not useExtremeOrders
shortCondition = scolor[1]!=aqua and scolor==aqua and bcolor==red and filterMom
exitShortCondition = bcolor==maroon and not useExtremeOrders

//early entry
extremeLong= useExtremeOrders and scolor==aqua and bcolor==maroon and bcolor[1]!=bcolor[0] and filterMom
exitExtLong = scolor==black or bcolor==red
extremeShort = useExtremeOrders and scolor==aqua and bcolor==green and bcolor[1]!=bcolor[0] and filterMom
exitExtShort = scolor==black or bcolor==lime

//STRATEGY

strategy.entry("SQ_Long", strategy.long, when = longCondition)
strategy.close("SQ_Long",when = exitLongCondition )

strategy.entry("SQ_Long_Ext", strategy.long, when = extremeLong)
strategy.close("SQ_Long_Ext",when = exitExtLong)
//strategy.exit("exit Long", "SQ_Long", when = exitLongCondition)

strategy.entry("SQ_Short", strategy.short, when = shortCondition)
strategy.close("SQ_Short",when = exitShortCondition)

strategy.entry("SQ_Short_Ext", strategy.short, when = extremeShort)
strategy.close("SQ_Short_Ext",when = exitExtShort)
//strategy.exit("exit Short", "SQ_Short", when = exitShortCondition)



// // === Backtesting Dates === thanks to Trost

// testPeriodSwitch = input(true, "Custom Backtesting Dates")
// testStartYear = input(2018, "Backtest Start Year")
// testStartMonth = input(1, "Backtest Start Month")
// testStartDay = input(1, "Backtest Start Day")
// testStartHour = input(0, "Backtest Start Hour")
// testPeriodStart = timestamp(testStartYear,testStartMonth,testStartDay,testStartHour,0)
// testStopYear = input(2018, "Backtest Stop Year")
// testStopMonth = input(12, "Backtest Stop Month")
// testStopDay = input(14, "Backtest Stop Day")
// testStopHour = input(23, "Backtest Stop Hour")
// testPeriodStop = timestamp(testStopYear,testStopMonth,testStopDay,testStopHour,0)
// testPeriod() =>
//     time >= testPeriodStart and time <= testPeriodStop ? true : false
// isPeriod = testPeriodSwitch == true ? testPeriod() : true
// // === /END

// if not isPeriod
//     strategy.cancel_all()
//     strategy.close_all()