Hệ thống đảo ngược xu hướng

Tác giả:ChaoZhang, Ngày: 2023-10-23 17:18:28
Tags:

img

Tổng quan

Hệ thống đảo ngược xu hướng là một chiến lược theo xu hướng sử dụng các đường trung bình động, chỉ số CCI và chỉ số Supertrend để xác định xu hướng và tham gia vào pullbacks.

Chiến lược logic

Chiến lược sử dụng EMA 21 giai đoạn như trung bình di chuyển ngắn hạn và EMA 55 giai đoạn như trung bình di chuyển dài hạn.

Chỉ số CCI cho thấy khi nào giá đã đạt đến mức độ cực đoan. Tín hiệu cấp 1 là khi CCI đạt 100/-100 theo mặc định, cấp 2 là 140/-140 và cấp 3 là 180/-180.

Chỉ số Supertrend xác định hướng xu hướng cụ thể. Nó kết hợp ATR để xác định mức dừng lỗ và mức nhập cảnh cho xu hướng tăng và giảm.

Khi 21 EMA trên 55 EMA và CCI đạt mức thấp (khu vực quá bán), nó có thể báo hiệu bước vào dài. Khi 21 EMA dưới 55 EMA và CCI đạt mức cao (khu vực quá mua), nó có thể báo hiệu bước vào ngắn. Stop loss được đặt ở mức dừng của Supertrend, và lấy lợi nhuận được cố định ở 400 pips.

Phân tích lợi thế

Chiến lược này kết hợp nhiều chỉ số để xác định xu hướng và tình huống mua quá mức / bán quá mức, giúp lọc các sự phá vỡ sai. Tỷ lệ lợi nhuận cố định cho phép tỷ lệ rủi ro-lợi nhuận ổn định. Giao dịch với xu hướng mang lại tỷ lệ thắng cao hơn.

Phân tích rủi ro

Các thông số cần được tối ưu hóa cho các biểu tượng khác nhau vì các thiết lập hiện tại có thể không lý tưởng. Phương pháp dừng lỗ là thô và không thể thích nghi với các điều kiện thị trường khác nhau. Lợi nhuận cố định không điều chỉnh dựa trên biến động thị trường. CCI đôi khi có thể tạo ra tín hiệu sai. Cần đánh giá thêm về động lực của xu hướng để tránh sự biến động.

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

Kiểm tra các thiết lập tham số trên các biểu tượng khác nhau, tối ưu hóa thời gian MA, thời gian ATR, nhân ATR v.v. Xem xét dừng lại hoặc dừng ATR để dừng lỗ thích nghi. Kiểm tra lợi nhuận dựa trên ATR cho mục tiêu lợi nhuận năng động. Thêm bộ lọc để kiểm tra động lực xu hướng khi nhận tín hiệu CCI để tránh thị trường hỗn loạn. Thêm các chỉ số sức mạnh xu hướng có thể định lượng để xác nhận xu hướng tốt hơn.

Tóm lại

Hệ thống đảo ngược xu hướng kết hợp trung bình động, CCI và Supertrend để xác định xu hướng và mua quá mức / bán quá mức cho các mục khôi phục. Nó có sự ổn định và tỷ lệ thắng tương đối cao, nhưng cơ chế dừng lỗ, lấy lợi nhuận và xác nhận xu hướng cần tối ưu hóa thêm để đảm bảo độ bền trên các biểu tượng và điều kiện thị trường.


/*backtest
start: 2022-10-16 00:00:00
end: 2023-01-08 00:00:00
period: 1d
basePeriod: 1h
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("Oath", overlay=true)

// 21 EMA
emalength = input(21, title="Short EMA")
emashort = ema(close, emalength)

// 55 EMA
emalength2 = input(55, title="Long EMA")
ema = ema(close, emalength2)

//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)
//cciOS = (ccivalue <= ccioversold and ccivalue > ccioversold2)

//cciOB2 = (ccivalue >= ccioverbought2 and ccivalue < ccioverbought3)
//cciOS2 = (ccivalue <= ccioversold and ccivalue > ccioversold3)

//cciOB3 = (ccivalue >= ccioverbought3)
//cciOS3 = (ccivalue <= ccioversold3)

//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=false)

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

//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("Oath1", strategy.long, ordersize)
        strategy.exit( "Oath1 Close", from_entry="Oath1" , 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("Oath2", strategy.long, ordersize)
        strategy.exit( "Oath2 Close", from_entry="Oath2" , 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("Oath3", strategy.long, ordersize)
        strategy.exit( "Oath3 Close", from_entry="Oath3" , 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("Oath1.s", strategy.short, ordersize)
        strategy.exit( "Oath1 Close", from_entry="Oath1.s" , 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("Oath2.s", strategy.short, ordersize)
        strategy.exit( "Oath2 Close", from_entry="Oath2.s" , 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("Oath3.s", strategy.short, ordersize)
        strategy.exit( "Oath3 Close", from_entry="Oath3.s" , profit=statictargetvalue,stop=downstoploss[y3])

plotshape(uptrend and upsignal and degree, location=location.belowbar, color=color.green, transp=0, style=shape.triangleup, size=size.tiny, text="Oath up")
plotshape(downtrend and downsignal and degree, location=location.abovebar, color=color.red, transp=0, style=shape.triangledown, size=size.tiny, text="Oath down")
plotshape(uptrend and upsignal2 and degree2, location=location.belowbar, color=color.green, transp=0, style=shape.triangleup, size=size.tiny, text="Oath up+")
plotshape(downtrend and downsignal2 and degree2, location=location.abovebar, color=color.red, transp=0, style=shape.triangledown, size=size.tiny, text="Oath down+")
plotshape(uptrend and upsignal3 and degree3, location=location.belowbar, color=color.green, transp=0, style=shape.triangleup, size=size.tiny, text="Oath up++")
plotshape(downtrend and downsignal3 and degree3, location=location.abovebar, color=color.red, transp=0, style=shape.triangledown, size=size.tiny, text="Oath down++")



Thêm nữa