Strategi dagangan apabila harga menembusi purata pergerakan


Tarikh penciptaan: 2023-12-15 16:28:12 Akhirnya diubah suai: 2023-12-15 16:28:12
Salin: 0 Bilangan klik: 575
1
fokus pada
1621
Pengikut

Strategi dagangan apabila harga menembusi purata pergerakan

Gambaran keseluruhan

Strategi Dagangan Bergerak Rata-rata Penembusan Harga Dua Arahan (bahasa Inggeris: Dual Direction Price Breakthrough Moving Average Timing Trading Strategy) adalah strategi dagangan kuantitatif yang menggunakan penembusan harga untuk menentukan masa untuk membeli atau menjual. Strategi ini menggunakan perbandingan harga dengan purata bergerak untuk tempoh yang ditetapkan, menghasilkan perdagangan berdasarkan harga yang melintasi atau melintasi garis purata.

Prinsip Strategi

Logik utama strategi ini ialah:

  1. Menggunakan fungsi EMA untuk mengira purata bergerak untuk tempoh yang ditetapkan (seperti 200 hari).

  2. Bandingkan harga penutupan dengan saiz EMA untuk menentukan sama ada harga menembusi EMA. Secara khusus, apabila harga penutupan lebih besar daripada EMA pada hari itu, harga dianggap lebih tinggi daripada EMA; apabila harga penutupan lebih rendah daripada EMA pada hari itu, harga dianggap lebih rendah daripada EMA.

  3. Apabila harga di atas EMA, ia menghasilkan isyarat beli; apabila harga di bawah EMA, ia menghasilkan isyarat jual.

  4. Apabila isyarat dihasilkan, pesanan dibuat mengikut perkadaran tertentu (seperti stok penuh) dan kemudian menetapkan harga hentian dan hentian.

  5. Apabila harga mencapai harga stop loss atau stop loss, tutup kedudukan tersebut.

  6. Ini adalah kitaran, memanfaatkan peluang harga untuk menembusi garis rata-rata.

Strategi ini mudah, mudah difahami dan dilaksanakan. Kesesuaian masa yang lebih baik diperoleh dengan menangkap isyarat terobosan pada garis pendek.

Kelebihan Strategik

  • Logik strategi mudah difahami dan divalidasi.
  • Dengan ciri garis purata, ia mempunyai keupayaan untuk mengesan trend.
  • Banyak transaksi, sesuai untuk operasi garis pendek.
  • Ia boleh bertindak balas dengan cepat terhadap perubahan harga dan menangkap peluang yang lebih baik.

Risiko Strategik

  • Terdapat sedikit ketinggalan dan mungkin terlepas daripada harga yang mula-mula terjatuh.
  • Dalam beberapa kes, ia boleh menyebabkan masalah perdagangan yang kerap.
  • Jika ia berbalik besar, ia boleh disekat.

Anda boleh mengoptimumkan dengan menyesuaikan parameter, seperti menyesuaikan parameter garis rata-rata, menggunakan penghakiman penunjuk yang lebih cekap, mengurangkan frekuensi perdagangan, dan sebagainya. Anda juga boleh menetapkan stop loss adaptif atau memperkenalkan syarat penapisan untuk mengawal risiko.

Arah pengoptimuman strategi

  • Mencuba pelbagai jenis dan parameter rata-rata untuk mencari penyelesaian yang lebih baik. Seperti EMA, SMA, LWMA dan sebagainya.
  • Menambah syarat penapisan untuk mengelakkan beberapa transaksi gegaran. Penghakiman tambahan seperti pengenalan kuantiti transaksi, garis Brin, ATR dan sebagainya.
  • Mengoptimumkan dan menguji strategi penangguhan kerugian untuk mengurangkan risiko.
  • Menggabungkan pelbagai strategi seperti trend dan reversal untuk membina sistem perdagangan yang komprehensif.
  • Menambah konfigurasi parameter untuk menjadikan strategi lebih universal.

ringkaskan

Strategi ini secara keseluruhannya agak mudah dan intuitif, idea utamanya adalah untuk mengikuti garis rata untuk menangkap harga dalam jangka pendek. Kelebihannya adalah tindak balas yang cepat dan mudah dilaksanakan; Kelemahannya adalah keterbelakangan dan kelewatan.

Kod sumber strategi
/*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)