모멘텀 스 브레이크아웃 트렌드 추적 전략

저자:차오장, 날짜: 2023-11-13 17:46:01
태그:

img

전반적인 설명

이 전략은 라지 베어의 압축 모멘텀 지표에 기반하고 있으며, 채널 압축 및 확장에서 가격 파장을 식별하기 위해 볼린거 밴드 및 켈트너 채널을 결합하여 가격의 잠재적 인 트렌드 방향을 결정하며, 진입 방향을 결정하기 위해 트렌드 다음 접근 방식을 채택합니다. 이 전략의 장점은 잠재적 인 트렌드를 식별하는 모멘텀 지표의 능력을 최대한 활용하고 다양한 조건 필터를 설정하여 신호 품질을 제어하여 불확실한 신호를 효과적으로 필터링하고 범위 시장에서 과잉 거래를 피할 수 있습니다.

전략 논리

  1. 볼링거 밴드의 중간 밴드, 상위 밴드 및 하위 밴드를 계산합니다. 중간 밴드는 폐쇄 가격의 n 일간 간단한 이동 평균이며, 상위 및 하위 밴드는 중간 밴드 더하기 / 마이너스 m × 폐쇄 가격의 n 일간 표준 편차입니다.

  2. 켈트너 채널의 중간선, 상위선 및 하위선을 계산합니다. 중간선은 닫기 가격의 n 일간 간단한 이동 평균이며, 상위선과 하위선은 중간선 더하기/미inus 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()
        



더 많은