Tối ưu hóa Dynamic Breakout

Tác giả:ChaoZhang, Ngày: 2024-01-17 16:44:30
Tags:

img

Tổng quan

Chiến lược tối ưu hóa đột phá đà là một chiến lược theo xu hướng tạo ra các tín hiệu giao dịch và thiết lập dừng lỗ / lấy lợi nhuận dựa trên các chỉ số đà. Nó đánh giá hướng xu hướng thị trường bằng cách tính toán các giao thoa giữa giá và đường trung bình động, và xây dựng một cơ chế dừng lỗ năng động bằng cách sử dụng kênh ATR và LinReg. Trong khi đó, chiến lược cũng xác định mức mua quá mức / bán quá mức bằng cách sử dụng chỉ số CMO để có giá nhập tốt hơn.

Chiến lược logic

    1. Tính toán đường trung bình động của giá ZLEMA như chỉ số kỹ thuật cho hướng xu hướng
    1. Tính toán lỗ dừng dài và lỗ dừng ngắn dựa trên ATR
    1. Tính toán chỉ số CMO để xác định các khu vực mua quá mức / bán quá mức, kết hợp với đường trung bình động như tín hiệu nhập cảnh
    1. Tạo ra 3 bộ tín hiệu giao dịch dựa trên ATR, trung bình động và giá đột phá
    • Crossover giữa mức trung bình động và mức dừng lỗ
    • Crossover giữa mức giá và mức dừng lỗ
    • Crossover giữa giá và trung bình động
    1. Khả năng / vô hiệu hóa các kết hợp tín hiệu khác nhau thông qua cài đặt tham số
    1. Đặt tỷ lệ phần trăm rủi ro và định hình vị trí để quản lý rủi ro

Chiến lược tổng thể kết hợp nhiều chỉ số theo xu hướng ổn định và dừng lỗ tự động, đảm bảo các cơ hội giao dịch đầy đủ trong khi kiểm soát rủi ro giao dịch.

Phân tích lợi thế

Kết hợp nhiều chỉ số

Chiến lược sử dụng một sự kết hợp của các chỉ số bao gồm trung bình động, ATR, CMO vv Các chỉ số bổ sung lẫn nhau và cung cấp các phán đoán đáng tin cậy hơn về hướng xu hướng và khu vực mua quá mức / bán quá mức.

Dừng kéo động

Các lệnh dừng lỗ động dựa trên ATR có thể điều chỉnh linh hoạt mức dừng lỗ dựa trên sự biến động của thị trường, kiểm soát hiệu quả lỗ giao dịch duy nhất.

Quản lý rủi ro toàn diện

Chiến lược cung cấp kích thước vị trí và cài đặt tỷ lệ rủi ro, xác định tỷ lệ phần trăm tối đa của vốn có rủi ro để ngăn ngừa biến động nghiêm trọng của quỹ.

Các tín hiệu giao dịch dồi dào

Chiến lược cung cấp 3 bộ tín hiệu giao dịch. Bằng cách cho phép các kết hợp tín hiệu khác nhau, kết quả backtest tốt hơn có thể được thu được.

Phân tích rủi ro

Tần suất giao dịch cao

Có thể có giao dịch quá thường xuyên khi tất cả các kết hợp tín hiệu được bật. Điều này có thể tránh được bằng cách chỉ sử dụng một số tín hiệu.

Nhạy cảm với cài đặt tham số

Mô hình đa tham số làm cho tối ưu hóa tham số phức tạp và nhạy cảm hơn.

Tỷ lệ rút tiền cao hơn cho tín hiệu đột phá

Đối với các tín hiệu đột phá giá/giảm lỗ thuần túy, phạm vi dừng lỗ rộng hơn, có thể dẫn đến lỗ giao dịch đơn lớn hơn và rút tiền.

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

Kiểm tra các kết hợp tham số khác nhau

Tối ưu hóa các thông số như loại trung bình di chuyển / chiều dài, thời gian ATR, thời gian CMO để tìm sự phù hợp tối ưu.

Tối ưu hóa các chiến lược sử dụng tín hiệu

Kiểm tra hiệu suất chỉ sử dụng tín hiệu trung bình động, tín hiệu dừng lỗ hoặc tín hiệu kết hợp để tìm chiến lược sử dụng tốt nhất.

Hiệu suất thử nghiệm trên các sản phẩm khác nhau

Kiểm tra lại chiến lược trên các sản phẩm chỉ số, ngoại hối, hàng hóa để phân tích tính thích nghi trên các loại thị trường khác nhau.

Kết luận

Chiến lược này tích hợp nhiều chỉ số để xác định xu hướng, xây dựng dừng lỗ, phát hiện quá mua / quá bán. Bằng cách điều chỉnh các tham số và kết hợp tín hiệu, các chỉ số rủi ro thỏa đáng có thể đạt được. Hệ thống tổng thể toàn diện và đáng tin cậy để kiểm tra và tối ưu hóa trực tiếp hơn nữa.


/*backtest
start: 2024-01-09 00:00:00
end: 2024-01-16 00:00:00
period: 5m
basePeriod: 1m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © KivancOzbilgic
//developer: @KivancOzbilgic
//author: @KivancOzbilgic

strategy(title="Profit Maximizer PMax", overlay=true,
     pyramiding=0, initial_capital=1000,
     commission_type=strategy.commission.cash_per_order,
     commission_value=0.025, slippage=2)


src = input(hl2, title="Source")
Periods = input(title="ATR Length", type=input.integer, defval=10)
Multiplier = input(title="ATR Multiplier", type=input.float, step=0.1, defval=3.0)
mav = input(title="Moving Average Type", defval="ZLEMA", options=["SMA", "EMA", "WMA", "TMA", "VAR", "WWMA", "ZLEMA", "TSF"])
length =input(10, "Moving Average Length", minval=1)
changeATR= input(title="Change ATR Calculation Method ?", type=input.bool, defval=true)
showsupport = input(title="Show Moving Average?", type=input.bool, defval=true)
showsignalsk = input(title="Show Crossing Signals?", type=input.bool, defval=true)
showsignalsc = input(title="Show Price/Pmax Crossing Signals?", type=input.bool, defval=false)
highlighting = input(title="Highlighter On/Off ?", type=input.bool, defval=true)

usePosSize = input(title="Use Position Sizing?", type=input.bool, defval=true)
riskPerc   = input(title="Risk %", type=input.float, defval=0.5, step=0.25)

// Make input options that configure backtest date range
startDate = input(title="Start Date", type=input.integer,
     defval=1, minval=1, maxval=31)
startMonth = input(title="Start Month", type=input.integer,
     defval=1, minval=1, maxval=12)
startYear = input(title="Start Year", type=input.integer,
     defval=2019, minval=1800, maxval=2100)

endDate = input(title="End Date", type=input.integer,
     defval=1, minval=1, maxval=31)
endMonth = input(title="End Month", type=input.integer,
     defval=12, minval=1, maxval=12)
endYear = input(title="End Year", type=input.integer,
     defval=2021, minval=1800, maxval=2100)
     
// Look if the close time of the current bar
// falls inside the date range
inDateRange = true

atr2 = sma(tr, Periods)
atr= changeATR ? atr(Periods) : atr2
valpha=2/(length+1)
vud1=src>src[1] ? src-src[1] : 0
vdd1=src<src[1] ? src[1]-src : 0
vUD=sum(vud1,9)
vDD=sum(vdd1,9)
vCMO=nz((vUD-vDD)/(vUD+vDD))
VAR=0.0
VAR:=nz(valpha*abs(vCMO)*src)+(1-valpha*abs(vCMO))*nz(VAR[1])
wwalpha = 1/ length
WWMA = 0.0
WWMA := wwalpha*src + (1-wwalpha)*nz(WWMA[1])
zxLag = length/2==round(length/2) ? length/2 : (length - 1) / 2
zxEMAData = (src + (src - src[zxLag]))
ZLEMA = ema(zxEMAData, length)
lrc = linreg(src, length, 0)
lrc1 = linreg(src,length,1)
lrs = (lrc-lrc1)
TSF = linreg(src, length, 0)+lrs
getMA(src, length) =>
    ma = 0.0
    if mav == "SMA"
        ma := sma(src, length)
        ma

    if mav == "EMA"
        ma := ema(src, length)
        ma

    if mav == "WMA"
        ma := wma(src, length)
        ma

    if mav == "TMA"
        ma := sma(sma(src, ceil(length / 2)), floor(length / 2) + 1)
        ma

    if mav == "VAR"
        ma := VAR
        ma

    if mav == "WWMA"
        ma := WWMA
        ma

    if mav == "ZLEMA"
        ma := ZLEMA
        ma

    if mav == "TSF"
        ma := TSF
        ma
    ma
    
MAvg=getMA(src, length)
longStop = MAvg - Multiplier*atr
longStopPrev = nz(longStop[1], longStop)
longStop := MAvg > longStopPrev ? max(longStop, longStopPrev) : longStop
shortStop = MAvg + Multiplier*atr
shortStopPrev = nz(shortStop[1], shortStop)
shortStop := MAvg < shortStopPrev ? min(shortStop, shortStopPrev) : shortStop
dir = 1
dir := nz(dir[1], dir)
dir := dir == -1 and MAvg > shortStopPrev ? 1 : dir == 1 and MAvg < longStopPrev ? -1 : dir
PMax = dir==1 ? longStop: shortStop
plot(showsupport ? MAvg : na, color=#0585E1, linewidth=2, title="Moving Avg Line")
pALL=plot(PMax, color=color.red, linewidth=2, title="PMax", transp=0)

alertcondition(cross(MAvg, PMax), title="Cross Alert", message="PMax - Moving Avg Crossing!")
alertcondition(crossover(MAvg, PMax), title="Crossover Alarm", message="Moving Avg BUY SIGNAL!")
alertcondition(crossunder(MAvg, PMax), title="Crossunder Alarm", message="Moving Avg SELL SIGNAL!")
alertcondition(cross(src, PMax), title="Price Cross Alert", message="PMax - Price Crossing!")
alertcondition(crossover(src, PMax), title="Price Crossover Alarm", message="PRICE OVER PMax - BUY SIGNAL!")
alertcondition(crossunder(src, PMax), title="Price Crossunder Alarm", message="PRICE UNDER PMax - SELL SIGNAL!")


// Calculate position size
riskEquity  = (riskPerc / 100) * strategy.equity
atrCurrency = (atr(20) * syminfo.pointvalue)
posSize     = usePosSize ? floor(riskEquity / atrCurrency) : 1

//Long
buySignalk = crossover(MAvg, PMax)
plotshape(buySignalk and showsignalsk ? PMax*0.995 : na, title="Buy", text="BuyL", location=location.absolute, style=shape.labelup, size=size.tiny, color=color.green, textcolor=color.white, transp=0)


if(buySignalk and showsignalsk and inDateRange)
    strategy.entry(id="buySignalk", long=true, qty=posSize)
    
sellSignallk = crossunder(MAvg, PMax)
plotshape(sellSignallk and showsignalsk ? PMax*1.005 : na, title="Sell", text="SellL", location=location.absolute, style=shape.labeldown, size=size.tiny, color=color.red, textcolor=color.white, transp=0)

if(sellSignallk and showsignalsk and inDateRange)
    strategy.order(id="sellSignallk", long=false, qty=strategy.position_size)
    
//Short
buySignalc = crossover(src, PMax)
plotshape(buySignalc and showsignalsc ? PMax*0.995 : na, title="Buy", text="BuyS", location=location.absolute, style=shape.labelup, size=size.tiny, color=#0F18BF, textcolor=color.white, transp=0)

if(buySignalc and showsignalsc and inDateRange)
    strategy.entry(id="BuyS", long=false, qty=posSize)

sellSignallc = crossunder(src, PMax)
plotshape(sellSignallc and showsignalsc ? PMax*1.005 : na, title="Sell", text="SellS", location=location.absolute, style=shape.labeldown, size=size.tiny, color=#0F18BF, textcolor=color.white, transp=0)

if(sellSignallc and showsignalsc and inDateRange)
    strategy.order(id="SellS", long=true, qty=abs(strategy.position_size))

mPlot = plot(ohlc4, title="", style=plot.style_circles, linewidth=0,display=display.none)

longFillColor = highlighting ? (MAvg>PMax ? color.green : na) : na
shortFillColor = highlighting ? (MAvg<PMax ? color.red : na) : na

fill(mPlot, pALL, title="UpTrend Highligter", color=longFillColor)
fill(mPlot, pALL, title="DownTrend Highligter", color=shortFillColor)

// Exit open market position when date range ends
if (not inDateRange)
    strategy.close_all()
  

Thêm nữa