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 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.
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.
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.
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ỹ.
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.
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.
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.
Đố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.
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.
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.
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.
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()