Strategi Penapis Purata Pergerakan Berganda Trend Terobosan


Tarikh penciptaan: 2023-11-27 17:03:08 Akhirnya diubah suai: 2023-11-27 17:03:08
Salin: 0 Bilangan klik: 689
1
fokus pada
1617
Pengikut

Strategi Penapis Purata Pergerakan Berganda Trend Terobosan

Gambaran keseluruhan

Ini adalah strategi yang menggunakan garis rata dan saluran Brin untuk membuat penilaian trend, dan menggabungkan prinsip penyaringan dan hentian yang terganggu. Ia dapat menangkap isyarat tepat pada masanya apabila trend berubah, mengurangkan isyarat salah dengan penyaringan dua garis rata, dan menetapkan hentian untuk mengawal risiko.

Prinsip Strategi

Strategi ini terdiri daripada beberapa bahagian:

  1. Penghakiman Trend: Menggunakan MACD untuk menentukan trend harga, membezakan antara tren multihead dan kosong.

  2. Penapisan julat: menggunakan saluran Brin untuk menentukan julat pergerakan harga dan menapis isyarat yang tidak menembusi julat.

  3. Pengesahan Garis Persamaan Ganda: Garis Persamaan Ganda yang terdiri daripada EMA pantas dan EMA perlahan, digunakan untuk mengesahkan isyarat trend. Isyarat beli hanya dihasilkan apabila EMA pantas> EMA perlahan.

  4. Mekanisme Hentikan Kerosakan: menetapkan titik hentikan kerugian, dan menghentikan kedudukan yang bersih apabila harga menembusi titik hentikan kerugian ke arah yang tidak baik.

Logik penghakiman isyarat masuk ialah:

  1. MACD diiktiraf sebagai trend ke atas
  2. Harga naik melalui laluan Brin
  3. EMA pantas lebih tinggi daripada EMA perlahan

Sinyal beli dihasilkan apabila ketiga-tiga syarat di atas dipenuhi.

Logik kedudukan sejajar terbahagi kepada dua jenis, kedudukan sejajar berhenti dan kedudukan sejajar berhenti. Titik berhenti adalah harga masuk kalikan dengan perkadaran tertentu, dan titik berhenti adalah harga masuk kalikan dengan perkadaran tertentu.

Analisis kelebihan

Strategi ini mempunyai kelebihan berikut:

  1. Ia juga dapat menangkap perubahan trend dalam masa yang tepat, dengan lebih sedikit traceback.
  2. Meningkatkan kualiti isyarat dengan penapisan isyarat yang salah.
  3. Mekanisme penangguhan kerugian berkesan mengawal kerugian tunggal.
  4. Parameter optimum mempunyai ruang yang besar, boleh disesuaikan dengan keadaan optimum.

Analisis risiko

Strategi ini mempunyai beberapa risiko:

  1. Isyarat yang salah yang dihasilkan dalam keadaan gegaran boleh menyebabkan kerugian.
  2. Penetapan titik henti yang tidak betul boleh menyebabkan kerugian yang tidak perlu.
  3. Parameter yang salah boleh menyebabkan strategi tidak berkesan.

Untuk menghadapi risiko ini, anda boleh mengoptimumkan dan memperbaiki dengan cara mengoptimumkan parameter, menyesuaikan kedudukan hentian dan sebagainya.

Arah pengoptimuman

Strategi ini boleh dioptimumkan dalam beberapa arah:

  1. Menyesuaikan panjang dua garis rata untuk mencari kombinasi parameter terbaik.
  2. Uji pelbagai cara untuk menghentikan kerosakan, seperti Trace Stop, Shake Stop dan sebagainya.
  3. Ujian terhadap parameter MACD untuk mencari parameter optimum.
  4. Menggunakan pembelajaran mesin untuk mengoptimumkan parameter secara automatik.
  5. Menambah isyarat penapis syarat tambahan.

Dengan menguji parameter yang berbeza, menilai kadar pulangan dan kadar Sharpe, anda dapat mencari keadaan strategi yang paling baik.

ringkaskan

Ini adalah strategi kuantitatif yang menggunakan penilaian trend, penapisan julat, pengesahan dua garis rata dan pemikiran berhenti. Ia dapat menentukan arah trend dengan berkesan dan mencari keseimbangan antara pengoptimuman keuntungan dan kawalan risiko. Dengan cara pengoptimuman parameter dan pembelajaran mesin, strategi ini masih mempunyai ruang untuk penambahbaikan yang lebih baik.

Kod sumber strategi
/*backtest
start: 2022-11-20 00:00:00
end: 2023-11-26 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
strategy(title="Range Filter Buy and Sell Strategies", shorttitle="Range Filter Strategies", overlay=true,pyramiding = 5)

// Original Script > @DonovanWall
// Adapted Version > @guikroth
// 
// Updated PineScript to version 5
// Republished by > @tvenn
// Strategizing by > @RonLeigh
//////////////////////////////////////////////////////////////////////////
// Settings for 5min chart, BTCUSDC. For Other coin, change the parameters
//////////////////////////////////////////////////////////////////////////



SS = input.bool(false,"Percentage Take Profit Stop Loss")


longProfitPerc = input.float(title='LongProfit(%)', minval=0.0, step=0.1, defval=1.5) * 0.01

shortProfitPerc = input.float(title='ShortProfit(%)', minval=0.0, step=0.1, defval=1.5) * 0.01


longLossPerc = input.float(title='LongStop(%)', minval=0.0, step=0.1, defval=1.5) * 0.01

shortLossPerc = input.float(title='ShortStop(%)', minval=0.0, step=0.1, defval=1.5) * 0.01


// Color variables
upColor   = color.white
midColor  = #90bff9
downColor = color.blue

// Source
src = input(defval=close, title="Source")

// Sampling Period
// Settings for 5min chart, BTCUSDC. For Other coin, change the paremeters
per = input.int(defval=100, minval=1, title="Sampling Period")

// Range Multiplier
mult = input.float(defval=3.0, minval=0.1, title="Range Multiplier")

// Smooth Average Range
smoothrng(x, t, m) =>
    wper = t * 2 - 1
    avrng = ta.ema(math.abs(x - x[1]), t)
    smoothrng = ta.ema(avrng, wper) * m
    smoothrng
smrng = smoothrng(src, per, mult)

// Range Filter
rngfilt(x, r) =>
    rngfilt = x
    rngfilt := x > nz(rngfilt[1]) ? x - r < nz(rngfilt[1]) ? nz(rngfilt[1]) : x - r : 
       x + r > nz(rngfilt[1]) ? nz(rngfilt[1]) : x + r
    rngfilt
filt = rngfilt(src, smrng)

// Filter Direction
upward = 0.0
upward := filt > filt[1] ? nz(upward[1]) + 1 : filt < filt[1] ? 0 : nz(upward[1])
downward = 0.0
downward := filt < filt[1] ? nz(downward[1]) + 1 : filt > filt[1] ? 0 : nz(downward[1])

// Target Bands
hband = filt + smrng
lband = filt - smrng

// Colors
filtcolor = upward > 0 ? upColor : downward > 0 ? downColor : midColor
barcolor = src > filt and src > src[1] and upward > 0 ? upColor :
   src > filt and src < src[1] and upward > 0 ? upColor : 
   src < filt and src < src[1] and downward > 0 ? downColor : 
   src < filt and src > src[1] and downward > 0 ? downColor : midColor

filtplot = plot(filt, color=filtcolor, linewidth=2, title="Range Filter")

// Target
hbandplot = plot(hband, color=color.new(upColor, 70), title="High Target")
lbandplot = plot(lband, color=color.new(downColor, 70), title="Low Target")

// Fills
fill(hbandplot, filtplot, color=color.new(upColor, 90), title="High Target Range")
fill(lbandplot, filtplot, color=color.new(downColor, 90), title="Low Target Range")

// Bar Color
barcolor(barcolor)

// Break Outs
longCond = bool(na)
shortCond = bool(na)
longCond := src > filt and src > src[1] and upward > 0 or 
   src > filt and src < src[1] and upward > 0
shortCond := src < filt and src < src[1] and downward > 0 or 
   src < filt and src > src[1] and downward > 0

CondIni = 0
CondIni := longCond ? 1 : shortCond ? -1 : CondIni[1]
longCondition = longCond and CondIni[1] == -1
shortCondition = shortCond and CondIni[1] == 1



// alertcondition(longCondition, title="Buy alert on Range Filter", message="Buy alert on Range Filter")
// alertcondition(shortCondition, title="Sell alert on Range Filter", message="Sell alert on Range Filter")
// alertcondition(longCondition or shortCondition, title="Buy and Sell alert on Range Filter", message="Buy and Sell alert on Range Filter")


////////////// 副

sensitivity = input(150, title='Sensitivity')
fastLength = input(20, title='FastEMA Length')
slowLength = input(40, title='SlowEMA Length')
channelLength = input(20, title='BB Channel Length')
multt = input(2.0, title='BB Stdev Multiplier')

DEAD_ZONE = nz(ta.rma(ta.tr(true), 100)) * 3.7

calc_macd(source, fastLength, slowLength) =>
    fastMA = ta.ema(source, fastLength)
    slowMA = ta.ema(source, slowLength)
    fastMA - slowMA

calc_BBUpper(source, length, multt) =>
    basis = ta.sma(source, length)
    dev = multt * ta.stdev(source, length)
    basis + dev

calc_BBLower(source, length, multt) =>
    basis = ta.sma(source, length)
    dev = multt * ta.stdev(source, length)
    basis - dev

t1 = (calc_macd(close, fastLength, slowLength) - calc_macd(close[1], fastLength, slowLength)) * sensitivity

e1 = calc_BBUpper(close, channelLength, multt) - calc_BBLower(close, channelLength, multt)

trendUp = t1 >= 0 ? t1 : 0
trendDown = t1 < 0 ? -1 * t1 : 0

duoad = trendUp > 0 and trendUp > e1

kongad = trendDown > 0 and trendDown > e1



duo =  longCondition and duoad

kong = shortCondition and kongad


//Alerts
plotshape(longCondition  and trendUp > e1 and  trendUp > 0 , title="Buy Signal", text="Buy", textcolor=color.white, style=shape.labelup, size=size.small, location=location.belowbar, color=color.new(#aaaaaa, 20))
plotshape(shortCondition  and trendDown > e1 and  trendDown > 0 , title="Sell Signal", text="Sell", textcolor=color.white, style=shape.labeldown, size=size.small, location=location.abovebar, color=color.new(downColor, 20))




if  longCondition and trendUp > e1 and  trendUp > 0 
    strategy.entry('Long',strategy.long, comment = "buy" )

if  shortCondition and trendDown > e1 and  trendDown > 0 
    strategy.entry('Short',strategy.short, comment = "sell" )




longlimtPrice  = strategy.position_avg_price * (1 + longProfitPerc)
shortlimtPrice = strategy.position_avg_price * (1 - shortProfitPerc)
   
longStopPrice  = strategy.position_avg_price * (1 - longLossPerc)
shortStopPrice = strategy.position_avg_price * (1 + shortLossPerc)



if (strategy.position_size > 0)  and SS == true
    
    strategy.exit(id="Long",comment_profit = "Profit",comment_loss = "StopLoss", stop=longStopPrice,limit = longlimtPrice)
    

if (strategy.position_size < 0)  and SS == true
    
    strategy.exit(id="Short",comment_profit = "Profit",comment_loss = "StopLoss", stop=shortStopPrice,limit = shortlimtPrice)