Strategi Dagangan Waktu Purata Bergerak Penembusan Harga Dua Arah

Penulis:ChaoZhang, Tarikh: 2023-12-15 16:28:12
Tag:

img

Ringkasan

Strategi Dagangan Rata-Rata Bergerak Penembusan Harga Arahan Dua adalah strategi perdagangan kuantitatif yang menggunakan penembusan harga purata bergerak untuk menentukan isyarat perdagangan. Ia membandingkan harga dengan purata bergerak tempoh tertentu dan menghasilkan isyarat perdagangan apabila harga memecahkan purata bergerak.

Logika Strategi

Logik teras strategi ini ialah:

  1. Mengira purata bergerak (EMA) bagi tempoh tertentu (contohnya 200 hari) menggunakan fungsi EMA.

  2. Bandingkan harga penutupan dengan EMA untuk menentukan sama ada harga memecahkan EMA. Khususnya, apabila harga penutupan di atas EMA, harga pecah melalui EMA; apabila harga penutupan di bawah EMA, harga pecah melalui EMA.

  3. Tentukan isyarat panjang dan pendek berdasarkan terobosan. Apabila harga pecah melalui EMA, menjana isyarat panjang; apabila harga pecah melalui EMA, menjana isyarat pendek.

  4. Apabila isyarat dicetuskan, letakkan pesanan dengan peratusan tertentu (contohnya 100%) dan tetapkan harga stop loss dan mengambil keuntungan.

  5. Apabila harga stop loss atau mengambil keuntungan disentuh, kedudukan ditutup.

  6. Ulangi proses ini untuk mendapat keuntungan daripada masa harga memecahkan purata bergerak.

Strategi ini adalah mudah dan mudah difahami dan dilaksanakan. Ia bertujuan untuk menangkap momentum jangka pendek dengan isyarat memecahkan purata bergerak. Tetapi ia juga mempunyai risiko ketinggalan dan whipsaw tertentu.

Kelebihan

  • Logik yang mudah dan jelas, mudah difahami dan disahkan.
  • Keupayaan pengesanan yang lancar menggunakan ciri-ciri purata bergerak.
  • Frekuensi perdagangan yang tinggi, sesuai untuk perdagangan jangka pendek.
  • Cepat bertindak balas terhadap perubahan harga, menangkap masa yang tepat.

Risiko

  • Tingkat ketinggalan tertentu, mungkin terlepas kejayaan awal harga.
  • Perdagangan yang kerap apabila dicubit beberapa kali.
  • Risiko untuk dihentikan pada pembalikan tajam.

Kaedah pengoptimuman termasuk penyesuaian parameter, menggunakan penunjuk yang lebih berkesan, mengurangkan kekerapan perdagangan dan lain-lain. Hentian penyesuaian dan keadaan penapisan juga dapat mengawal risiko.

Arahan pengoptimuman

  • Uji pelbagai jenis dan parameter purata bergerak untuk penyelesaian yang lebih baik, contohnya EMA, SMA, LWMA.
  • Tambah syarat penapisan untuk mengelakkan perdagangan whipsaw, contohnya jumlah, Bollinger Bands, ATR dan lain-lain.
  • Mengoptimumkan dan menguji stop loss dan mengambil strategi keuntungan untuk mengurangkan risiko.
  • Gabungkan trend berikut, membalikkan purata dan strategi lain untuk sistem perdagangan yang kukuh.
  • Tambah parameter untuk fleksibiliti yang lebih luas.

Kesimpulan

Strategi ini mempunyai logik yang agak mudah untuk mengesan purata bergerak untuk menangkap momentum jangka pendek. Kelebihan termasuk tindak balas dan kemudahan penggunaan; kelemahan termasuk kelewatan dan kelemahannya. Pengoptimuman lanjut boleh dilakukan pada pemilihan penunjuk, mekanisme hentian kerugian, teknik penapisan untuk menjadikan strategi lebih kukuh dan komprehensif.


/*backtest
start: 2022-12-08 00:00:00
end: 2023-12-14 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='RF - B&S Signals', initial_capital=1000, currency=currency.GBP, default_qty_value=100, default_qty_type=strategy.percent_of_equity, commission_type=strategy.commission.percent, commission_value=0.075, overlay=true)


i_startTime = input(defval=timestamp('01 Jan 2020 12:00 +0000'), title='Backtest Start')
i_endTime = input(defval=timestamp('01 Jan 2024 12:00 +0000'), title='Backtest End')

inDateRange     = 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) =>
//    AC       = Cond_EMA(abs(x - x[1]), 1, n)
    wper = n * 2 - 1
    avrng = ta.ema(math.abs(x - x[1]), n)
    AC = ta.ema(avrng, wper) * qty
    rng_size = AC
    rng_size

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

if  inDateRange and close>ema
    strategy.entry("Long", strategy.long, when=longCondition)
    
if   inDateRange and close<ema
    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')

if strategy.position_size > 0
    strategy.exit(id='Long', stop=longStopPrice, limit=longTakePrice)

if strategy.position_size < 0
    strategy.exit(id='Short', stop=shortStopPrice, limit=shortTakePrice)




Lebih lanjut