Strategi ini mengira garis purata bergerak perkalian dan menggabungkan penyeberangan harga dan penunjuk PMax untuk menentukan arah trend. Ia menggunakan perdagangan dua arah untuk lama apabila trend naik dan pendek apabila trend turun, menilai risiko kedudukan dalam masa nyata untuk keluar dengan keuntungan.
Indikator utama strategi ini adalah garis purata bergerak perkalian. Parameter penunjuk termasuk: tempoh ATR, pengganda ATR, jenis purata bergerak dan panjang. Nilai ATR mewakili turun naik sepanjang tempoh. Garis purata bergerak perkalian sama dengan harga purata ditambah / dikurangkan hasil perkalian ATR dan ATR sepanjang tempoh. Apabila harga di atas garis terdapat isyarat panjang. Apabila harga di bawah garis terdapat isyarat pendek.
Indikator PMax mewakili harga stop loss atau mengambil keuntungan. Ia dikira dari nilai ATR dan arah trend. Dalam trend menaik, PMax sama dengan purata bergerak dikurangkan ATR pengganda kali ATR, bertindak sebagai garis stop loss. Dalam downtrend, PMax sama dengan purata bergerak ditambah ATR pengganda kali ATR, bertindak sebagai garis mengambil keuntungan.
Apabila harga melintasi penunjuk PMax ke atas terdapat isyarat panjang. Apabila harga melintasi penunjuk PMax ke bawah terdapat isyarat pendek. Strategi memasuki dan keluar berdasarkan isyarat, pergi lama dalam trend menaik dan pendek dalam trend menurun, dengan kehilangan berhenti dinamik dan mengambil keuntungan.
Kelebihan strategi ini:
Mengambil perdagangan dua arah menjadikannya sangat merangkumi semua keadaan pasaran.
Menggunakan purata bergerak berganda menghasilkan isyarat perdagangan yang stabil dan boleh dipercayai.
Dengan PMax untuk stop loss / mengambil keuntungan, ia berkesan mengawal risiko.
Siklus yang boleh diselaraskan dan parameter pengganda menjadikannya sangat mudah disesuaikan.
Terdapat juga beberapa risiko:
Tetapan parameter yang tidak betul boleh menyebabkan kehilangan whipsaw.
Berhati-hati dengan had leverage semasa membeli pendek.
Kejadian Black Swan sukar dielakkan.
Penyelesaian:
Mengoptimumkan parameter untuk mengurangkan whipsaws.
Kawal leverage dengan bijak dan diversifikasi.
Tingkatkan pengganda ATR untuk meluaskan jarak berhenti.
Strategi ini boleh dinaik taraf dengan cara seperti:
Uji kestabilan di pasaran dan kitaran yang berbeza.
Gunakan pembelajaran mesin untuk mengoptimumkan parameter secara automatik.
Menghakimi rejim pasaran dengan teknik pembelajaran mendalam.
Mengintegrasikan lebih banyak sumber data untuk memperkasakan keputusan.
Performa keseluruhan strategi ini adalah stabil dengan inklusif yang kuat. Dengan mengamalkan perdagangan dua arah dan stop loss / mengambil keuntungan dinamik, ia berkesan mengawal risiko. Melalui penyesuaian parameter dan pengulangan model, kecocokan dan keberkesanan strategi dapat ditingkatkan lagi. Secara umum ini adalah strategi yang bernilai perhatian dan aplikasi jangka panjang.
/*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)