Strategi Crossover Purata Bergerak Pengesanan Trend

Penulis:ChaoZhang, Tarikh: 2024-01-29 16:52:46
Tag:

img

Ringkasan

Ini adalah strategi asas purata bergerak yang mudah yang berfungsi dengan baik dengan pasangan syiling yang berbeza. Ia merangka harga pembukaan purata bergerak dan harga penutupan, dan memutuskan untuk memasuki kedudukan panjang atau keluar berdasarkan sama ada kedua-dua garis telah melintasi satu sama lain.

Logika Strategi

Strategi ini mula-mula memilih jenis purata bergerak, termasuk EMA, SMA, RMA, WMA dan VWMA. Kemudian ia menetapkan tempoh lookback untuk purata bergerak, biasanya antara 10 dan 250 bar.

Logik perdagangan khusus adalah:

  1. Mengira purata bergerak harga terbuka dan harga penutupan;
  2. Bandingkan nilai purata bergerak antara harga penutupan dan harga terbuka;
  3. Masukkan kedudukan panjang jika purata bergerak harga ditutup melintasi di atas purata bergerak harga terbuka;
  4. Tutup kedudukan panjang jika purata bergerak harga ditutup melintasi di bawah purata bergerak harga terbuka.

Memasuki kedudukan menganggapnya sebagai tanda pergerakan harga ke atas, sementara keluar menganggap pergerakan harga ke bawah.

Analisis Kelebihan

Kelebihan utama strategi ini ialah:

  1. Tetapan parameter yang fleksibel yang boleh dioptimumkan untuk pasangan syiling yang berbeza untuk spesifisiti yang lebih baik;
  2. Logik yang mudah difahami dan dilaksanakan;
  3. Pengembalian yang sangat tinggi dapat dicapai untuk beberapa pasangan mata wang, secara amnya kestabilan yang baik;
  4. Keupayaan yang tinggi dalam memaparkan penunjuk yang berbeza.

Analisis Risiko

Terdapat juga beberapa risiko dengan strategi ini:

  1. Untuk beberapa pasangan dan parameter duit syiling, pulangan dan kestabilan boleh rendah;
  2. Tidak dapat bertindak balas dengan baik terhadap turun naik harga jangka pendek, prestasi yang lemah untuk syiling yang sangat tidak menentu;
  3. Pemilihan purata bergerak tempoh tidak cukup saintifik, agak subjektif.

Penyelesaian dan pengoptimuman:

  1. Menggunakan jangka masa yang lebih lama seperti 12H, 1D untuk mengurangkan perdagangan yang tidak perlu dan meningkatkan kestabilan;
  2. Tambah fungsi pengoptimuman parameter untuk menguji secara automatik kombinasi parameter yang berbeza untuk parameter terbaik;
  3. Tambah pilihan adaptif tempoh carian purata bergerak untuk membiarkan sistem secara automatik memutuskan tempoh optimum.

Kesimpulan

Ringkasnya, ini adalah strategi mudah menggunakan penunjuk purata bergerak untuk menentukan trend harga dan titik belokan. Ia boleh mencapai hasil yang sangat baik dengan menyesuaikan parameter, dan merupakan strategi penjejakan trend yang berkesan yang bernilai peningkatan dan penerapan lanjut. Tetapi pengurusan risiko harus diperhatikan, pilih pasangan dan parameter syiling yang sesuai untuk memaksimumkan kegunaannya.


/*backtest
start: 2023-12-01 00:00:00
end: 2023-12-31 23:59:59
period: 2h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
//Author @divonn1994

initial_balance = 100
strategy(title='Close v Open Moving Averages Strategy', shorttitle = 'Close v Open', overlay=true, pyramiding=0, default_qty_value=100, default_qty_type=strategy.percent_of_equity, precision=7, currency=currency.USD, commission_value=0.1, commission_type=strategy.commission.percent, initial_capital=initial_balance)

//Input for number of bars for moving average, Switch to choose moving average type, Display Options and Time Frame of trading----------------------------------------------------------------

bars = input.int(66, "Moving average length (number of bars)", minval=1, group='Strategy') //66 bars and VWMA for BTCUSD on 12 Hours.. 35 bars and VWMA for BTCUSD on 1 Day
strategy = input.string("VWMA", "Moving Average type", options = ["EMA", "SMA", "RMA", "WMA", "VWMA"], group='Strategy')

redOn = input.string("On", "Red Background Color On/Off", options = ["On", "Off"], group='Display')
greenOn = input.string("On", "Green Background Color On/Off", options = ["On", "Off"], group='Display')
maOn = input.string("On", "Moving Average Plot On/Off", options = ["On", "Off"], group='Display')

startMonth = input.int(title='Start Month 1-12 (set any start time to 0 for furthest date)', defval=1, minval=0, maxval=12, group='Beginning of Strategy')
startDate = input.int(title='Start Date 1-31 (set any start time to 0 for furthest date)', defval=1, minval=0, maxval=31, group='Beginning of Strategy')
startYear = input.int(title='Start Year 2000-2100 (set any start time to 0 for furthest date)', defval=2011, minval=2000, maxval=2100, group='Beginning of Strategy')

endMonth = input.int(title='End Month 1-12 (set any end time to 0 for today\'s date)', defval=0, minval=0, maxval=12, group='End of Strategy')
endDate = input.int(title='End Date 1-31 (set any end time to 0 for today\'s date)', defval=0, minval=0, maxval=31, group='End of Strategy')
endYear = input.int(title='End Year 2000-2100 (set any end time to 0 for today\'s date)', defval=0, minval=0, maxval=2100, group='End of Strategy')

//Strategy Calculations-----------------------------------------------------------------------------------------------------------------------------------------------------------------------

inDateRange = true

maMomentum = switch strategy
    "EMA" => (ta.ema(close, bars) > ta.ema(open, bars)) ? 1 : -1
    "SMA" => (ta.sma(close, bars) > ta.sma(open, bars)) ? 1 : -1
    "RMA" => (ta.rma(close, bars) > ta.rma(open, bars)) ? 1 : -1
    "WMA" => (ta.wma(close, bars) > ta.wma(open, bars)) ? 1 : -1
    "VWMA" => (ta.vwma(close, bars) > ta.vwma(open, bars)) ? 1 : -1
    =>
        runtime.error("No matching MA type found.")
        float(na)

openMA = switch strategy
    "EMA" => ta.ema(open, bars)
    "SMA" => ta.sma(open, bars)
    "RMA" => ta.rma(open, bars)
    "WMA" => ta.wma(open, bars)
    "VWMA" => ta.vwma(open, bars)
    =>
        runtime.error("No matching MA type found.")
        float(na)
        
closeMA = switch strategy
    "EMA" => ta.ema(close, bars)
    "SMA" => ta.sma(close, bars)
    "RMA" => ta.rma(close, bars)
    "WMA" => ta.wma(close, bars)
    "VWMA" => ta.vwma(close, bars)
    =>
        runtime.error("No matching MA type found.")
        float(na)

//Enter or Exit Positions--------------------------------------------------------------------------------------------------------------------------------------------------------------------

if ta.crossover(maMomentum, 0)
    if inDateRange
        strategy.entry('long', strategy.long, comment='long')
if ta.crossunder(maMomentum, 0)
    if inDateRange
        strategy.close('long')

//Plot Strategy Behavior---------------------------------------------------------------------------------------------------------------------------------------------------------------------

plot(series = maOn == "On" ? openMA : na, title = "Open moving Average", color = color.new(color.purple,0), linewidth=3, offset=1)
plot(series = maOn == "On" ? closeMA : na, title = "Close Moving Average", color = color.new(color.white,0), linewidth=2, offset=1)
bgcolor(color = inDateRange and (greenOn == "On") and maMomentum > 0 ? color.new(color.green,75) : inDateRange and (redOn == "On") and maMomentum <= 0 ? color.new(color.red,75) : na, offset=1)

Lebih lanjut