Range Filter Strategi Isyarat Beli Jual

Penulis:ChaoZhang, Tarikh: 2024-03-08 17:06:50
Tag:

img

Ringkasan

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

Logika Strategi

Strategi pertama mengira julat turun naik harga aset dalam tempoh tertentu. khususnya, ia mengira perbezaan antara harga tertinggi dan harga terendah dalam tempoh yang ditentukan untuk menentukan amplitud turun naik harga.

Selepas itu, ia akan menghasilkan isyarat beli dan jual. Walau bagaimanapun, tidak semua isyarat akan mencetuskan kemasukan, tetapi perlu memenuhi syarat penapisan julat turun naik harga. Sebagai contoh, isyarat beli dikeluarkan hanya apabila harga memecahkan julat turun naik.

Dengan cara ini, strategi menapis kebanyakan isyarat palsu dalam persekitaran pasaran turun naik yang rendah, mengelakkan kemasukan yang tidak perlu.

Kelebihan

Kelebihan terbesar strategi ini adalah bahawa ia dapat menyesuaikan kekuatan penapisan isyarat secara dinamik. Dalam turun naik yang rendah, ia hanya memilih isyarat berkualiti tinggi; sementara dalam turun naik yang tinggi, ia dapat merebut lebih banyak peluang yang disediakan oleh pasaran.

Berbanding dengan penapis parameter tetap, strategi ini lebih pintar dan beradaptasi. Tidak kira apa keadaan pasaran, ia memberikan ganjaran risiko yang unggul.

Di samping itu, berbanding dengan satu keadaan operasi, strategi ini menggabungkan penilaian arah trend untuk menyediakan isyarat perdagangan yang lebih boleh dipercayai. Pada masa yang sama, ia juga mempunyai fungsi stop loss dan mengambil keuntungan untuk mengawal risiko perdagangan individu dengan berkesan.

Risiko

Risiko utama strategi ini terletak pada penetapan parameter julat turun naik. Jika julat yang ditetapkan terlalu besar atau terlalu kecil, ia akan menjejaskan kualiti isyarat dan peluang keuntungan.

Di samping itu, strategi ini mempunyai peluang keuntungan yang agak sedikit di pasaran dengan trend berayun jangka pendek yang kuat.

Arahan pengoptimuman

Strategi ini boleh dioptimumkan dalam aspek berikut:

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

  2. Meningkatkan peraturan penapisan berdasarkan trend kitaran besar untuk mengelakkan perangkap penyatuan.

  3. Menggabungkan kitaran strategi yang berbeza untuk membentuk sistem dan meningkatkan kestabilan keseluruhan.

  4. Tambah algoritma pembelajaran mesin untuk meningkatkan kesan tetapan parameter dan peraturan penapisan.

Kesimpulan

Strategi Isyarat Beli Jual Penapis Julat adalah strategi perdagangan kuantitatif yang sangat praktikal dan berkesan. Ia dapat menyesuaikan intensiti penapisan secara dinamik dan memberikan ganjaran risiko yang unggul dalam persekitaran pasaran yang berbeza. Pada masa yang sama, masih ada potensi yang besar dalam mengoptimumkan strategi ini, terutama dalam pengoptimuman parameter dan pengoptimuman peraturan. Secara keseluruhan, strategi ini menyediakan penyelesaian asas yang sangat baik untuk pedagang kuantitatif yang mengejar pulangan berlebihan yang mantap.


/*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')





Lebih lanjut