이 전략은 트렌드 방향을 식별하기 위해 크로스 사이클 기술 지표를 사용하며, 트렌드 필터링과 파동 필터링을 결합하여 낮은 위험 트렌드 추적 거래를 구현합니다.
높은 낮은 점의 돌파구를 사용하여 매매 신호를 판단한다. 가격이 7주기 높은 점의 돌파구를 넘으면 내려보고, 7주기 낮은 점의 돌파구를 넘으면 더 많이 본다.
트렌드플렉스 지표는 주 트렌드 방향을 판단한다. 이 지표는 듀얼 플레싱 기술을 결합하여 트렌드 중간 부분을 효과적으로 식별할 수 있다. 1 이상의 값은 상승 추세를 나타내고, -1 이하의 값은 하향 추세를 나타낸다. 여기서 우리는 트렌드플렉스를 > 1 시간 동안 길게, < -1 시간 동안 짧게 요구하여 평면 상태를 필터링한다.
볼린저 밴드 (Bollinger Bands) 의 변동은 흔들림 영역을 식별하는 데 도움이 됩니다.
모바일 스톱로스 및 모바일 스톱을 사용하여 포지션을 관리한다.
초주기 지표는 이중 평준화 기술과 결합하여 트렌드 방향을 효과적으로 식별하고, 흔들리는 시장의 방해를 피할 수 있다.
트렌드 방향과 변동 법칙을 고려하여 거래 신호를 더욱 신뢰할 수 있도록 한다.
손해 차단장치는 합리적으로 설정되어 수익을 고정시켜 손해가 확대되는 것을 막아줍니다.
전략은 간단하고 이해하기 쉽고 실행하기 쉽습니다.
브레이크 신호는 가짜 브레이크가 발생할 수 있으며, 이로 인해 잘못된 거래가 발생할 수 있다. 더 많은 미드파일 조건을 추가하는 것을 고려할 수 있다.
고정 주기 파라미터는 시장의 변화에 적응할 수 없으며, 동적 최적화 파라미터는 고려할 수 있다.
가격 정지 부족으로 인해 극단적인 상황으로 인한 엄청난 손실을 막을 수 없습니다.
스톱 스톱 손실 지점은 고정되어 있으며, 시장의 변동에 따라 지능적으로 조정할 수 없습니다.
트렌드 판단 지표를 더 많이 추가하여 전략 포트폴리오를 형성하고 판단의 정확성을 높이는 것을 고려할 수 있습니다.
지진 인식 모듈을 추가하고, 지진이 심한 경우 거래를 중지하여 위험을 줄입니다.
기계 학습 알고리즘을 도입하여 매개 변수의 동적 최적화를 구현한다.
가격 중지 모듈을 추가하여 손실이 특정 하락값에 도달했을 때 손실을 중지하고 탈퇴 할 수 있습니다.
시장의 변동에 기반한 스톱 스톱 손실 비율을 계산하여 스톱 스톱 손실의 지능적인 조정을 구현합니다.
이 전략은 전반적으로 안정적이고 신뢰할 수 있지만 개선할 여지가 있습니다. 핵심 아이디어는 트렌드 방향을 판단하고, 트렌드 강도 지표와 변동 지표를 결합하여 필터링하여 고품질 신호를 발산하는 것입니다. 이 전략은 간단하고 실용적이며, 중장선 트렌드를 추적하는 데 적합합니다. 더 많은 조건 판단과 동적 매개 변수 최적화를 도입하여 전략 효과를 더욱 향상시킬 수 있습니다.
/*backtest
start: 2023-08-27 00:00:00
end: 2023-09-26 00:00:00
period: 4h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=4
strategy("Eltrut", shorttitle="Eltrut Strat", overlay=true, pyramiding=0, default_qty_type= strategy.percent_of_equity,calc_on_order_fills=false, slippage=25,commission_type=strategy.commission.percent,commission_value=0.075)
testStartYear = input(2016, "Backtest Start Year")
testStartMonth = input(1, "Backtest Start Month")
testStartDay = input(1, "Backtest Start Day")
testPeriodStart = timestamp(testStartYear,testStartMonth,testStartDay,0,0)
testStopYear = input(2030, "Backtest Stop Year")
testStopMonth = input(12, "Backtest Stop Month")
testStopDay = input(30, "Backtest Stop Day")
testPeriodStop = timestamp(testStopYear,testStopMonth,testStopDay,0,0)
// R E F L E X / T R E N D F L E X
f_supersmoother(_src,_len)=>
pi = 2 * asin(1)
_a = exp(-sqrt(2) * pi / _len)
_c2 = 2 * _a * cos(sqrt(2) * pi / _len)
_c3 = -_a * _a
_c1 = 1 - _c2 - _c3
_out = 0.0
_out := _c1 * _src + _c2 * nz(_out[1],nz(_src[1],_src)) + _c3 * nz(_out[2],nz(_src[2],nz(_src[1],_src)))
f_IQIFM(_src1,_max)=>
_src = _src1 < 0.001 ? _src1 * 10000 : _src1
_imult = 0.635, _qmult = 0.338 , _inphase = 0.0, _quad = 0.0
_re = 0.0, _im = 0.0, _deltaphase = 0.0, _instper = 0.0, _per = 0.0, _v4 = 0.0
_v1 = _src - nz(_src[7])
_inphase := 1.25 * (nz(_v1[4]) - _imult * _v1[2]) + _imult * nz(_inphase[3])
_quad := _v1[2] - _qmult * _v1 + _qmult * nz(_quad[2])
_re := 0.2 * (_inphase * _inphase[1] + _quad * _quad[1]) + 0.8 * nz(_re[1])
_im := 0.2 * (_inphase * _quad[1] - _inphase[1] * _quad) + 0.8 * nz(_im[1])
if _re != 0.0
_deltaphase := atan(_im / _re)
for i = 0 to _max
_v4 := _v4 + _deltaphase[i]
if _v4 > 4 * asin(1) and _instper == 0.0
_instper := i
if _instper == 0.0
_instper := nz(_instper[1])
_per := 0.25 * _instper + 0.75 * nz(_per[1])
_per
f_flex(_src1, _fixed_len, _reflex) =>
_src = _src1
_len = _fixed_len
_ss1 = f_supersmoother(_src, _len)
_ss = _ss1
_slope = (_ss[_len] - _ss) / _len
_sum = 0.0
for _i = 1 to _len
_c1 = _reflex ? _ss + _i * _slope - _ss[_i] : _ss - _ss[_i]
_sum := _sum + _c1
_sum := _sum / _len
_ms = 0.0
_ms := 0.04 * pow(_sum,2) + 0.96 * nz(_ms[1])
_flex1 = _ms != 0 ? _sum / sqrt(nz(_ms)) : 0.0
_flex = _flex1
_flex
rflx = f_flex(close, 20, true)
trndflx = f_flex(close, 20, false)
// S I G N A L
hi7 = highest(7)
lo7 = lowest(7)
long_cond = crossunder(close, lo7[1])
short_cond = crossover(close, hi7[1])
// F I L T E R S
long_filter1 = trndflx < 1
short_filter1 = trndflx > -1
basis = sma(close, 35)
dev = 3 * stdev(close, 35)
long_filter2 = close > basis - dev
short_filter2 = close < basis + dev
// S T R A T E G Y
long = long_cond and long_filter1 and long_filter2
short = short_cond and short_filter1 and short_filter2
if( true)
strategy.entry("Long", strategy.long, when = long)
strategy.entry("Long", strategy.long, when = short)
// User Options to Change Inputs (%)
stopPer = input(3, title='Stop Loss %', type=input.float) / 100
takePer = input(9, title='Take Profit %', type=input.float) / 100
// Determine where you've entered and in what direction
longStop = strategy.position_avg_price * (1 - stopPer)
shortStop = strategy.position_avg_price * (1 + stopPer)
shortTake = strategy.position_avg_price * (1 - takePer)
longTake = strategy.position_avg_price * (1 + takePer)
if strategy.position_size > 0
strategy.exit(id="Exit Long", stop=longStop, limit=longTake)
if strategy.position_size < 0
strategy.exit(id="Exit Short", stop=shortStop, limit=shortTake)
// P L O T
plotshape(long, color = #1e90ff, text = "", style=shape.triangleup, location=location.belowbar, size=size.tiny)
plotshape(short, color = #ff69b4, text = "", style=shape.triangledown, location=location.abovebar, size=size.tiny)
alertcondition(long, "Long", "Enter Long")
alertcondition(short, "Short", "Enter S")