Xu hướng bệnh nhân theo chiến lược

Tác giả:ChaoZhang, Ngày: 2024-01-18 12:40:11
Tags:

img

Tổng quan

Chiến lược theo xu hướng bệnh nhân là một chiến lược theo xu hướng. Nó sử dụng sự kết hợp của các đường trung bình động để xác định hướng xu hướng và dao động CCI để tạo ra các tín hiệu giao dịch. Chiến lược này theo đuổi các xu hướng lớn và có thể tránh hiệu quả các whipsaws trong các thị trường khác nhau.

Chiến lược logic

Chiến lược sử dụng sự kết hợp của EMA 21 giai đoạn và 55 giai đoạn để xác định hướng xu hướng. Xu hướng tăng được xác định khi EMA ngắn nằm trên EMA dài. Xu hướng giảm được xác định khi EMA ngắn nằm dưới EMA dài.

Chỉ số CCI được sử dụng để phát hiện các tình huống mua quá mức và bán quá mức. CCI vượt trên -100 tín hiệu tình trạng bán quá mức dưới cùng và vượt dưới 100 tín hiệu tình trạng mua quá mức trên. Các mức độ mua quá mức và bán quá mức khác nhau của CCI tạo ra các tín hiệu giao dịch với mức độ tin cậy khác nhau.

Khi xu hướng tăng được xác định, các tín hiệu bán quá mức mạnh từ CCI sẽ kích hoạt các lệnh đầu vào dài. Khi xu hướng giảm được xác định, các tín hiệu mua quá mức mạnh từ CCI sẽ kích hoạt các lệnh đầu vào ngắn.

Stop loss được thiết lập ở đường SuperTrend.

Phân tích lợi thế

Những lợi thế chính của chiến lược này là:

  1. Đi theo xu hướng lớn, tránh những điều khó khăn
  2. CCI phát hiện hiệu quả các điểm đảo ngược
  3. Cài đặt stop loss hợp lý với SuperTrend
  4. Tiêu chuẩn giá trị cổ phiếu

Phân tích rủi ro

Những rủi ro chính của chiến lược này là:

  1. Khả năng xác định xu hướng lớn sai
  2. Có khả năng tín hiệu sai từ CCI
  3. Khả năng stop loss không cần thiết với mức stop loss không phù hợp
  4. Khả năng thiếu lợi nhuận xu hướng với lợi nhuận cố định

Để đối phó với những rủi ro này, các tham số như thời gian EMA, thời gian CCI và mức dừng lỗ / lấy lợi nhuận có thể được tối ưu hóa.

Hướng dẫn tối ưu hóa

Các hướng tối ưu hóa chính là:

  1. Kiểm tra nhiều kết hợp chỉ số hơn để tìm các chỉ số xác minh xu hướng và tín hiệu tốt hơn.

  2. Sử dụng stop loss động và lấy lợi nhuận với ATR để theo dõi xu hướng và kiểm soát rủi ro tốt hơn.

  3. Giới thiệu các mô hình học máy được đào tạo trên dữ liệu lịch sử để đánh giá xác suất xu hướng.

  4. Tối ưu hóa các tham số cho các công cụ giao dịch khác nhau.

Kết luận

Chiến lược theo dõi xu hướng bệnh nhân là một chiến lược giao dịch xu hướng rất thực tế nói chung. Nó xác định xu hướng lớn với đường trung bình động và phát hiện tín hiệu đảo ngược với dao động CCI, trong khi thiết lập mức dừng lỗ hợp lý bằng chỉ số SuperTrend. Với việc điều chỉnh tham số thêm và nhiều kết hợp chỉ số hơn để xác minh tín hiệu, chiến lược này có thể được tối ưu hóa hơn nữa và đáng theo dõi trong giao dịch trực tiếp.


/*backtest
start: 2024-01-10 00:00:00
end: 2024-01-17 00:00:00
period: 1m
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/
// © greenmask9

//@version=4
strategy("Patient Trendfollower (7) Strategy", overlay=true)

// 21 EMA
emalength = input(21, title="Short EMA")
emashort = ema(close, emalength)
plot(emashort, color = color.purple, linewidth=1)

// 55 EMA
emalength2 = input(55, title="Long EMA")
ema = ema(close, emalength2)
plot(ema, color = color.green, linewidth=1)

//CCI calculation and inputs
lengthcci = input(20, minval=1, title="Overbought/sold detector period")
src = input(close, title="Overbought/sold detector source")
ma = sma(src, lengthcci)
ccivalue = (src - ma) / (0.015 * dev(src, lengthcci))


//CCI plotting
ccioverbought = input(defval=100, title="Overbought level 1")
ccioverbought2 = input(defval=140, title="Overbought level 2")
ccioverbought3 = input(defval=180, title="Overbought level 3")

ccioversold = input(defval=-100, title="Oversold level 1")
ccioversold2 = input(defval=-140, title="Oversold level 2")
ccioversold3 = input(defval=-180, title="Oversold level 3")

cciOB = (ccivalue >= ccioverbought and ccivalue < ccioverbought2)
plotshape(cciOB,  title= "Overbought", location=location.abovebar, color=color.lime, transp=0, style=shape.circle)
cciOS = (ccivalue <= ccioversold and ccivalue > ccioversold2)
plotshape(cciOS, title= "Oversold", location=location.belowbar, color=color.lime, transp=0, style=shape.circle)

cciOB2 = (ccivalue >= ccioverbought2 and ccivalue < ccioverbought3)
plotshape(cciOB2,  title= "Overbought", location=location.abovebar, color=color.red, transp=0, style=shape.circle)
cciOS2 = (ccivalue <= ccioversold and ccivalue > ccioversold3)
plotshape(cciOS2, title= "Oversold", location=location.belowbar, color=color.red, transp=0, style=shape.circle)

cciOB3 = (ccivalue >= ccioverbought3)
plotshape(cciOB3,  title= "Overbought", location=location.abovebar, color=color.black, transp=0, style=shape.circle)
cciOS3 = (ccivalue <= ccioversold3)
plotshape(cciOS3, title= "Oversold", location=location.belowbar, color=color.black, transp=0, style=shape.circle)

//Supertrend

length = input(title="ATR Period", type=input.integer, defval=55)
mult = input(title="ATR Multiplier", type=input.float, step=0.1, defval=5.0)
wicks = input(title="Take Wicks into Account ?", type=input.bool, defval=true)
illuminate = input(title="Illuminate Trend", type=input.bool, defval=true)

atr = mult * atr(length)

longStop = hl2 - atr
longStopPrev = nz(longStop[1], longStop)
longStop := (wicks ? low[1] : close[1]) > longStopPrev ? max(longStop, longStopPrev) : longStop

shortStop = hl2 + atr
shortStopPrev = nz(shortStop[1], shortStop)
shortStop := (wicks ? high[1] : close[1]) < shortStopPrev ? min(shortStop, shortStopPrev) : shortStop

dir = 1
dir := nz(dir[1], dir)
dir := dir == -1 and (wicks ? high : close) > shortStopPrev ? 1 : dir == 1 and (wicks ? low : close) < longStopPrev ? -1 : dir

longColor = color.new(color.green, 90)
shortColor = color.new(color.red, 90)
noneColor = color.new(color.white, 100)

longStopPlot = plot(dir == 1 ? longStop : na, title="Long Stop", style=plot.style_linebr, linewidth=2, color=longColor)
shortStopPlot = plot(dir == 1 ? na : shortStop, title="Short Stop", style=plot.style_linebr, linewidth=2, color=shortColor)
midPricePlot = plot(ohlc4, title="", style=plot.style_circles, linewidth=0)

longFillColor = illuminate ? (dir == 1 ? longColor : noneColor) : noneColor
shortFillColor = illuminate ? (dir == -1 ? shortColor : noneColor) : noneColor
fill(midPricePlot, longStopPlot, title="Long State Filling", color=longFillColor)
fill(midPricePlot, shortStopPlot, title="Short State Filling", color=shortFillColor)

//entries
uptrend = emashort>ema and dir == 1
upsignal = ccivalue<=ccioversold and ccivalue>ccioversold2
upsignal2 = ccivalue<=ccioversold2 and ccivalue>ccioversold3
upsignal3 = ccivalue<=ccioversold3
downtrend = emashort<ema and dir == -1
downsignal = ccivalue>=ccioverbought and ccivalue<ccioverbought2
downsignal2 = ccivalue>=ccioverbought2 and ccivalue<ccioverbought3
downsignal3 = ccivalue>=ccioverbought3

//adapts to the current bar, I need to save the bars number when the condition for buy was true, static number is spread
spread = input (0.00020, title="Spread")
upstoploss = longStop - spread
downstoploss = shortStop + spread
strategy.initial_capital = 50000
ordersize=floor(strategy.initial_capital/close)
testlong = input(title="Test longs", type=input.bool, defval=true)
testshort = input(title="Test shorts", type=input.bool, defval=true)
//new
degree = input(title="Test level 1 overbought/sold levels", type=input.bool, defval=true)
degree2 = input(title="Test level 2 overbought/sold levels", type=input.bool, defval=false)
degree3 = input(title="Test level 3 overbought/sold levels", type=input.bool, defval=false)

statictarget = input(title="Use static target", type=input.bool, defval=true)
statictargetvalue = input(title="Static target in pips", type=input.integer, defval=400)

//timetrade = input(title="Open trades only withing specified time", type=input.bool, defval=true)
//timtrade = input()

//přidat možnost TP podle ATR a sl podle ATR
buy1 = uptrend and upsignal and strategy.opentrades==0 and testlong and degree
x1 = barssince (buy1)
if (buy1)
//bodlo by zakázat atrtarget v tomto případě
    if (statictarget)
        strategy.entry("Long1", strategy.long, ordersize)
        strategy.exit( "Exitlong", from_entry="Long1" , profit=statictargetvalue,stop=upstoploss[x1])
 
buy2 = uptrend and upsignal2 and strategy.opentrades==0 and testlong and degree2
x2 = barssince (buy2)
if (buy2)
//bodlo by zakázat atrtarget v tomto případě
    if (statictarget)
        strategy.entry("Long2", strategy.long, ordersize)
        strategy.exit( "Exitlong", from_entry="Long2" , profit=statictargetvalue,stop=upstoploss[x2])
  
buy3 = uptrend and upsignal3 and strategy.opentrades==0 and testlong and degree3
x3 = barssince (buy3)
if (buy3)
//bodlo by zakázat atrtarget v tomto případě
    if (statictarget)
        strategy.entry("Long3", strategy.long, ordersize)
        strategy.exit( "Exitlong", from_entry="Long3" , profit=statictargetvalue,stop=upstoploss[x3])

sell1 = downtrend and downsignal and strategy.opentrades==0 and testshort and degree
y1 = barssince (sell1)
if (sell1)
    if (statictarget)
        strategy.entry("Sell1", strategy.short, ordersize)
        strategy.exit( "Exitshort", from_entry="Sell1" , profit=statictargetvalue,stop=downstoploss[y1])

sell2 = downtrend and downsignal2 and strategy.opentrades==0 and testshort and degree2
y2 = barssince (sell2)
if (sell2)
    if (statictarget)
        strategy.entry("Sell2", strategy.short, ordersize)
        strategy.exit( "Exitshort", from_entry="Sell2" , profit=statictargetvalue,stop=downstoploss[y2])

sell3 = downtrend and downsignal3 and strategy.opentrades==0 and testshort and degree3
y3 = barssince (sell3)
if (sell3)
    if (statictarget)
        strategy.entry("Sell3", strategy.short, ordersize)
        strategy.exit( "Exitshort", from_entry="Sell3" , profit=statictargetvalue,stop=downstoploss[y3])


Thêm nữa