
Strategi ini menilai arah trend dengan mengira perkalian purata bergerak, digabungkan dengan harga dan penampang PMax, menggunakan cara perdagangan dua hala jangka panjang, melakukan lebih banyak apabila trend meningkat, melakukan kosong apabila trend menurun, menilai risiko memegang kedudukan secara langsung untuk keluar dengan keuntungan.
Indikator utama strategi ini adalah penggandaan purata bergerak. Parameter indikator termasuk: Panjang kitaran ATR, kali ganda ATR, jenis dan panjang purata bergerak. Nilai ATR mewakili kadar turun naik dalam tempoh.
Penunjuk PMax mewakili harga berhenti atau berhenti. Penunjuk ini dikira dengan menggabungkan nilai ATR dan arah trend. Dalam pasaran bullish, PMax adalah bersamaan dengan penggandaan purata bergerak tolak perkalian nilai ATR dan perkalian perkalian, sebagai garis berhenti. Dalam pasaran bearish, PMax adalah bersamaan dengan penggandaan purata bergerak ditambah nilai ATR dan perkalian perkalian, sebagai garis berhenti.
Apabila harga dan penunjuk PMax berlaku di atas persimpangan, buatlah isyarat lebih banyak; apabila harga dan penunjuk PMax berlaku di bawah persimpangan, buatlah isyarat lebih sedikit. Strategi ini digunakan untuk masuk ke dalam permainan, buat lebih banyak dalam trend ke atas, dan kosong dalam trend ke bawah, dan secara dinamik menjejaki stop loss.
Strategi ini mempunyai kelebihan berikut:
Menggunakan kaedah perdagangan dua hala yang panjang, boleh berdagang di seluruh pasaran, inklusif.
Penggunaan penggandaan penunjuk purata bergerak, isyarat perdagangan stabil dan boleh dipercayai.
Mengendalikan risiko dengan berkesan dengan menggunakan Stop Loss dan PMax.
Tempoh pengiraan dan parameter penggandaan boleh disesuaikan, dan banyak keserasian.
Strategi ini juga mempunyai risiko:
Penetapan parameter yang tidak betul boleh menyebabkan kerugian perdagangan whipsaw.
Perdagangan kosong memerlukan perhatian terhadap risiko pengekangan leverage.
Ia adalah satu risiko yang tidak dapat dielakkan yang boleh menyebabkan turun naik pasaran yang teruk.
Penyelesaian:
Parameter pengoptimuman untuk mengurangkan kebarangkalian whipsaw
Mengendalikan had leverage dengan betul, menyebarkan risiko kedudukan.
Peningkatan ATR, memperluaskan jangkauan stop loss.
Strategi ini boleh dioptimumkan dengan:
Uji kestabilan parameter pasaran dan kitaran yang berbeza.
Menggunakan algoritma pembelajaran mesin untuk mengoptimumkan parameter secara automatik.
Mengambil keputusan mengenai struktur pasaran dengan menggunakan teknologi seperti pembelajaran mendalam.
Mengintegrasikan lebih banyak sumber data untuk meningkatkan keputusan.
Strategi ini secara keseluruhan berjalan dengan mantap dan mempunyai keterangkuman yang kuat. Menggunakan perdagangan dua arah jangka panjang dan stop loss dinamik, ia dapat mengawal risiko dengan berkesan. Dengan pengoptimuman parameter dan pengulangan model, diharapkan untuk mendapatkan kesesuaian dan keberkesanan perdagangan yang lebih baik. Secara keseluruhannya, strategi ini patut mendapat 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)