Strategi penapisan isyarat beli dan jual berdasarkan julat turun naik harga


Tarikh penciptaan: 2024-03-08 17:06:50 Akhirnya diubah suai: 2024-03-08 17:06:50
Salin: 2 Bilangan klik: 1110
1
fokus pada
1617
Pengikut

Strategi penapisan isyarat beli dan jual berdasarkan julat turun naik harga

Gambaran keseluruhan

Strategi penapisan isyarat beli dan jual berdasarkan rentang pergerakan harga (Range Filter Buy Sell Signals Strategy) adalah strategi perdagangan kuantitatif yang sangat praktikal. Ia menggunakan rentang pergerakan harga untuk menapis isyarat beli dan jual, mengurangkan isyarat palsu di pasaran turun naik rendah dan meningkatkan kualiti isyarat di pasaran turun naik tinggi.

Prinsip Strategi

Strategi ini mula-mula mengira julat turun naik harga aset dalam tempoh tertentu. Khususnya, ia mengira perbezaan antara harga tertinggi dan terendah dalam tempoh tertentu untuk menentukan besarnya turun naik harga.

Kemudian, ia akan menghasilkan isyarat beli dan jual. Namun, tidak semua isyarat akan mencetuskan masuk, tetapi perlu memenuhi syarat penapisan julat turun naik harga. Sebagai contoh, isyarat beli hanya akan dikeluarkan apabila harga menembusi julat turun naik.

Dengan cara ini, strategi ini dapat menyaring kebanyakan isyarat palsu dalam keadaan pasaran yang tidak menentu dan mengelakkan masuk yang tidak perlu. Dalam keadaan yang tidak menentu, ia dapat menangkap pergerakan arah yang lebih besar dan mendapat keuntungan daripadanya.

Kelebihan Strategik

Kelebihan utama strategi ini adalah bahawa ia dapat menyesuaikan intensiti penapisan pada isyarat secara dinamik. Pada turun naik yang rendah, ia hanya memilih isyarat berkualiti tinggi; dan pada turun naik yang tinggi, ia dapat memanfaatkan lebih banyak peluang yang ditawarkan oleh pasaran.

Strategi ini lebih pintar dan beradaptasi berbanding penapis parameter tetap. Ia menawarkan pulangan risiko yang lebih baik, tidak kira apa keadaan pasaran.

Di samping itu, strategi ini menggabungkan penilaian arah trend untuk memberikan isyarat perdagangan yang lebih dipercayai berbanding dengan syarat operasi tunggal. Pada masa yang sama, ia juga mempunyai fungsi penghentian kerugian untuk mengawal risiko perdagangan individu dengan berkesan.

Risiko Strategik

Risiko utama dalam strategi ini adalah dengan menetapkan parameter julat turun naik. Jika julat yang ditetapkan terlalu besar atau terlalu kecil, ia akan memberi kesan buruk kepada kualiti isyarat dan peluang keuntungan.

Di samping itu, peluang keuntungan strategi ini akan menjadi lebih kecil dalam pasaran yang mempunyai kecenderungan turun naik harga dalam jangka pendek. Menggunakan kombinasi sistem kitaran yang berbeza dapat membantu mengurangkan masalah ini.

Arah pengoptimuman strategi

Strategi ini boleh dioptimumkan dengan:

  1. Menggunakan algoritma parameter adaptif untuk mengoptimumkan parameter julat turun naik secara automatik, menjadikannya lebih pintar dan dinamik.

  2. Menambah peraturan penapisan berdasarkan trend kitaran besar untuk mengelakkan terjerat dalam pasaran goyah.

  3. Strategi ini digabungkan dengan kitaran yang berbeza, membentuk sistem dan meningkatkan kestabilan keseluruhan.

  4. Menambah algoritma pembelajaran mesin untuk meningkatkan parameter dan peraturan penapisan.

ringkaskan

Strategi penapisan isyarat beli dan jual berdasarkan rentang turun naik harga adalah strategi perdagangan kuantitatif yang sangat praktikal dan berkesan. Ia dapat menyesuaikan intensiti penapisan secara dinamik dan memberikan pulangan risiko yang baik dalam keadaan pasaran yang berbeza.

Kod sumber strategi
/*backtest
start: 2023-03-02 00:00:00
end: 2024-03-07 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/

// Credits to the original Script - Range Filter DonovanWall https://www.tradingview.com/script/lut7sBgG-Range-Filter-DW/
// This version is the old version of the Range Filter with less settings to tinker with

//@version=5
strategy(title='Range Filter - B&S Signals', shorttitle='[Doan]_RF-B&S Signals', overlay=true)

//-----------------------------------------------------------------------------------------------------------------------------------------------------------------
//Functions
//-----------------------------------------------------------------------------------------------------------------------------------------------------------------
longLossPerc = input.float(title='Long Stop Loss (%)', minval=0.0, step=0.1, defval=1) * 0.01
shortLossPerc = input.float(title='Short Stop Loss (%)', minval=0.0, step=0.1, defval=1) * 0.01

longTakePerc = input.float(title='Long Take(%)', minval=0.0, step=0.1, defval=1) * 0.01
shortTakePerc = input.float(title='Short Take (%)', minval=0.0, step=0.1, defval=1) * 0.01

emaLength = input.int(200, title="EMA Length")

// Determine stop loss price

//Range Size Function
rng_size(x, qty, n) =>
    wper = n * 2 - 1
    avrng = ta.ema(math.abs(x - x[1]), n)
    AC = ta.ema(avrng, wper) * qty
    rng_size = AC

//Range Filter Function
rng_filt(x, rng_, n) =>
    r = rng_
    var rfilt = array.new_float(2, x)
    array.set(rfilt, 1, array.get(rfilt, 0))
    if x - r > array.get(rfilt, 1)
        array.set(rfilt, 0, x - r)
    if x + r < array.get(rfilt, 1)
        array.set(rfilt, 0, x + r)
    rng_filt1 = array.get(rfilt, 0)

    hi_band = rng_filt1 + r
    lo_band = rng_filt1 - r
    rng_filt = rng_filt1
    [hi_band, lo_band, rng_filt]

//-----------------------------------------------------------------------------------------------------------------------------------------------------------------
//Inputs
//-----------------------------------------------------------------------------------------------------------------------------------------------------------------

//Range Source
rng_src = input(defval=close, title='Swing Source')

//Range Period
rng_per = input.int(defval=20, minval=1, title='Swing Period')

//Range Size Inputs
rng_qty = input.float(defval=3.5, minval=0.0000001, title='Swing Multiplier')

//Bar Colors
use_barcolor = input(defval=false, title='Bar Colors On/Off')

//-----------------------------------------------------------------------------------------------------------------------------------------------------------------
//Definitions
//-----------------------------------------------------------------------------------------------------------------------------------------------------------------

//Range Filter Values
[h_band, l_band, filt] = rng_filt(rng_src, rng_size(rng_src, rng_qty, rng_per), rng_per)

//Direction Conditions
var fdir = 0.0
fdir := filt > filt[1] ? 1 : filt < filt[1] ? -1 : fdir
upward = fdir == 1 ? 1 : 0
downward = fdir == -1 ? 1 : 0

//Trading Condition
longCond = rng_src > filt and rng_src > rng_src[1] and upward > 0 or rng_src > filt and rng_src < rng_src[1] and upward > 0
shortCond = rng_src < filt and rng_src < rng_src[1] and downward > 0 or rng_src < filt and rng_src > rng_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

//Colors
filt_color = upward ? #05ff9b : downward ? #ff0583 : #cccccc
bar_color = upward and rng_src > filt ? rng_src > rng_src[1] ? #05ff9b : #00b36b : downward and rng_src < filt ? rng_src < rng_src[1] ? #ff0583 : #b8005d : #cccccc


ema = ta.ema(close, emaLength)

//-----------------------------------------------------------------------------------------------------------------------------------------------------------------
//Outputs
//-----------------------------------------------------------------------------------------------------------------------------------------------------------------
longStopPrice = strategy.position_avg_price * (1 - longLossPerc)
shortStopPrice = strategy.position_avg_price * (1 + shortLossPerc)

longTakePrice = strategy.position_avg_price * (1 + longTakePerc)
shortTakePrice = strategy.position_avg_price * (1 - shortTakePerc)

//Filter Plot
filt_plot = plot(filt, color=filt_color, linewidth=3, title='Filter', transp=67)

//Band Plots
h_band_plot = plot(h_band, color=color.new(#05ff9b, 100), title='High Band')
l_band_plot = plot(l_band, color=color.new(#ff0583, 100), title='Low Band')

//Band Fills
fill(h_band_plot, filt_plot, color=color.new(#00b36b, 92), title='High Band Fill')
fill(l_band_plot, filt_plot, color=color.new(#b8005d, 92), title='Low Band Fill')

//Bar Color
barcolor(use_barcolor ? bar_color : na)
// Entry
strategy.entry("Long", strategy.long, when=longCondition)
strategy.entry("Short", strategy.short, when=shortCondition)

plot(ema)

//Plot Buy and Sell Labels
plotshape(longCondition, title='Buy Signal', text='BUY', textcolor=color.white, style=shape.labelup, size=size.normal, location=location.belowbar, color=color.new(color.green, 0))
plotshape(shortCondition, title='Sell Signal', text='SELL', textcolor=color.white, style=shape.labeldown, size=size.normal, location=location.abovebar, color=color.new(color.red, 0))

//Alerts
alertcondition(longCondition, title='Buy Alert', message='BUY')
alertcondition(shortCondition, title='Sell Alert', message='SELL')