Chiến lược theo dõi xu hướng động


Ngày tạo: 2023-12-11 15:43:42 sửa đổi lần cuối: 2023-12-11 15:43:42
sao chép: 3 Số nhấp chuột: 731
1
tập trung vào
1621
Người theo dõi

Chiến lược theo dõi xu hướng động

Tổng quan

Ý tưởng chính của chiến lược này là theo dõi xu hướng thị trường một cách động, mua khi xu hướng tăng và bán khi xu hướng giảm. Nó đánh giá hướng xu hướng bằng cách tính toán nhiều chỉ số kết hợp, chẳng hạn như hồi quy tuyến tính, trung bình di chuyển Hull sửa đổi và nhiều hơn nữa.

Nguyên tắc chiến lược

Chiến lược này sử dụng nhiều chỉ số kỹ thuật để đánh giá hướng của xu hướng. Đầu tiên, nó tính một kênh phạm vi, giới hạn trên và dưới của kênh được tính dựa trên trung bình di chuyển đơn giản của close và một tham số đầu vào. Sau đó, nó tính một trung bình di chuyển Hull sửa đổi, được cho là mô tả xu hướng chính xác hơn. Ngoài ra, nó cũng tính một chỉ số quay ngược tuyến tính.

Để giảm tín hiệu sai, chiến lược này cũng thiết kế một số bộ lọc. Ví dụ, sử dụng EMA để xác định liệu có đang trong xu hướng giảm hay không, và sử dụng một chỉ số cửa sổ để xác định sự thay đổi của RSI. Các bộ lọc này có thể tránh tạo ra tín hiệu giao dịch trong tình huống biến động.

Về đầu vào và dừng lỗ, chiến lược này ghi lại giá mở vị trí cuối cùng và đặt phần trăm dừng lỗ. Ví dụ, nếu giá mở vị trí cuối cùng là 100 đô la, hãy đặt mục tiêu dừng là 102 đô la và giá dừng là 95 đô la. Điều này thực hiện theo dõi động.

Phân tích lợi thế

Chiến lược này có một số lợi thế:

  1. Động thái theo dõi xu hướng thay đổi, có thể dễ dàng nắm bắt hướng của đường dài hơn;
  2. Sử dụng nhiều bộ lọc để giảm tiếng ồn và tránh giao dịch thường xuyên trong tình huống chấn động;
  3. Tự động điều chỉnh vị trí dừng để theo dõi xu hướng;
  4. Bạn có thể tự động tìm ra sự kết hợp tham số tốt nhất bằng cách tối ưu hóa tham số.

Phân tích rủi ro

Chiến lược này cũng có một số rủi ro:

  1. Tuy nhiên, các nhà đầu tư vẫn không thể hoàn toàn tránh được rủi ro bị lôi kéo bởi xu hướng.
  2. Thiết lập tham số không đúng cách có thể dẫn đến hiệu suất chiến lược kém. Cần tìm ra sự kết hợp tham số tối ưu bằng cách tối ưu hóa.
  3. Thời gian xử lý dữ liệu quá dài có thể gây ra sự chậm trễ tín hiệu. Cần tối ưu hóa tính toán chỉ số để nó càng thực tế càng tốt.

Để kiểm soát rủi ro, bạn có thể thiết lập dừng lỗ, trail stop hoặc khóa lợi nhuận bằng cách sử dụng quyền chọn. Ngoài ra, phải thử nghiệm liên tục các bộ tham số để tìm ra phạm vi tham số đáng tin cậy. Cuối cùng, cũng cần chú ý đến thời gian tính toán chỉ số, cố gắng để tín hiệu có thời gian thực.

Hướng tối ưu hóa

Chiến lược này có thể được tối ưu hóa theo các khía cạnh sau:

  1. Thử nghiệm nhiều hơn các kết hợp các chỉ số để tìm cách xác định xu hướng một cách đáng tin cậy hơn;
  2. Điều chỉnh phạm vi tham số để tìm tham số tối ưu;
  3. Tối ưu hóa bộ lọc tín hiệu, tìm sự cân bằng giữa tiếng ồn và chậm trễ;
  4. Cố gắng tạo ra các quy tắc giao dịch tự động bằng cách học máy.

Trong quá trình tối ưu hóa, phải tận dụng tối đa các giao dịch phản hồi và mô phỏng để đánh giá chất lượng tín hiệu và sự ổn định của chiến lược. Chỉ có các chương trình tối ưu hóa được chứng minh đầy đủ mới được áp dụng cho thực tế.

Tóm tắt

Chiến lược này nói chung là một chiến lược theo dõi xu hướng tốt hơn. Nó sử dụng nhiều chỉ số để đánh giá xu hướng, đặt bộ lọc để giảm tín hiệu sai, có thể tự động điều chỉnh xu hướng theo dõi dừng lỗ. Nếu các tham số được đặt đúng, nó có thể bắt được xu hướng đường dài trung bình.

Mã nguồn chiến lược
/*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)