Chiến lược này tính toán đường trung bình động nhân và kết hợp các đường băng của giá và chỉ số PMax để xác định hướng xu hướng. Nó áp dụng giao dịch hai hướng dài khi xu hướng tăng và ngắn khi xu hướng giảm, đánh giá rủi ro vị trí trong thời gian thực để thoát ra với lợi nhuận.
Chỉ số cốt lõi của chiến lược này là đường trung bình chuyển động nhân. Các tham số chỉ số bao gồm: Thời gian ATR, nhân ATR, loại và chiều dài trung bình chuyển động. Giá trị ATR đại diện cho sự biến động trong thời gian.
Chỉ số PMax đại diện cho giá dừng lỗ hoặc lấy lợi nhuận. Nó được tính từ giá trị ATR và hướng xu hướng. Trong xu hướng tăng, PMax bằng trung bình di chuyển trừ ATR nhân ATR, hoạt động như một đường dừng lỗ. Trong xu hướng giảm, PMax bằng trung bình di chuyển cộng với ATR nhân ATR, hoạt động như một đường lấy lợi nhuận.
Khi giá vượt qua chỉ số PMax lên, có một tín hiệu dài. Khi giá vượt qua chỉ số PMax xuống, có một tín hiệu ngắn. Chiến lược đi vào và ra dựa trên các tín hiệu, đi dài trong xu hướng tăng và ngắn trong xu hướng giảm, với dừng lỗ và lấy lợi nhuận năng động.
Những lợi thế của chiến lược này:
Việc áp dụng giao dịch hai hướng làm cho nó bao gồm tất cả các điều kiện thị trường.
Áp dụng đường trung bình động nhân tạo ra các tín hiệu giao dịch ổn định và đáng tin cậy.
Với PMax cho dừng lỗ / lấy lợi nhuận, nó kiểm soát rủi ro hiệu quả.
Chu kỳ điều chỉnh và các thông số nhân làm cho nó rất thích nghi.
Ngoài ra còn có một số rủi ro:
Các thiết lập tham số không đúng có thể dẫn đến mất tích cưa.
Hãy chú ý đến giới hạn đòn bẩy khi mua ngắn.
Sự kiện thiên nga đen rất khó tránh được.
Giải pháp:
Tối ưu hóa các thông số để giảm chém.
Kiểm soát đòn bẩy một cách thận trọng và đa dạng hóa.
Tăng nhân ATR để mở rộng phạm vi dừng.
Chiến lược có thể được nâng cấp theo những cách như:
Kiểm tra sự ổn định trên các thị trường và chu kỳ khác nhau.
Áp dụng máy học để tự động tối ưu hóa các thông số.
Đánh giá các chế độ thị trường bằng các kỹ thuật học sâu.
Tích hợp nhiều nguồn dữ liệu hơn để trao quyền cho các quyết định.
Hiệu suất tổng thể của chiến lược này là ổn định với tính toàn diện mạnh mẽ. Bằng cách áp dụng giao dịch hai hướng và dừng mất mát / lấy lợi nhuận năng động, nó kiểm soát rủi ro một cách hiệu quả. Thông qua điều chỉnh tham số và lặp lại mô hình, tính phù hợp và hiệu quả của chiến lược có thể được cải thiện hơn nữa. Nói chung đây là một chiến lược đáng chú ý và áp dụng lâu dài.
/*backtest start: 2023-01-08 00:00:00 end: 2024-01-14 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/ // © melihtuna //developer: @KivancOzbilgic //author: @KivancOzbilgic //stretegy converter: @crypto_melih //@version=4 strategy("Profit Maximizer Strategy Long-Short", shorttitle="PMax-Strategy", overlay=true, default_qty_type=strategy.cash, default_qty_value=10000, initial_capital=10000, currency=currency.USD, commission_value=0, commission_type=strategy.commission.percent) 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="EMA", options=["SMA", "EMA", "WMA", "TMA", "VAR", "WWMA", "ZLEMA", "TSF"]) length =input(10, "Moving Average Length", minval=1) condition = input(title="Signal Type", defval="Only Crossing Signals", options=["Only Crossing Signals", "Only Price/Pmax Crossing Signals"]) 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) long_short = input(defval = false, title = "Long-Short", type=input.bool) 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!") buySignalk = crossover(MAvg, PMax) //plotshape(buySignalk and showsignalsk ? PMax*0.995 : na, title="Buy", text="Buy", location=location.absolute, style=shape.labelup, size=size.tiny, color=color.green, textcolor=color.white, transp=0) sellSignallk = crossunder(MAvg, PMax) //plotshape(sellSignallk and showsignalsk ? PMax*1.005 : na, title="Sell", text="Sell", location=location.absolute, style=shape.labeldown, size=size.tiny, color=color.red, textcolor=color.white, transp=0) buySignalc = crossover(src, PMax) //plotshape(buySignalc and showsignalsc ? PMax*0.995 : na, title="Buy", text="Buy", location=location.absolute, style=shape.labelup, size=size.tiny, color=#0F18BF, textcolor=color.white, transp=0) sellSignallc = crossunder(src, PMax) //plotshape(sellSignallc and showsignalsc ? PMax*1.005 : na, title="Sell", text="Sell", location=location.absolute, style=shape.labeldown, size=size.tiny, color=#0F18BF, textcolor=color.white, transp=0) 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) if(condition=="Only Crossing Signals") strategy.entry("BUY", strategy.long, when = buySignalk) else strategy.entry("BUY", strategy.long, when = buySignalc) if(long_short) if(condition=="Only Crossing Signals") strategy.entry("SELL", strategy.short, when = sellSignallk) else strategy.entry("SELL", strategy.short, when = sellSignallc) else if(condition=="Only Crossing Signals") strategy.close("BUY", when = sellSignallk) else strategy.close("BUY", when = sellSignallc)