이 전략은 현재 트렌드 방향을 결정하기 위해 볼링거 밴드, 켈트너 채널 및 적응형 상대적 강도 지수를 사용하고, 입시를 시간 지정하기 위해 파라볼릭 SAR와 결합합니다. 이 세 가지 지표의 판단이 일치 할 때 거래 신호가 생성됩니다. 전략은 주로 트렌드 방향을 판단하고 트렌드가 변경되면 적시에 수익을 목표로 입력합니다.
이 전략은 현재 동향을 결정하기 위해 다음 세 가지 기술 지표를 결합합니다.
SQUEEZE 모멘텀 지표: 볼링거 밴드와 켈트너 채널을 계산합니다. 두 밴드가 겹치면 압축을 생성하고 임박한 트렌드 변화를 신호합니다. 압축 상태와 선형 회귀 기울기를 반환합니다.
RSI 볼륨 가중화: 볼륨 가중화 된 RSI를 계산합니다. 과잉 구매 / 과잉 판매 수준을 결정하는 중간 지점을 사용합니다. 볼륨 변화를 강조합니다.
파라볼리 SAR: 현재 가격의 위치를 SAR 라인에 비해 판단합니다. 가격 위의 SAR는 하락 추세를 나타냅니다. 가격 아래의 SAR는 상승 추세를 나타냅니다.
이 전략은 트렌드 방향을 결정하기 위해 볼링거 밴드, 그것을 정제하기 위해 켈트너 채널, 과잉 구매/ 과잉 판매시 반전 기회를 찾기 위해 RSI, 엔트리 시기를 결정하기 위해 SAR를 사용합니다. 논리는 다음과 같습니다.
볼링거 밴드, 켈트너 채널, 압축 지표를 계산합니다. 압축이 발생하면 대기 상태를 입력합니다.
부피 가중된 RSI를 계산합니다. 중점 이상의 RSI는 상승 추세를 나타냅니다. 중점 이하의 하락 추세를 나타냅니다.
평형 SAR를 계산합니다. 가격 아래의 SAR는 상승 추세를 나타냅니다. 가격 위의 SAR는 하락 추세를 나타냅니다.
세 가지 지표를 결합하면: 압축이 발생하면 RSI가 중간 지점 이상, SAR가 가격 아래로 올라갈 때 긴 신호가 생성됩니다. 압축이 발생하면 RSI가 중간 지점 아래로 내려갈 때 SAR가 가격 이상으로 올라갈 때 짧은 신호가 생성됩니다.
신호가 발사되면 이전 바의 세 개의 지표의 판단이 현재 신호의 반대인지 확인합니다.
스톱 로스를 설정하고 엔트리 후 수익을 취하고, 후속 스톱 로스를 취합니다.
이 전략의 장점:
여러 지표의 조합은 트렌드 판단의 정확성을 향상시킵니다. 스크레즈는 트렌드 변화를 정확하게 감지합니다. RSI는 과잉 구매 / 과잉 판매 수준을 명확히 식별하고 SAR는 입력 시를 정확하게 곱합니다.
지표 논리는 간단하고 이해하기 쉽습니다.
여러 가지 지표의 확인은 거짓 유출을 필터링하는 데 도움이 됩니다.
스톱 로즈와 취득 메커니즘은 수익을 차단하고 위험을 제한합니다.
광범위한 백테스트 데이터가 신뢰성을 보장합니다.
또한 몇 가지 위험이 있습니다.
길고 짧은 입력 논리는 비슷하며 충돌 신호를 생성 할 수 있습니다. 필터링이 필요합니다.
모든 지표는 매개 변수 최적화를 사용합니다.
높은 거래 빈도, 포지션 사이즈 조절이 필요합니다.
스톱 손실은 너무 가깝고 쉽게 멈출 수 있습니다.
해결책:
신호 변동을 피하기 위해 지표 판단에 지속성 검사를 추가합니다.
워크 포워드 분석을 사용하여 매개 변수를 조정하고 과도한 부착을 방지합니다.
피라미드 크기를 설정해서 각 방향에 따라 위치를 제어합니다.
다른 스톱 로스 범위를 테스트하여 스톱 로스 가격을 최적화합니다.
전략을 최적화하는 몇 가지 방향:
안정성을 위해 지표 매개 변수를 최적화합니다. 동적 최적화를 고려하십시오.
고정/평등의 비율과 같은 위치 크기의 논리를 추가합니다.
변동성 또는 선형 스톱, 제로화 위치 등과 같은 다른 스톱 손실 방법을 테스트합니다.
고정 분수 위치 크기와 같은 돈 관리를 추가합니다.
동적 입출입을 위한 기계 학습 모델을 사용하세요.
연결된 시스템 리스크를 줄이기 위해 장기 및 단기 모두로 헤지 메커니즘을 추가합니다.
더 많은 지표를 고려하고 정확성을 높이기 위해 투표 메커니즘을 구축하십시오.
이 전략은 트렌드 방향을 결정하기 위해 여러 지표를 사용하여 슬기롭게 압축을 입력하는 명확한 논리를 가지고 있습니다. 스톱 손실 및 수익 매커니즘은 위험을 제한합니다. 매개 변수 최적화 및 위험 통제는 백테스트 및 라이브 결과를 더욱 향상시킬 수 있습니다. 트렌딩 제품에 적합한 안정적인 트렌드 다음 전략이며 매일과 같은 더 큰 시간 프레임에서도 작동 할 수 있습니다. 강력한 실용적 가치로이 전략은 많은 측면에서 더 이상 최적화 될 수 있습니다.
/*backtest start: 2023-10-06 00:00:00 end: 2023-11-05 00:00:00 period: 1h basePeriod: 15m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ // This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/ // © XaviZ //#####©ÉÉÉɶN############################################### //####*..´´´´´´,,,»ëN######################################## //###ë..´´´´´´,,,,,,''%©##################################### //###'´´´´´´,,,,,,,'''''?¶################################### //##o´´´´´´,,,,,,,''''''''*©################################# //##'´´´´´,,,,,,,'''''''^^^~±################################ //#±´´´´´,,,,,,,''''''''^í/;~*©####æ%;í»~~~~;==I±N########### //#»´´´´,,,,,,'''''''''^;////;»¶X/í~~/~~~;=~~~~~~~~*¶######## //#'´´´,,,,,,''''''''^^;////;%I^~/~~/~~~=~~~;=?;~~~~;?ë###### //©´´,,,,,,,''''''''^^~/////X~/~~/~~/~~»í~~=~~~~~~~~~~^;É#### //¶´,,,,,,,''''''''^^^;///;%;~/~~;í~~»~í?~?~~~?I/~~~~?*=íÑ### //N,,,,,,,'''''''^^^^^///;;o/~~;;~~;£=»í»;IX/=~~~~~~^^^^'*æ## //#í,,,,,''''''''^^^^^;;;;;o~»~~~~íX//~/»~;í?IíI»~~^/*?'''=N# //#%,,,'''''''''^^^^^^í;;;;£;~~~//»I»/£X/X/»í*&~~~^^^^'^*~'É# //#©,,''''''''^^^^^^^^~;;;;&/~/////*X;í;o*í»~=*?*===^'''''*£# //##&''''''''^^^^^^^^^^~;;;;X=í~~~»;;;/~;í»~»±;^^^^^';=''''É# //##N^''''''^^^^^^^^^^~~~;;;;/£;~~/»~~»~~///o~~^^^^''''?^',æ# //###Ñ''''^^^^^^^^^^^~~~~~;;;;;í*X*í»;~~IX?~~^^^^/?'''''=,=## //####X'''^^^^^^^^^^~~~~~~~~;;íííííí~~í*=~~~~Ií^'''=''''^»©## //#####£^^^^^^^^^^^~~~~~~~~~~~íííííí~~~~~*~^^^;/''''='',,N### //######æ~^^^^^^^^~~~~~~~~~~~~~~íííí~~~~~^*^^^'=''''?',,§#### //########&^^^^^^~~~~~~~~~~~~~~~~~~~~~~~^^=^^''=''''?,íN##### //#########N?^^~~~~~~~~~~~~~~~~~~~~~~~~^^^=^''^?''';í@####### //###########N*~~~~~~~~~~~~~~~~~~~~~~~^^^*'''^='''/É######### //##############@;~~~~~~~~~~~~~~~~~~~^^~='''~?'';É########### //#################É=~~~~~~~~~~~~~~^^^*~'''*~?§############## //#####################N§£I/~~~~~~»*?~»o§æN################## //@version=4 strategy(title="M-SQUEEZE", overlay = true) //study(title="M-SQUEEZE", overlay = true) src = input(close, "SOURCE", type = input.source) // ███▓▒░░ VARIABLES ░░▒▓███ var bool longCond = na, var bool shortCond = na var int CondIni_long0 = 0, var int CondIni_short0 = 0 var int CondIni_long = 0, var int CondIni_short = 0 var float last_open_longCondition = na, var float last_open_shortCondition = na var int last_longCondition0 = na, var int last_shortCondition0 = na var int last_longCondition = na, var int last_shortCondition = na var bool long_tp = na, var bool short_tp = na var int last_long_tp = na, var int last_short_tp = na var bool Final_Long_tp = na, var bool Final_Short_tp = na var bool SMI_longCond = na, var bool SMI_shortCond = na var bool RSI_longCond = na, var bool RSI_shortCond = na var bool ADX_longCond = na, var bool ADX_shortCond = na var bool SAR_longCond = na, var bool SAR_shortCond = na var bool Final_longCondition0 = na, var bool Final_shortCondition0 = na var bool Final_longCondition = na, var bool Final_shortCondition = na // ███▓▒░░ SQUEEZE MOMENTUM INDICATOR ░░▒▓███ Act_SMI = input(true, "SQUEEZE MOMENTUM INDICATOR") BB_length = input(85, title="BOLLINGER BANDS LENGTH", minval = 1) BB_mult = input(2.1, title="BOLLINGER BANDS MULTI-FACTOR", minval = 0.1, step = 0.1) KC_length = input(38, title="KELTNER CHANNEL LENGTH", minval = 1) KC_mult = input(2.0, title="KELTNER CHANNEL MULTI-FACTOR", minval = 0.1, step = 0.1) SQUEEZE_M(_src,_BB_length,_BB_mult,_KC_length,_KC_mult)=> // Calculate BB basis = sma(_src, _BB_length) dev = _BB_mult * stdev(_src, _BB_length) upperBB = basis + dev lowerBB = basis - dev // Calculate KC ma = sma(src, _KC_length) rangema = sma(tr, _KC_length) upperKC = ma + rangema * _KC_mult lowerKC = ma - rangema * _KC_mult // Squeeze sqzOn = lowerBB > lowerKC and upperBB < upperKC sqzOff = lowerBB < lowerKC and upperBB > upperKC nosqz = sqzOn == false and sqzOff == false // Linear Regression curve val = linreg(_src - avg(avg(highest(high, _KC_length), lowest(low, _KC_length)), sma(close, _KC_length)), _KC_length, 0) [nosqz,val] [NOSQZ,VAL] = SQUEEZE_M(src,BB_length,BB_mult,KC_length,KC_mult) barcolor(iff(VAL > 0, iff(VAL > nz(VAL[1]), color.lime, color.green), iff(VAL < nz(VAL[1]), color.red, color.maroon))) // ███▓▒░░ SAR ░░▒▓███ Act_SAR = input(true, "PARABOLIC SAR") Sst = input (0.73, "SAR STAR", step=0.01, minval = 0.01) Sinc = input (0.5, "SAR INC", step=0.01, minval = 0.01) Smax = input (0.06, "SAR MAX", step=0.01, minval = 0.01) SAR = sar(Sst, Sinc, Smax) plot(SAR, style = plot.style_cross, title = "SAR") // ███▓▒░░ RSI VOLUME WEIGHTED ░░▒▓███ Act_RSI = input(true, "RSI VOLUME WEIGHTED") RSI_len = input(22, "RSI LENGHT", minval = 1) RSI_obos = input(45,title="RSI CENTER LINE", type=input.integer, minval = 1) WiMA(_src, _length)=> var float MA_s=0.0 MA_s:=(_src + nz(MA_s[1] * (_length-1)))/_length MA_s RSI_Volume(fv, length)=> up=iff(fv>fv[1],abs(fv-fv[1])*volume,0) dn=iff(fv<fv[1],abs(fv-fv[1])*volume,0) upt=WiMA(up,length) dnt=WiMA(dn,length) 100*(upt/(upt+dnt)) RSI_V = RSI_Volume(src, RSI_len) // ███▓▒░░ STRATEGY ░░▒▓███ SMI_longCond := (Act_SMI ? (VAL > 0 and (VAL > nz(VAL[1])) and not NOSQZ) : RSI_longCond) RSI_longCond := (Act_RSI ? (RSI_V > RSI_obos) : SAR_longCond) SAR_longCond := (Act_SAR ? (SAR < close) : SMI_longCond) SMI_shortCond := (Act_SMI ? (VAL < 0 and (VAL < nz(VAL[1])) and not NOSQZ) : RSI_shortCond) RSI_shortCond := (Act_RSI ? (RSI_V < RSI_obos) : SAR_shortCond) SAR_shortCond := (Act_SAR ? (SAR > close) : SMI_shortCond) longCond := SMI_longCond and RSI_longCond and SAR_longCond shortCond := SMI_shortCond and RSI_shortCond and SAR_shortCond CondIni_long0 := longCond ? 1 : shortCond ? -1 : CondIni_long0[1] CondIni_short0 := longCond ? 1 : shortCond ? -1 : CondIni_short0[1] longCondition0 = (longCond and CondIni_long0[1] == -1) shortCondition0 = (shortCond and CondIni_short0[1] == 1) CondIni_long := longCond[1] ? 1 : shortCond[1] ? -1 : CondIni_long[1] CondIni_short := longCond[1] ? 1 : shortCond[1] ? -1 : CondIni_short[1] longCondition = (longCond[1] and CondIni_long[1] == -1) shortCondition = (shortCond[1] and CondIni_short[1] == 1) // ███▓▒░░ ALERTS & SIGNALS ░░▒▓███ plotshape(longCondition, title = "Long Signal", style = shape.triangleup, location = location.belowbar, color = color.blue, transp = 0, size = size.tiny) plotshape(shortCondition, title = "Short Signal", style = shape.triangledown, location = location.abovebar, color = #FF0000, transp = 0, size = size.tiny) //alertcondition(longCondition, title="Long Alert", message = "LONG") //alertcondition(shortCondition, title="Short Alert", message = "SHORT") // ███▓▒░░ BACKTESTING ░░▒▓███ testStartYear = input(2018, "BACKTEST START YEAR", minval = 1980, maxval = 2222) testStartMonth = input(01, "BACKTEST START MONTH", minval = 1, maxval = 12) testStartDay = input(01, "BACKTEST START DAY", minval = 1, maxval = 31) testPeriodStart = timestamp(testStartYear,testStartMonth,testStartDay,0,0) testStopYear = input(2222, "BACKTEST STOP YEAR", minval=1980, maxval = 2222) testStopMonth = input(12, "BACKTEST STOP MONTH", minval=1, maxval=12) testStopDay = input(31, "BACKTEST STOP DAY", minval=1, maxval=31) testPeriodStop = timestamp(testStopYear, testStopMonth, testStopDay, 0, 0) testPeriod = time >= testPeriodStart and time <= testPeriodStop ? true : false strategy.entry("Long", strategy.long, when = longCondition0 and testPeriod) strategy.entry("Short", strategy.short, when = shortCondition0 and testPeriod)