이 전략은 라지 베어
볼링거 밴드의 중간 밴드, 상위 밴드 및 하위 밴드를 계산합니다. 중간 밴드는 폐쇄 가격의 n 일간 간단한 이동 평균이며, 상위 및 하위 밴드는 중간 밴드 더하기 / 마이너스 m × 폐쇄 가격의 n 일간 표준 편차입니다.
켈트너 채널의 중간선, 상위선 및 하위선을 계산합니다. 중간선은 닫기 가격의 n 일간 간단한 이동 평균이며, 상위선과 하위선은 중간선 더하기/미inus m 곱하기 n 일간 간단한 이동 평균입니다.
가격이 압축 및 팽창 패턴을 형성하기 위해 볼린거 밴드 및 켈트너 채널의 상부 또는 하부 대역을 통과하는지 여부를 결정합니다. 압축은 가격이 하부 대역을 통해 붕괴 할 때 형성되며, 증가는 가격이 상부 대역을 통해 붕괴 할 때 형성됩니다.
운동량 지표로 선형 회귀 곡선의 값을 계산합니다. 0을 상향으로 가로질러 구매 신호이고 0을 하향으로 가로질러 판매 신호입니다.
압축 / 확장 패턴, 운동 방향, 평균 필터링 및 기타 조건을 결합하여 최종 거래 신호를 결정합니다. 신호는 모든 조건이 충족되면 나쁜 거래를 피합니다.
볼링거 밴드와 켈트너 채널의 이중 필터링을 사용하여 품질 압축 및 팽창 패턴을 식별합니다.
동력 지표는 채널 지표를 보완하여 가격 트렌드 반전을 적시에 포착 할 수 있습니다.
수익 기회를 높이기 위해 일찍 입국을 허용합니다.
다양한 시장에서 과도한 거래를 피하기 위해 여러 조건 판단을 채택하십시오.
기술 지표 매개 변수는 다양한 제품 및 매개 변수 조합에 적응하여 사용자 정의 할 수 있습니다.
백테스트 시간 프레임은 특정 기간에 최적화하도록 설정할 수 있습니다.
트렌드를 따르는 전략은 트렌드가 역전될 때 손실을 입을 수 있습니다.
부적절한 매개 변수 설정은 과도한 거래 또는 낮은 신호 품질로 이어질 수 있습니다.
역사적인 데이터에 의존하는 것은 미래 안정적인 수익을 보장할 수 없습니다.
블랙 스완 사건으로 인한 시장 격동과 급격한 가격 변동에 대처할 수 없습니다.
부적절한 백테스트 시간 창 설정이 오버 피팅으로 이어질 수 있습니다.
가장 좋은 조합을 찾기 위해 볼링거 밴드와 켈트너 채널의 매개 변수를 최적화합니다.
거래당 최대 손실을 제어하기 위해 후속 스톱 손실을 추가하는 테스트.
특정 제품 및 기간/패라미터 조합에 대한 추가 최적화를 시도합니다.
트렌드 리버스를 판단하기 위해 기계 학습 모델을 통합하는 것을 탐구합니다.
다른 입력 순서 및 위치 크기 전략을 테스트합니다.
트렌드 반전 신호를 파악하고 시간에 맞춰 빠져나가는 방법을 연구하세요.
이 전략은 가격 트렌드 방향을 판단하고 트렌드를 따라가기 위해 여러 기술적 지표를 통합하며, 상대적으로 강한 적응력을 가지고 있습니다. 매개 변수를 사용자 지정하고 여러 조건 필터를 사용하여 거래 주파수를 효과적으로 제어하고 신호 품질을 향상시킬 수 있습니다. 그러나 리버서 트레이드 및 블랙 스완 이벤트는 여전히 지켜봐야합니다.
/*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()