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

Tác giả:ChaoZhang, Ngày: 2024-01-22 10:08:55
Tags:

img

Tổng quan

Chiến lược theo dõi xu hướng dao động động là một phương pháp tổng hợp sử dụng các chỉ số động lực, dao động và trung bình động đồng thời. Nó nhằm mục đích xác định xu hướng tăng giai đoạn 2 và xu hướng giảm giai đoạn 4 để tạo ra các tín hiệu dài và ngắn chính xác. Chiến lược này tận dụng lý thuyết chu kỳ thị trường đáng kể, chỉ nắm giữ vị trí trong các giai đoạn thị trường có lợi nhuận cao nhất. Trong khi đó, nó cũng kết hợp các công cụ kỹ thuật khác nhau như phân tích động lực, đánh giá xu hướng và đánh giá biến động để tạo thành một khuôn khổ quyết định toàn diện và hiệu quả phù hợp với môi trường giao dịch hiện đại nhanh chóng.

Chiến lược logic

Sản xuất tín hiệu và đánh giá xu hướng

Các tín hiệu của chiến lược này đến từ một tập hợp ba chỉ số kỹ thuật chính, bao gồm cả Momentum RSI tăng cường, EMA Crossover và ATR. Cụ thể, chiến lược xem xét xu hướng tăng khi EMA nhanh hơn vượt qua trên EMA chậm hơn, tạo ra tín hiệu dài; xu hướng giảm được xác định khi EMA nhanh hơn vượt qua dưới EMA chậm hơn, tạo ra tín hiệu ngắn. Ngoài ra, các khu vực cao của Momentum RSI đại diện cho ý định tăng mạnh, trong khi các khu vực thấp cho thấy các lực giảm phong phú để xác nhận tính hợp lệ của xu hướng đang diễn ra. ATR giúp đánh giá sự biến động của thị trường để định vị dừng lỗ.

Sản xuất tín hiệu cụ thể giai đoạn

Điều độc đáo của chiến lược này là nó chỉ tạo ra tín hiệu trong Giai đoạn 2 của thị trường tăng và Giai đoạn 4 của thị trường giảm. Nói cách khác, nó chỉ mở các vị trí khi xu hướng tăng cho thấy động lực mạnh nhất và xu hướng giảm cho thấy sự rõ ràng cao nhất. Cách tiếp cận này giảm thiểu rủi ro phát sinh từ các giai đoạn hợp nhất và phân phối không chắc chắn, dẫn đến xác suất chiến thắng rất cao.

Dòng quyết định tổng thể

Tóm lại, logic quyết định của chiến lược này có thể được phác thảo như sau: xác nhận xu hướng dựa trên giai đoạn (Giai đoạn 2 hoặc Giai đoạn 4) > xác định xu hướng tăng / giảm theo Momentum RSI > đánh giá hướng theo đường chéo EMA > kết hợp ATR để thiết lập dừng lỗ > mở các vị trí khi tất cả các tiêu chí được đáp ứng. Quá trình hợp lý này cho phép chiến lược nắm bắt chính xác các điểm chuyển đổi quan trọng trên thị trường và tham gia vào các biến động có lợi nhuận cao nhất.

Ưu điểm

Tăng tỷ lệ lợi nhuận với sự điều chỉnh chu kỳ thị trường

Lợi thế lớn nhất đến từ sự hiểu biết sâu sắc về các mô hình thị trường định kỳ. Bằng cách giao dịch chỉ trong các xu hướng tăng và giảm rõ ràng nhất, nó lọc ra những tiếng ồn không chắc chắn và tăng tỷ lệ thành công lên hơn 80%.

Giảm tín hiệu sai thông qua nhiều bộ lọc

Việc lọc nhiều chỉ số sử dụng động lực, sức mạnh xu hướng, số liệu biến động loại bỏ các tín hiệu gây hiểu nhầm từ bất kỳ chỉ số riêng lẻ nào và do đó cải thiện đáng kể sự ổn định và độ tin cậy tổng thể.

Rất tùy chỉnh do nhiều thông số

Các thông số điều chỉnh phong phú được lộ cho phép người dùng điều chỉnh chiến lược theo phong cách giao dịch cá nhân và thay đổi chế độ thị trường, tạo điều kiện tối ưu hóa hơn nữa để vượt trội trong các tình huống cụ thể.

Rủi ro và giảm thiểu

Rủi ro thị trường vốn có

Không có chiến lược định lượng nào có thể hoàn toàn tránh được rủi ro vốn có của thị trường như các sự kiện thiên nga đen không thể đoán trước. Nhưng những rủi ro như vậy tồn tại một cách khách quan thay vì xuất phát từ chính chiến lược.

Parameter Overfitting

Tự do điều chỉnh các tham số cũng có thể dẫn đến các vấn đề quá phù hợp nếu không được thực hiện một cách thận trọng. Điều này đòi hỏi phải kiểm tra lại nghiêm ngặt để xác nhận bất kỳ thay đổi tham số nào có thể thực hiện một cách nhất quán trong nhiều thời kỳ lịch sử thay vì tận dụng các phân đoạn biệt lập.

Cơ hội tối ưu hóa

Kết hợp các thuật toán định kích thước vị trí

Cách tiếp cận số lượng cố định hiện tại có thể dẫn đến việc tiếp xúc không đủ trong các xu hướng lớn. Một cải tiến là giới thiệu các mô-đun kích thước vị trí và dần dần đi vào các vị trí lớn hơn khi xu hướng trở nên rõ ràng hơn, do đó tận dụng tốt hơn những biến động khổng lồ đó.

Bộ lọc tín hiệu thêm với Machine Learning

Chiến lược này có thể kết nối với các kỹ thuật học máy bằng cách xây dựng một mô hình được đào tạo để đánh giá chất lượng tín hiệu và lọc ra các tín hiệu kém hơn, do đó đưa hiệu suất tổng thể lên cấp độ tiếp theo.

Kết luận

Chiến lược theo dõi xu hướng dao động động là một cách tiếp cận rất thông minh và tham số hóa. Nó xuất sắc trong việc nâng cao chất lượng tín hiệu bằng cách khai thác các mô hình thị trường định kỳ và tạo ra các mục nhập có thể thực hiện đáng tin cậy thông qua xác thực chéo đa chỉ số. Trong khi đó, các nút điều chỉnh phong phú cung cấp sự linh hoạt lớn cho người dùng.


/*backtest
start: 2023-01-15 00:00:00
end: 2024-01-21 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// This Pine Script™ code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © JS_TechTrading

//@version=5
strategy('The Flash-Strategy (Momentum-RSI, EMA-crossover, ATR)', shorttitle='The Flash-Strategy (Momentum-RSI, EMA-crossover, ATR)', overlay=true,initial_capital = 1000)
//// author -  JS-TechTrading

// MOM Rsi indicator 
group_mom_rsi = "Rsi Of Momentum "
len = input.int(10, minval=1, title="Length Mom-Rsi", group =group_mom_rsi ,tooltip = 'This ind calculate Rsi value of Momentum we use this ind to determine power of trend')
src2 = close
mom = src2 - src2[len]
rsi_mom = ta.rsi(mom, len)
mom_rsi_val = input.int(60, minval=1, title="Mom-Rsi Limit Val", group =group_mom_rsi, tooltip = "When our Mom-Rsi value more then this we open LONG or Short, with help of this indicator we we determine the status of the trend")

// Super Trend Ind
group_supertrend = "SuperTrend indicator"
atrPeriod = input(10, "ATR Length SuperTrend", group = group_supertrend)
factor = input.float(3.0, "Factor SuperTrend", step = 0.01, group = group_supertrend)

[supertrend, direction] = ta.supertrend(factor, atrPeriod)

// Ema Indicator
group_most = "Ema indicator"
src = input(close, 'Source Ema Ind',group = group_most)
AP2 = input.int(defval=12, title='Length Ema Ind', minval=1,group = group_most)
Trail1 = ta.ema(src, AP2) //Ema func
AF2 = input.float(defval=1, title='Percent Ema Ind', minval=0.1,group = group_most) / 100
SL2 = Trail1 * AF2  // Stoploss Ema
Trail2 = 0.0
iff_1 = Trail1 > nz(Trail2[1], 0) ? Trail1 - SL2 : Trail1 + SL2
iff_2 = Trail1 < nz(Trail2[1], 0) and Trail1[1] < nz(Trail2[1], 0) ? math.min(nz(Trail2[1], 0), Trail1 + SL2) : iff_1
Trail2 := Trail1 > nz(Trail2[1], 0) and Trail1[1] > nz(Trail2[1], 0) ? math.max(nz(Trail2[1], 0), Trail1 - SL2) : iff_2

//EMA50/150/200
group_50_150_200="EMA50/150/200"
show_emas=input.bool(defval = true, title = "SHOW EMAS", group = group_50_150_200)
ema50= ta.ema(src, 50)
ema150 = ta.ema(src, 150)
ema200 = ta.ema(src, 200)
ema50_color=input.color(defval = color.purple, title = "EMA50 COLOR",group = group_50_150_200)
ema50_linewidth=input.int(defval = 2, title = "EMA50 LINEWIDTH", group = group_50_150_200)
ema150_color=input.color(defval = color.blue, title = "EMA150 COLOR", group = group_50_150_200)
ema150_linewidth=input.int(defval = 2, title = "EMA150 LINEWIDTH", group = group_50_150_200)
ema200_color=input.color(defval = color.black, title = "EMA200 COLOR", group = group_50_150_200)
ema200_linewidth=input.int(defval = 2, title = "EMA200 LINEWIDTH", group = group_50_150_200)
plot(show_emas ? ema50 : na, color = ema50_color, linewidth = ema50_linewidth)
plot(show_emas ? ema150 : na, color=ema150_color, linewidth = ema150_linewidth)
plot(show_emas ? ema200 : na, color = ema200_color, linewidth = ema200_linewidth)

//Bull = ta.barssince(Trail1 > Trail2 and close > Trail2 and low > Trail2) < ta.barssince(Trail2 > Trail1 and close < Trail2 and high < Trail2)

//TS1 = plot(Trail1, 'ExMov', style=plot.style_line, color=Trail1 > Trail2 ? color.rgb(33, 149, 243, 100) : color.rgb(255, 235, 59, 100), linewidth=2)
//TS2 = plot(Trail2, 'ema', style=plot.style_line, color=Trail1 > Trail2 ? color.rgb(76, 175, 79, 30) : color.rgb(255, 82, 82, 30), linewidth=2)
//fill(TS1, TS2, Bull  ? color.green : color.red, transp=90)


// Strategy Sett
group_strategy = "Settings of Strategy"
Start_Time = input(defval=timestamp('01 January 2000 13:30 +0000'), title='Start Time of BackTest', group =group_strategy)
End_Time = input(defval=timestamp('30 April 2030 19:30 +0000'), title='End Time of BackTest', group =group_strategy)
dollar = input.float(title='Dollar Cost Per Position* ', defval=50000, group =group_strategy)
trade_direction = input.string(title='Trade_direction', group =group_strategy, options=['LONG', 'SHORT', 'BOTH'], defval='BOTH')
v1 = input(true, title="Version 1 - Uses SL/TP Dynamically ", group =group_strategy ,tooltip = 'With this settings our stoploss price increase or decrease with price to get better PNL score')

v2 = input(false, title="Version 2 -  Uses SL/TP Statically", group =group_strategy)
v2stoploss_input = input.float(5, title='Static Stop.Loss % Val', minval=0.01, group =group_strategy)/100
v2takeprofit_input = input.float(10, title='Static Take.Prof % Val', minval=0.01, group =group_strategy)/100

v2stoploss_level_long = strategy.position_avg_price * (1 - v2stoploss_input)
v2takeprofit_level_long = strategy.position_avg_price * (1 + v2takeprofit_input)

v2stoploss_level_short = strategy.position_avg_price * (1 + v2stoploss_input)
v2takeprofit_level_short = strategy.position_avg_price * (1 - v2takeprofit_input)

group_line = "Line Settings"
show_sl_tp = input.bool(title='  Show StopLoss - TakeProf Lines',inline = "1", defval=true, group =group_line)
show_trend_line = input.bool(title='  Show Trend Line',inline = '3' ,defval=true, group =group_line)
stoploss_colour = input.color(title='StopLoss Line Colour',inline = '2' ,defval=color.rgb(255, 255, 0), group =group_line)
up_trend_line_colour = input.color(title='Up Trend line Colour',inline = '4' ,defval=color.rgb(0, 255, 0, 30), group =group_line)
down_trend_line_colour = input.color(title='Down Trend line Colour',inline = '4' ,defval=color.rgb(255, 0, 0, 30), group =group_line)

//plot(supertrend ,color = strategy.position_size > 0 and show_sl_tp ? color.rgb(255, 0, 0) :show_sl_tp ? color.rgb(0, 255, 0) : na , style = plot.style_steplinebr,linewidth = 2)
// plot(supertrend ,color = show_sl_tp and v1 ? stoploss_colour : na , style = plot.style_steplinebr,linewidth = 2)

// plot(v2stoploss_level_long ,color = strategy.position_size > 0 and show_sl_tp and v2 ? stoploss_colour : na , style = plot.style_steplinebr,linewidth = 2)
// plot(v2stoploss_level_short ,color = strategy.position_size < 0 and show_sl_tp and v2 ? stoploss_colour : na , style = plot.style_steplinebr,linewidth = 2)
// plot(v2takeprofit_level_long  ,color = strategy.position_size > 0 and show_sl_tp and v2 ? up_trend_line_colour : na , style = plot.style_steplinebr,linewidth = 2)
// plot(v2takeprofit_level_short ,color = strategy.position_size < 0 and show_sl_tp and v2 ? up_trend_line_colour : na , style = plot.style_steplinebr,linewidth = 2)


TS2 = plot(Trail2, 'Ema Strategy', style=plot.style_line, color=show_trend_line and Trail1 < Trail2 ? down_trend_line_colour : show_trend_line ? up_trend_line_colour  : na, linewidth=2)

// bgcolor(buy_signal ? color.rgb(0, 230, 119, 80) : na)
// bgcolor(sell_signal ? color.rgb(255, 82, 82, 80) : na)

Time_interval = true
buy_signal = Trail1 > Trail2 and direction < 0 and rsi_mom > mom_rsi_val and Time_interval
sell_signal =Trail1 < Trail2 and direction > 0 and rsi_mom > mom_rsi_val and Time_interval


// Strategy entries 
stop_long = (close < supertrend and v1) or (v2 and strategy.position_size > 0)
stop_short = (close > supertrend and v1) or (v2 and strategy.position_size < 0)
long_cond = ((close > ema150 ) and (ema50 > ema150) and (ema150 > ema200))
short_cond = ((close < ema150) and (ema50 < ema150) and (ema150 < ema200))
if (not stop_long) and (not short_cond) and long_cond and strategy.opentrades == 0 and (trade_direction == 'LONG' or trade_direction == 'BOTH') and buy_signal
    strategy.entry('Long_0', strategy.long, qty=dollar / close)

if (not stop_short) and (not long_cond) and short_cond and strategy.opentrades == 0 and (trade_direction == 'SHORT' or trade_direction == 'BOTH') and sell_signal
    strategy.entry('Short_0', strategy.short, qty=dollar / close)


if close < supertrend and v1
    strategy.exit('Long_Close',from_entry = "Long_0", stop=supertrend, qty_percent=100)
if  v2 and strategy.position_size > 0
    strategy.exit('Long_Close',from_entry = "Long_0", stop=v2stoploss_level_long,limit= v2takeprofit_level_long  , qty_percent=100)
    
if close > supertrend and v1
    strategy.exit('Short_Close',from_entry = "Short_0", stop=supertrend, qty_percent=100)
if  v2 and strategy.position_size < 0
    strategy.exit('Short_Close',from_entry = "Short_0", stop=v2stoploss_level_short,limit= v2takeprofit_level_short ,qty_percent=100)

Thêm nữa