Strategi Perdagangan Penapis Jadual

Penulis:ChaoZhang, Tarikh: 2023-11-13 10:38:20
Tag:

img

Ringkasan

Strategi Twin Range Filter adalah strategi perdagangan berdasarkan turun naik harga. Ia menggunakan dua penunjuk julat purata dengan tetapan parameter yang berbeza, digabungkan dengan hubungan antara harga dan julat, untuk menjana isyarat perdagangan. Strategi ini sesuai untuk aset digital yang sangat tidak menentu seperti Bitcoin.

Logika Strategi

Strategi ini menggunakan dua penunjuk julat licin dengan panjang tempoh yang berbeza: penunjuk julat cepat (periode lalai 27) dan penunjuk julat perlahan (periode lalai 55).

Strategi Penapis Jangkitan Kembar membandingkan harga dengan kedua-dua penunjuk jangkitan untuk menentukan sama ada ia berada dalam jangkitan goyangan tertentu. Isyarat perdagangan dihasilkan apabila harga memecahkan jangkitan goyangan ini.

Secara khusus, strategi ini menggunakan garis median sebagai penanda aras, yang merupakan purata dua penunjuk julat. Isyarat panjang dihasilkan apabila harga berada di atas garis median dengan satu julat cepat; isyarat pendek dihasilkan apabila harga jatuh di bawah garis median dengan satu julat cepat.

Untuk menapis isyarat palsu, ia juga menambah syarat: isyarat hanya dihasilkan apabila pergerakan harga semasa konsisten dengan tempoh sebelumnya.

Ringkasnya, strategi ini mengenal pasti julat goyangan dengan penunjuk julat kembar, dan menghasilkan pesanan apabila harga memecahkan julat. penapis arah harga ditambah untuk mengurangkan isyarat palsu.

Kelebihan

Kelebihan strategi Penapis Jarak Kembar:

  1. Menggunakan ciri-ciri turun naik harga, dapat disesuaikan dengan aset yang sangat turun naik seperti Bitcoin.

  2. Penunjuk julat kembar mengandungi kerangka masa yang berbeza. yang cepat menangkap peluang jangka pendek, manakala yang lambat mempertimbangkan trend jangka panjang.

  3. Menambah penapis arah harga mengurangkan isyarat palsu dari turun naik jangka pendek.

  4. Logik yang mudah dan jelas, mudah difahami dan dilaksanakan, sesuai untuk perdagangan algo.

Risiko

Beberapa risiko strategi untuk diperhatikan:

  1. Bergantung pada penunjuk turun naik, mungkin kurang berprestasi dalam persekitaran turun naik rendah.

  2. Parameter julat perlu dioptimumkan untuk produk yang berbeza, jika tidak peluang perdagangan mungkin terlepas atau isyarat palsu berlaku.

  3. Perbezaan antara harga dan turun naik tidak dipertimbangkan. Isyarat palsu mungkin berlaku jika turun naik meningkat tanpa kenaikan harga yang sepadan.

  4. Tahap stop loss mungkin perlu diselaraskan dalam persekitaran turun naik yang tinggi.

Peningkatan

Strategi ini boleh ditingkatkan dalam beberapa aspek:

  1. Uji dan optimumkan parameter julat untuk mencari kombinasi optimum untuk produk dan jangka masa yang berbeza.

  2. Tambahkan mekanisme stop loss dinamik berdasarkan turun naik baru-baru ini, untuk mengoptimumkan strategi stop loss.

  3. Tambah penapis berdasarkan perbezaan turun naik harga untuk mengelakkan isyarat palsu.

  4. Menggabungkan penunjuk lain seperti perubahan jumlah untuk meningkatkan kepastian kemasukan.

  5. Uji dan tambahkan mekanisme keluar keuntungan yang sesuai yang sesuai dengan strategi.

Ringkasan

Secara keseluruhan, Penapis Jangkitan Kembar adalah strategi perdagangan yang berkesan untuk aset yang sangat tidak menentu. Ia menggunakan ciri-ciri turun naik harga dengan baik dan menghasilkan logika perdagangan yang mudah dan jelas. Dengan penambahbaikan lanjut seperti pengoptimuman parameter dan pengurusan risiko, ia boleh menjadi komponen yang berharga dalam sistem perdagangan kuant. Ia juga memberikan pandangan tentang perdagangan algoritma berdasarkan ciri-ciri turun naik pasaran.


/*backtest
start: 2023-11-05 00:00:00
end: 2023-11-12 00:00:00
period: 30m
basePeriod: 15m
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/
// © colinmck, greenmask9

//@version=4

strategy(title="Twin Range Filter Algo", overlay=true)

source = input(defval=close, title="Source")

// Smooth Average Range

per1 = input(defval=27, minval=1, title="Fast period")
mult1 = input(defval=1.6, minval=0.1, title="Fast range")

per2 = input(defval=55, minval=1, title="Slow period")
mult2 = input(defval=2, minval=0.1, title="Slow range")

smoothrng(x, t, m) =>
    wper = t * 2 - 1
    avrng = ema(abs(x - x[1]), t)
    smoothrng = ema(avrng, wper) * m
    smoothrng
smrng1 = smoothrng(source, per1, mult1)
smrng2 = smoothrng(source, per2, mult2)
smrng = (smrng1 + smrng2) / 2

// 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(source, smrng)

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])

hband = filt + smrng
lband = filt - smrng

longCond = bool(na)
shortCond = bool(na)
longCond := source > filt and source > source[1] and upward > 0 or source > filt and source < source[1] and upward > 0
shortCond := source < filt and source < source[1] and downward > 0 or source < filt and source > source[1] and downward > 0

CondIni = 0
CondIni := longCond ? 1 : shortCond ? -1 : CondIni[1]

long = longCond and CondIni[1] == -1
short = shortCond and CondIni[1] == 1

// Plotting

// Strategy
// From this part on, programmer is greenmaks9
//
Separator = input(title="Following conditions and backtest algorithm are added by @greenmask9 🎯, original script is written by @colinmck 👍. Read both of their's release notes for more info on how this script works.", type=input.bool, defval=false)
disabler = input(title="Disable greenmask9's ATR conditions", type=input.bool, defval=false)

//second
l2 = input(title="ATR1", defval=32, minval=1)
s2 = input(title="Smoothing", defval="SMA", options=["RMA", "SMA", "EMA", "WMA"])
atr2(source, l2) => 
    if s2 == "SMA"
        sma(source, l2)
    else
        if s2 == "RMA"
            rma(source, l2)
        else
            if s2 == "EMA"
                ema(source, l2)
            else
                wma(source, l2)

//third
l3 = input(title="ATR2", defval=64, minval=1)
s3 = input(title="Smoothing", defval="RMA", options=["RMA", "SMA", "EMA", "WMA"])
atr3(source, l3) => 
    if s3 == "RMA"
        rma(source, l3)
    else
        if s3 == "SMA"
            sma(source, l3)
        else
            if s3 == "EMA"
                ema(source, l3)
            else
                wma(source, l3)

atr20=atr2(tr(true), l2)
atr30=atr3(tr(true), l3)
strategy.initial_capital = 50000
ordersize=floor(strategy.initial_capital/close)
profit = input(title="Ticks profit", type=input.integer, defval=900)
stop = input(title="Ticks stoploss", type=input.integer, defval=300)
maxcandles_till_close = input(title="Time stoploss", type=input.integer, defval=17)


bull = long and (atr20<atr30 or disabler)
bear = short and (atr20<atr30 or disabler)

bullclock = barssince(bull)
bearclock = barssince(bear)

if (bull)
    strategy.entry("Twin Long", strategy.long, ordersize)
    strategy.exit("Exit", from_entry =  "Twin Long", profit = profit, loss = stop)

if (bear)
    strategy.entry("Twin Short", strategy.short, ordersize)
    strategy.exit("Exit", from_entry = "Twin Short", profit = profit, loss = stop)

//time stoploss
strategy.close("Twin Long", when = bullclock == maxcandles_till_close, comment = "Timed out")
strategy.close("Twin Short", when = bearclock == maxcandles_till_close, comment = "Timed out")



Lebih lanjut