동적 추세 추적 전략


생성 날짜: 2023-12-11 15:43:42 마지막으로 수정됨: 2023-12-11 15:43:42
복사: 3 클릭수: 731
avatar of ChaoZhang ChaoZhang
1
집중하다
1621
수행원

동적 추세 추적 전략

개요

이 전략의 주요 아이디어는 동적으로 시장 추세를 추적하고, 추세가 상승할 때 구매하고, 추세가 하락할 때 판매하는 것이다. 이 전략은 여러 지표의 조합을 계산하여 추세 방향을 판단한다.

전략 원칙

이 전략은 트렌드 방향을 판단하기 위해 여러 가지 기술 지표를 사용합니다. 첫째, 그것은 범위 채널을 계산합니다. 채널의 상하계는 클로즈의 간단한 이동 평균과 입력 변수에 따라 계산됩니다. 다음으로, 트렌드를 더 정확하게 묘사 할 수 있다고 생각되는 수정된 헐 이동 평균을 계산합니다. 또한, 선형 회귀 지표도 계산합니다.

잘못된 신호를 줄이기 위해, 이 전략은 여러 필터를 설계하기도 한다. 예를 들어, EMA를 사용하여 하향 추세에 있는지 판단하고, RSI의 변화를 판단하기 위해 창 지표를 사용한다. 이러한 필터는 충격적인 상황에서 거래 신호를 생성하는 것을 피할 수 있다.

입시와 중단 측면에서, 이 전략은 마지막 개시 가격을 기록하고, 스톱 스톱 손실의 비율을 설정한다. 예를 들어, 마지막 개시 가격이 100달러라면, 스톱 스톱 목표를 102달러, 스톱 스톱 가격을 95달러로 설정한다. 이렇게 하면 동적 추적이 가능하다.

우위 분석

이 전략에는 다음과 같은 장점이 있습니다.

  1. 동적으로 트렌드 변화를 추적하여 더 긴 선의 방향을 쉽게 잡을 수 있습니다.
  2. 여러 개의 필터가 사용되어 소음을 줄이고, 흔들리는 상황에서 자주 거래되는 것을 방지합니다.
  3. 자동으로 스톱패스 위치를 조정하여 트렌드 추적을 수행합니다.
  4. 매개 변수 최적화를 통해 최적의 매개 변수 조합을 자동으로 찾을 수 있다.

위험 분석

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

  1. 하지만, 아직까지도, 시장에 의해 좌우되는 위험을 완전히 피할 수는 없습니다. 추세가 바뀌면, 큰 손실이 발생할 수 있습니다.
  2. 잘못된 변수 설정으로 인해 전략이 제대로 작동하지 않을 수 있습니다. 최적화를 통해 최적의 변수 조합을 찾아야 합니다.
  3. 데이터 처리 시간이 너무 길어지면 신호 지연이 발생할 수 있다. 지표 계산을 최적화하여 가능한 한 실시간으로 만들 필요가 있다.

리스크를 제어하기 위해, 스톱, 트레일 스톱 또는 옵션 사용 등의 방법으로 수익을 잠금할 수 있다. 또한, 파라미터 조합을 반복적으로 테스트하여 신뢰할 수 있는 파라미터 범위를 찾아야 한다. 마지막으로, 지표 계산 시간에도 주의를 기울이고, 신호의 실시간성을 추구해야 한다.

최적화 방향

이 전략은 다음과 같은 부분에서 최적화될 수 있습니다.

  1. 트렌드를 판단하는 더 신뢰할 수 있는 방법을 찾기 위해 더 많은 지표의 조합을 테스트하십시오.
  2. 그리고 이 모든 것을 통해, 우리는 가장 좋은 것을 찾습니다.
  3. 신호 필터를 최적화하여 소음과 지연 사이의 균형을 잡습니다.
  4. 기계학습과 같은 방법으로 거래 규칙을 자동으로 생성하는 것을 시도하십시오.

최적화 과정에서, 신호 품질과 전략의 안정성을 평가하기 위해 회수 및 시뮬레이션 거래를 최대한 활용해야합니다. 충분히 검증된 최적화方案만이 실장에 적용될 수 있습니다.

요약하다

이 전략overall는 좋은 트렌드 추적 전략이다. 그것은 여러 지표를 사용하여 추세를 판단하고, 잘못된 신호를 줄이기 위해 필터를 설정하여 자동으로 정지 손실 추적 트렌드를 조정할 수 있다. 파라미터가 적절하게 설정되면, 그것은 중장선 트렌드를 성공적으로 잡을 수 있다. 다음 작업은 가장 좋은 파라미터를 찾고, 전략에 대한 검증과 최적화를 계속한다.

전략 소스 코드
/*backtest
start: 2023-12-03 00:00:00
end: 2023-12-06 00:00:00
period: 3m
basePeriod: 1m
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/
// © RafaelZioni

//@version=4
strategy(title = " BTC 15 min", overlay = true, pyramiding=1,initial_capital = 10000, default_qty_type= strategy.percent_of_equity, default_qty_value = 20, calc_on_order_fills=false, slippage=0,commission_type=strategy.commission.percent,commission_value=0.075)
strat_dir_input = input(title="Strategy Direction", defval="all", options=["long", "short", "all"])
strat_dir_value = strat_dir_input == "long" ? strategy.direction.long : strat_dir_input == "short" ? strategy.direction.short : strategy.direction.all
strategy.risk.allow_entry_in(strat_dir_value)
price = close
length8 = input(30,title = 'length of channel')
upmult = input(title = 'upper percent',type=input.float, step=0.1, defval=5)
lowmult = input(title = 'lower percent',type=input.float, step=0.1, defval=5)

basis = sma(close, length8)

vup = upmult * price / 100
vlow = lowmult * price / 100

upper = basis + vup
lower = basis - vlow
plot(basis, color=color.red)


//
fastLength = input(3, title="Fast filter length ", minval=1)
slowLength = input(21,title="Slow filter length",  minval=1)
source=close
v1=ema(source,fastLength)
v2=ema(source,slowLength)
//

leng=1
p1=close[1]

len55 = 10
//taken from https://www.tradingview.com/script/Ql1FjjfX-security-free-MTF-example-JD/
HTF = input("1D", type=input.resolution)
ti = change( time(HTF) ) != 0
T_c = fixnan( ti ? close : na )

vrsi = rsi(cum(change(T_c) * volume), leng)
pp=wma(vrsi,len55)

d=(vrsi[1]-pp[1])
len100 = 10
x=ema(d,len100)
//
zx=x/-1
col=zx > 0? color.lime : color.orange

//

tf10 = input("1", title = "Timeframe", type = input.resolution, options = ["1", "5", "15", "30", "60","120", "240","360","720", "D", "W"])

length = input(50, title = "Period", type = input.integer)
shift = input(1, title = "Shift", type = input.integer)

hma(_src, _length)=>
    wma((2 * wma(_src, _length / 2)) - wma(_src, _length), round(sqrt(_length)))
    
hma3(_src, _length)=>
    p = length/2
    wma(wma(close,p/3)*3 - wma(close,p/2) - wma(close,p),p)

b =security(syminfo.tickerid, tf10, hma3(close[1], length)[shift])
//plot(a,color=color.gray)
//plot(b,color=color.yellow)
close_price = close[0]
len = input(25)

linear_reg = linreg(close_price, len, 0)




buy=crossover(linear_reg, b) 
sell=crossunder(linear_reg, b) or crossunder(close[1],upper)
//

src2=low
src3=high
Min =input(15)
leni = timeframe.isintraday and timeframe.multiplier >= 1 ? 
   Min / timeframe.multiplier * 7 : 
   timeframe.isintraday and timeframe.multiplier < 60 ? 
   60 / timeframe.multiplier * 24 * 7 : 7

l1 = wma(src2,leni)
h1 = wma(src3,leni)
//
m=(h1+l1)/2
//
len5 = 100

src5=m

//
multi = 2

mean = ema(src5, len5)  
stddev = multi * stdev(src5, len5)  
b5 = mean + stddev
s5 = mean - stddev


var bool long = na
var bool short = na

long :=crossover(src5, s5) 
short :=  crossunder(src5, b5)

var float last_open_long = na
var float last_open_short = na

last_open_long := long ? close : nz(last_open_long[1])
last_open_short := short ? close : nz(last_open_short[1])


entry_value =last_open_long
entry_value1=last_open_short

r=100
//
highb = highest(entry_value1, r)  
lowb = lowest(entry_value, r)  
d5 = highb - lowb  
me = (highb + lowb) / 2  
h4 = highb - d5 * 0.236  
c3 = highb - d5 * 0.382  
c4 = highb - d5 * 0.618  
l4 = highb - d5 * 0.764  
//
col2 = close >= me ? color.lime : color.red
       
p5 = plot(upper, color=col2)
p2 = plot(lower, color=col2)
fill(p5, p2,color=col2)
// Conditions

longCond = bool(na)
shortCond = bool(na)
longCond := crossover(zx,0) or buy 
shortCond := sell

// Count your long short conditions for more control with Pyramiding

sectionLongs = 0
sectionLongs := nz(sectionLongs[1])
sectionShorts = 0
sectionShorts := nz(sectionShorts[1])

if longCond
    sectionLongs := sectionLongs + 1
    sectionShorts := 0
    sectionShorts

if shortCond
    sectionLongs := 0
    sectionShorts := sectionShorts + 1
    sectionShorts

// Pyramiding

pyrl = 1


// These check to see your signal and cross references it against the pyramiding settings above

longCondition = longCond and sectionLongs <= pyrl
shortCondition = shortCond and sectionShorts <= pyrl

// Get the price of the last opened long or short

last_open_longCondition = float(na)
last_open_shortCondition = float(na)
last_open_longCondition := longCondition ? open : nz(last_open_longCondition[1])
last_open_shortCondition := shortCondition ? open : nz(last_open_shortCondition[1])

// Check if your last postion was a long or a short

last_longCondition = float(na)
last_shortCondition = float(na)
last_longCondition := longCondition ? time : nz(last_longCondition[1])
last_shortCondition := shortCondition ? time : nz(last_shortCondition[1])

in_longCondition = last_longCondition > last_shortCondition
in_shortCondition = last_shortCondition > last_longCondition

// Take profit

isTPl = true
//isTPs = input(false, "Take Profit Short")
tp = input(2, "Exit Profit %", type=input.float)
long_tp = isTPl and crossover(high, (1 + tp / 100) * last_open_longCondition) and longCondition == 0 and in_longCondition == 1
//short_tp = isTPs and crossunder(low, (1 - tp / 100) * last_open_shortCondition) and 
   //shortCondition == 0 and in_shortCondition == 1

// Stop Loss

isSLl = input(true,"buy Loss Long")
//isSLs = input(false, "buy Loss Short")
sl = 0.0
sl := input(5, " rebuy %", type=input.float)
long_sl = isSLl and crossunder(low, (1 - sl / 100) * last_open_longCondition) and 
   longCondition == 0 and in_longCondition == 1
//short_sl = isSLs and crossover(high, (1 + sl / 100) * last_open_shortCondition) and 
   //shortCondition == 0 and in_shortCondition == 1

//
// Conditions

longCond5 = bool(na)
shortCond5 = bool(na)
longCond5 := longCondition
shortCond5 := long_tp

// 

sectionLongs5 = 0
sectionLongs5 := nz(sectionLongs5[1])
sectionShorts5 = 0
sectionShorts5 := nz(sectionShorts5[1])

if longCond5
    sectionLongs5 := sectionLongs5 + 1
    sectionShorts5 := 0
    sectionShorts5

if shortCond5
    sectionLongs5 := 0
    sectionShorts5 := sectionShorts5 + 1
    sectionShorts5

// 

pyr5 = 1


longCondition5 = longCond5 and sectionLongs5 <= pyr5
shortCondition5 = shortCond5 and sectionShorts5 <= pyr5

// Get the price of the last opened long or short

last_open_longCondition5 = float(na)
last_open_shortCondition5 = float(na)
last_open_longCondition5 := longCondition5 ? open : nz(last_open_longCondition5[1])
last_open_shortCondition5 := shortCondition5 ? open : nz(last_open_shortCondition5[1])

last_longCondition5 = float(na)
last_shortCondition5 = float(na)
last_longCondition5 := longCondition5 ? time : nz(last_longCondition5[1])
last_shortCondition5 := shortCondition5 ? time : nz(last_shortCondition5[1])

in_longCondition5 = last_longCondition5 > last_shortCondition5
in_shortCondition5 = last_shortCondition5 > last_longCondition5
//
filter=input(true)
g(v, p) => round(v * (pow(10, p))) / pow(10, p)
risk     = input(100)
leverage = input(1)
c = g((strategy.equity * leverage / open) * (risk / 100), 4)

//
l =(v1 > v2 or filter == false ) and longCondition or long_sl
//
//l = longCondition or long_sl
s=shortCondition5  
if l 
    strategy.entry("buy", strategy.long,c)
if s 
    strategy.entry("sell", strategy.short,c)


per(pcnt) =>
    strategy.position_size != 0 ? round(pcnt / 100 * strategy.position_avg_price / syminfo.mintick) : float(na)
stoploss=input(title=" stop loss", defval=5, minval=0.01)
los = per(stoploss)
q1=input(title=" qty_percent1", defval=50, minval=1)
q2=input(title=" qty_percent2", defval=50, minval=1)

tp10=input(title=" Take profit1", defval=1, minval=0.01)
tp20=input(title=" Take profit2", defval=2, minval=0.01)

strategy.exit("x1", qty_percent = q1, profit = per(tp10), loss = los)
strategy.exit("x2", qty_percent = q2, profit = per(tp20), loss = los)