이 전략은 트렌드 지향을 식별하기 위해 트렌드 필터링과 변동성 필터링과 결합하여 낮은 위험 트렌드 추적 거래를 달성하기 위해 기간 간 기술 지표를 사용합니다.
구매 및 판매 신호를 결정하기 위해 높은 저점 돌파구를 사용하십시오. 가격이 7 기간 최고치를 넘어서면 짧고 7 기간 최저치를 넘어서면 길게 이동하십시오.
트렌드플렉스 지표는 주요 트렌드 방향을 결정한다. 이 지표는 이중 매끄러운 기술을 결합하고 트렌드 중간 구간을 효과적으로 식별할 수 있다. 1 이상의 값은 상승 추세를 나타내고 -1 이하의 값은 하락 추세를 나타낸다. 여기서 우리는 트렌드플렉스 > 1을 롱과 < -1을 쇼트로 필요로 하며, 이로써 통합 상태를 필터링한다.
볼링거 대역을 사용하여 오스실레이션 범위를 식별하십시오. 닫기 가격이 대역 내에있을 때 장과 짧은 것을 피하십시오.
지점을 관리하기 위해 이동 스톱 로스를 사용하고 수익을 취하십시오.
횡단 기간 지표와 이중 평형 기술 결합은 트렌드 방향을 효과적으로 식별하고 시장의 변동을 피할 수 있습니다.
트렌드 방향과 변동성 패턴을 고려하면 거래 신호가 더 신뢰할 수 있습니다.
합리적인 스톱 로스 및 수익 취득 설정은 수익을 차단하고 손실이 확장되는 것을 방지합니다.
이 전략은 비교적 간단하고 실행하기 쉽습니다.
돌파 신호는 잘못된 브레이크로 이어질 수 있습니다. 더 많은 필터링 조건을 고려할 수 있습니다.
고정 주기의 매개 변수는 시장 변화에 적응할 수 없습니다. 매개 변수의 동적 최적화를 고려할 수 있습니다.
가격 정지 부족은 극단적인 시장 조건으로 인한 엄청난 손실을 방지하는 데 실패합니다.
고정된 수익점과 스톱 러스 포인트는 시장 변동에 따라 지능적으로 조정할 수 없습니다.
추론 정확성을 높이기 위한 전략 조합을 형성하기 위해 더 많은 추세 판단 지표를 추가하는 것을 고려하십시오.
오스실레이션 식별 모듈을 추가하여 위험을 줄이기 위해 오스실레이션이 심할 때 거래를 중지합니다.
동적 매개 변수 최적화를 위해 기계 학습 알고리즘을 도입합니다.
손실이 특정 임계치에 도달할 때 손실을 중지하기 위해 가격 스톱 로스 모듈을 추가합니다.
이윤을 취하고 손실을 멈추는 비율을 계산합니다. 시장의 변동성에 기초하여 이윤을 취하고 손실을 멈추는 지능적인 조정을 달성하기 위해.
전체적으로, 이 전략은 비교적 안정적이고 신뢰할 수 있으며, 또한 개선할 여지가 있다. 핵심 아이디어는 주기에 걸쳐 트렌드 방향을 결정하고, 그 다음 트렌드 강도 지표와 변동성 지표를 사용하여 고품질 신호를 생성하도록 필터링하는 것이다. 이 간단하고 실용적인 전략은 중장기 트렌드를 추적하는 데 매우 적합하다. 더 많은 조건적 판단과 동적 매개 변수 최적화를 도입함으로써 전략 효과를 더욱 향상시킬 수 있다.
/*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")