Dua arah Price Breakthrough Moving Average Strategi perdagangan waktu

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

img

Gambaran umum

Strategi perdagangan waktu rata-rata bergerak arah dua adalah strategi perdagangan kuantitatif yang menggunakan terobosan harga rata-rata bergerak untuk menentukan sinyal perdagangan.

Logika Strategi

Logika inti dari strategi ini adalah:

  1. Menghitung moving average (EMA) dari periode tertentu (misalnya 200 hari) menggunakan fungsi EMA.

  2. Bandingkan harga penutupan dengan EMA untuk menentukan apakah harga menembus EMA. Secara khusus, ketika harga penutupan berada di atas EMA, harga menembus EMA; ketika harga penutupan berada di bawah EMA, harga menembus EMA.

  3. Tentukan sinyal panjang dan pendek berdasarkan terobosan. Ketika harga pecah melalui EMA, menghasilkan sinyal panjang; ketika harga pecah melalui EMA, menghasilkan sinyal pendek.

  4. Ketika sinyal dipicu, menempatkan order dengan persentase tertentu (misalnya 100%) dan mengatur stop loss dan mengambil harga keuntungan.

  5. Ketika harga stop loss atau take profit disentuh, posisi ditutup.

  6. Ulangi proses ini untuk mendapatkan keuntungan dari waktu harga menembus rata-rata bergerak.

Strategi ini sederhana dan mudah dipahami dan diimplementasikan. Ini bertujuan untuk menangkap momentum jangka pendek dengan sinyal memecahkan rata-rata bergerak. Tetapi juga memiliki risiko ketinggalan dan whipsaw tertentu.

Keuntungan

  • Logika yang sederhana dan jelas, mudah dimengerti dan divalidasi.
  • Kemampuan pelacakan yang mulus menggunakan karakteristik rata-rata bergerak.
  • Frekuensi perdagangan yang tinggi, cocok untuk perdagangan jangka pendek.
  • Tanggapan cepat terhadap perubahan harga, menangkap waktu yang tepat.

Risiko

  • Tingkat tertentu dari keterlambatan, mungkin kehilangan terobosan awal harga.
  • Sering berdagang saat dicambuk berkali-kali.
  • Risiko dihentikan pada pembalikan tajam.

Metode optimasi termasuk penyesuaian parameter, menggunakan indikator yang lebih efektif, mengurangi frekuensi perdagangan dll. Stop adaptif dan kondisi penyaringan juga dapat mengendalikan risiko.

Arahan Optimasi

  • Uji berbagai jenis dan parameter rata-rata bergerak untuk solusi yang lebih baik, misalnya EMA, SMA, LWMA.
  • Tambahkan kondisi penyaringan untuk menghindari perdagangan whipsaw, misalnya volume, Bollinger Bands, ATR dll.
  • Mengoptimalkan dan menguji stop loss dan mengambil strategi keuntungan untuk mengurangi risiko.
  • Menggabungkan tren berikut, rata-rata pembalikan dan strategi lain untuk sistem perdagangan yang kuat.
  • Tambahkan parameter untuk kemampuan beradaptasi yang lebih luas.

Kesimpulan

Strategi ini memiliki logika yang relatif sederhana dari pelacakan rata-rata bergerak untuk menangkap momentum jangka pendek. Keuntungan termasuk responsif dan mudah digunakan; kekurangan termasuk lag dan inersia. Optimasi lebih lanjut dapat dilakukan pada pemilihan indikator, mekanisme stop loss, teknik penyaringan untuk membuat strategi lebih solid 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 banyak