Strategi penyaringan sinyal beli dan jual berdasarkan rentang fluktuasi harga


Tanggal Pembuatan: 2024-03-08 17:06:50 Akhirnya memodifikasi: 2024-03-08 17:06:50
menyalin: 2 Jumlah klik: 1110
1
fokus pada
1617
Pengikut

Strategi penyaringan sinyal beli dan jual berdasarkan rentang fluktuasi harga

Ringkasan

Strategi Filter Buy Sell Signals Strategy adalah strategi perdagangan kuantitatif yang sangat praktis. Ini menggunakan rentang fluktuasi harga untuk memfilter sinyal beli dan jual, mengurangi sinyal palsu di pasar fluktuasi rendah, dan meningkatkan kualitas sinyal di pasar fluktuasi tinggi.

Prinsip Strategi

Strategi ini pertama-tama menghitung kisaran fluktuasi harga aset dalam periode tertentu. Secara khusus, strategi ini menghitung perbedaan antara harga tertinggi dan terendah dalam periode tertentu untuk menentukan besarnya fluktuasi harga.

Setelah itu, ia akan menghasilkan sinyal beli dan jual. Namun, tidak semua sinyal akan memicu masuk, tetapi perlu memenuhi kondisi penyaringan rentang fluktuasi harga. Misalnya, sinyal beli akan dikeluarkan hanya jika harga menembus rentang fluktuasi.

Dengan cara ini, strategi ini dapat menyaring sebagian besar sinyal palsu dan menghindari masuk yang tidak perlu dalam lingkungan pasar yang bergejolak rendah. Dan dalam situasi yang bergejolak tinggi, strategi ini dapat menangkap dan mengambil keuntungan dari pergerakan ke arah yang lebih besar.

Keunggulan Strategis

Keuntungan terbesar dari strategi ini adalah kemampuan untuk menyesuaikan intensitas penyaringan sinyal secara dinamis. Pada saat turun naik rendah, ia hanya memilih sinyal berkualitas tinggi; dan pada saat turun naik tinggi, ia dapat mengambil lebih banyak peluang yang ditawarkan pasar.

Strategi ini lebih cerdas dan adaptif dibandingkan filter dengan parameter tetap. Strategi ini memberikan pengembalian risiko yang lebih baik, terlepas dari kondisi pasar.

Selain itu, strategi ini menggabungkan penilaian arah tren untuk memberikan sinyal perdagangan yang lebih andal dibandingkan dengan kondisi operasi tunggal. Pada saat yang sama, strategi ini juga memiliki fungsi stop loss yang dapat mengontrol risiko perdagangan individu secara efektif.

Risiko Strategis

Risiko utama dari strategi ini terletak pada pengaturan parameter jangkauan fluktuasi. Jika terlalu besar atau terlalu kecil, itu akan berdampak buruk pada kualitas sinyal dan peluang untuk mendapatkan keuntungan.

Selain itu, di pasar yang cenderung bergejolak dalam jangka pendek, peluang keuntungan dari strategi ini relatif kecil. Menggunakan kombinasi dari sistem siklus yang berbeda dapat membantu mengurangi masalah ini.

Arah optimasi strategi

Strategi ini dapat dioptimalkan dengan cara:

  1. Menggunakan algoritma parameter adaptif untuk mengoptimalkan parameter rentang fluktuasi secara otomatis, membuatnya lebih cerdas dan dinamis.

  2. Menambahkan aturan penyaringan berdasarkan tren siklus besar untuk menghindari terjebak di pasar yang bergolak.

  3. Strategi ini, yang menggabungkan berbagai siklus, membentuk sistem dan meningkatkan stabilitas secara keseluruhan.

  4. Menambahkan algoritma pembelajaran mesin untuk meningkatkan pengaturan parameter dan aturan penyaringan.

Meringkaskan

Strategi penyaringan sinyal beli dan jual berdasarkan rentang fluktuasi harga adalah strategi perdagangan kuantitatif yang sangat praktis dan efektif. Ini dapat secara dinamis menyesuaikan intensitas penyaringan dan memberikan pengembalian risiko yang optimal dalam berbagai lingkungan pasar. Pada saat yang sama, strategi ini memiliki banyak ruang untuk pengoptimalan, terutama dalam pengoptimalan parameter dan pengoptimalan aturan.

Kode 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')