롱앤숏 트렌드파인딩 듀얼레이저 전략


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

롱앤숏 트렌드파인딩 듀얼레이저 전략

개요

이 전략은 브린 벨트, 켄터 통로 및 자기 적응 상대적으로 강한 지표 세 가지 기술 지표를 사용하여 현재 트렌드 방향을 판단하고, 패러폴리 라인 SAR 지표와 함께 입장을 합니다. 세 가지 지표 판단 결과가 일치 할 때 거래 신호를 생성합니다. 전략은 주로 트렌드 방향을 판단하고, 트렌드가 변할 때 적시에 입장을 하고, 수익을 목표로합니다.

원칙

이 전략은 다음과 같은 세 가지 기술 지표의 조합을 사용하여 현재 추세를 판단합니다.

  1. 스퀘즈 지표 (SQUEEZE MOMENTUM INDICATOR): 브린 벨트와 켄터 통로를 계산하여, 둘이 중첩될 때 압축이 발생하여, 트렌드가 곧 변할 것이라는 신호를 나타냅니다. 이 지표는 압축 상태와 선형 회귀 곡선의 기울기를 반환한다.

  2. 자기 적응 상대적으로 강한 지수 ((RSI VOLUME WEIGHTED): 거래량 가중된 RSI를 계산하고, 중선을 사용하여 과매매 과매매를 판단한다. 이 지표는 거래량의 변화를 강조한다.

  3. 패러블라인 상쇄상황 (SAR): 현재 가격과 패러블라인 SAR의 위치 관계를 판단하여, SAR은 가격 위쪽에서 하락하고, SAR은 가격 아래쪽에서 상승한다.

전략은 브린 대역을 사용하여 트렌드 방향을 결정하고, 켄터 통로 (Kentner Channel) 는 Refine를 사용하며, RSI는 오버 바이 (Over Sell) 를 판단하여 역전 기회를 찾으며, SAR는 출입 시간을 지시합니다. 구체적인 논리는 다음과 같습니다:

  1. 브린 벨트, 켄터 통로, 스쿼즈 지표를 계산한다. 스쿼즈는 압축될 때 준비 단계로 들어간다.

  2. 거래량 가중된 RSI를 계산한다. RSI는 중간선 상점보다 높고 중간선 상점보다 낮다.

  3. PARLINE SAR을 계산한다. SAR은 가격 아래에서 상승하고, 가격 위에서는 하락한다.

  4. 위의 세 가지 지표가 합쳐져 있습니다. 스퀘이즈가 압축되면 RSI가 중간선보다 높고 SAR가 가격 아래있을 때 다중 신호가 발생합니다. 스퀘이즈가 압축되면 RSI가 중간선보다 낮고 SAR가 가격 위있을 때 공중 신호가 발생합니다.

  5. 신호가 발생했을 때, 앞의 K선의 세 지표 판단 결과를 판단하고, 현재 신호 판단과 반대하면 입구 신호를 생성한다.

  6. 출입 후 스톱 로즈 스톱을 설정하고, 스톱 로즈를 추적한다.

장점

이 전략은 다음과 같은 장점을 가지고 있습니다.

  1. 다중 지표 포지션 보이닝 하향, 판단 정확. 스퀘이즈 지표는 트렌드 변화를 식별 정확, RSI 판단 오버 바이 오버 세를 명확, SAR 지시 입시 시점을 정확.

  2. 지표의 논리는 간단하고 명확하며, 구현을 이해하기 쉽습니다.

  3. 다중 지표 확인을 사용하여 가짜 돌파구를 필터링 할 수 있습니다.

  4. 손해 차단 장치가 설치되어 수익을 고정하고 위험을 통제 할 수 있습니다.

  5. 이 자료는 충분한데, 신뢰도가 높습니다.

위험

이 전략에는 몇 가지 위험도 있습니다.

  1. 다머리와 공허머리 입장 논리는 비슷하며, 동시에 반향 신호를 발산할 수 있으며, 필터링이 필요하다.

  2. 세 가지 지표 모두 파라미터 최적화를 적용하여 너무 잘 어울릴 수 있습니다.

  3. 거래의 빈도가 너무 높을 수 있으므로, 입장을 적절히 통제해야 한다.

  4. 손해 방지 설정이 너무 가깝고 쉽게 깨질 수 있습니다.

그 해결책은 다음과 같습니다.

  1. 지표 결과의 지속 주기 판단을 높여 신호 흔들림을 피한다.

  2. 워크 포워드 분석 방법을 사용하여, 과 적합성을 방지하기 위해 파라미터를 조정한다.

  3. 피라미드 크기를 설정하고, 단방향으로 보유하는 수를 제어한다.

  4. 다양한 스톱 영역을 테스트하고 스톱 위치를 최적화한다.

최적화 방향

이 전략은 다음과 같은 방향으로 최적화될 수 있습니다.

  1. 지표 파라미터를 최적화하여 파라미터 안정성을 높인다. 동적 최적화 파라미터를 고려할 수 있다.

  2. 포지션 제어 논리를 추가하는 방법, 예를 들어 크기와 작은 포지션, 평균 포지션 등.

  3. 다양한 손해 방지 방법을 테스트합니다. 예를 들어, 변동성 손해 방지, 선형 손해 방지, 제로 포지션 등.

  4. 고정 포지션, 고정 자금 사용률 등과 같은 돈 관리 기능을 추가합니다.

  5. 기계 학습 알고리즘과 결합하여 동적 입출구를 구현한다.

  6. 더 많은 헤버 제도를 도입하고, 더 많은 코스피 헤버를 도입하여, 관련 시장의 시스템적 위험을 낮추는 것.

  7. 더 많은 지표를 추가하고, 투표 메커니즘을 구축하고, 판단의 정확성을 높이는 것을 고려하십시오.

요약하다

이 전략은 전체적인 아이디어는 명확하고, 여러 지표를 이용하여 시상상향을 판단하는 경향 방향, 부린带通道 압축시 절감장치 제어 위험을 막는, 예민하게 출전하는, 비교적 안정적인 경향 추적 전략이다. 매개 변수 최적화, 위험 제어 메커니즘의 개선을 통해, 더 나은 재측정 지표와 실디 효과를 얻을 수 있다. 이 전략은 트렌드가 더 명백한 품종에 적용되며, 비교적 안정적인 큰 주기인 일선과 같은 운영도 고려할 수 있다. 전체적으로, 이 전략은 강력한 실용적 가치를 가지고 있다.

전략 소스 코드
/*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)