Strategi crossover harga penutupan bulanan dan purata bergerak

Penulis:ChaoZhang, Tarikh: 2023-11-23 17:09:01
Tag:

img

Ringkasan

Strategi ini menghasilkan isyarat perdagangan berdasarkan persilangan antara harga penutupan bulanan dan garis purata bergerak. Ia menjadi panjang apabila harga penutupan bulanan melintasi di atas purata bergerak, dan rata apabila harga penutupan bulanan melintasi di bawah purata bergerak.

Logika Strategi

Logik teras strategi ini ialah:

  1. Ambil parameter purata bergerak sebagai input. Pilih antara SMA dan EMA.
  2. Pilihan untuk memaparkan garis purata bergerak.
  3. Pilihan untuk menggunakan harga penutupan lain sebagai sumber isyarat.
  4. Menentukan isyarat dagangan berdasarkan hubungan antara harga penutupan bulanan dan purata bergerak:
    • Penembusan harga dekat di atas MA - Long
    • Penutupan harga di bawah MA - Tutup kedudukan panjang

Strategi ini menggunakan keupayaan kelancaran purata bergerak untuk menapis bunyi harga dan menangkap pembalikan trend jangka menengah.

Kelebihan

Kelebihan utama strategi ini ialah:

  1. Menggunakan data bulanan untuk menapis bunyi intraday dengan berkesan dan menangkap trend jangka menengah dan panjang
  2. Tempoh MA yang boleh disesuaikan untuk pengoptimuman merentasi penanda yang berbeza
  3. Pilihan untuk menggunakan ticker lain sebagai sumber isyarat meningkatkan kestabilan
  4. Mengimplementasikan teknik anti-mencat semula yang maju
  5. Jangka masa backtesting yang fleksibel untuk memudahkan ujian

Ringkasnya, ini adalah kerangka strategi yang mudah namun praktikal yang boleh disesuaikan dengan kebanyakan saham melalui penyesuaian parameter, terutama sesuai untuk pelabur jangka menengah dan panjang.

Risiko

Terdapat juga beberapa risiko yang perlu diperhatikan:

  1. Kemas kini data bulanan perlahan, tidak dapat mencerminkan perubahan harga dalam masa nyata
  2. Terlambat dan boleh terlepas peluang jangka pendek
  3. MAs mempunyai kelewatan yang melekat, masa isyarat tidak dapat diramalkan
  4. Pemilihan parameter yang kurang optimum membawa kepada terlalu konservatif atau peluang yang hilang

Cara yang dicadangkan untuk mengurangkan risiko:

  1. Memasukkan penunjuk teknikal jangka masa yang lebih cepat untuk penilaian tambahan
  2. Mengoptimumkan tempoh MA untuk mencari parameter terbaik
  3. Gunakan penanda aras yang lebih stabil sebagai sumber isyarat
  4. Sesuaikan saiz kedudukan untuk mengehadkan kerugian

Peluang Peningkatan

Strategi ini mempunyai potensi yang besar untuk meningkatkan:

  1. Menggabungkan stop loss untuk mengunci keuntungan dan mengawal risiko
  2. Tambah penunjuk pelengkap seperti KD, MACD untuk meningkatkan ketepatan isyarat
  3. Menggunakan teknik pembelajaran mesin untuk mengoptimumkan parameter MA secara dinamik
  4. Memperkenalkan saiz kedudukan yang sejajar dengan trend
  5. Membina keupayaan beralih panjang / pendek berdasarkan keadaan pasaran
  6. Gabungkan dengan harga jangka masa yang lebih cepat untuk tindak balas yang lebih cepat

Kesimpulan

Strategi penutupan bulanan dan strategi persilangan MA mempunyai logika yang mudah dan mudah dan boleh disesuaikan dengan pelbagai ticker melalui penyesuaian parameter. Ia sangat sesuai untuk pelabur jangka menengah dan panjang. Dengan peningkatan berterusan kehilangan berhenti, pengoptimuman parameter dan modul lain, strategi ini menunjukkan janji yang besar.


/*backtest
start: 2022-11-16 00:00:00
end: 2023-11-22 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/
// © universique

//@version=4
strategy("Monthly MA Close ", shorttitle="MMAC", overlay=true, default_qty_type =  strategy.percent_of_equity, default_qty_value = 100)
//MAY 6 2020 18:00

// No repaint function 
// Function to securely and simply call `security()` so that it never repaints and never looks ahead.
f_secureSecurity(_symbol, _res, _src) => security(_symbol, _res, _src[1], lookahead = barmerge.lookahead_on)
//sec10 = f_secureSecurity(syminfo.tickerid, higherTf, data)

// ————— Converts current chart resolution into a float minutes value.
f_resInMinutes() => 
    _resInMinutes = timeframe.multiplier * (
      timeframe.isseconds ? 1. / 60             :
      timeframe.isminutes ? 1.                  :
      timeframe.isdaily   ? 60. * 24            :
      timeframe.isweekly  ? 60. * 24 * 7        :
      timeframe.ismonthly ? 60. * 24 * 30.4375  : na)
// ————— Returns the float minutes value of the string _res.
f_tfResInMinutes(_res) =>
    // _res: resolution of any TF (in "timeframe.period" string format).
    // Dependency: f_resInMinutes().
    security(syminfo.tickerid, _res, f_resInMinutes())

// —————————— Determine if current timeframe is smaller that higher timeframe selected in Inputs.
// Get higher timeframe in minutes.
//higherTfInMinutes = f_tfResInMinutes(higherTf)
// Get current timeframe in minutes.
currentTfInMinutes = f_resInMinutes()
// Compare current TF to higher TF to make sure it is smaller, otherwise our plots don't make sense.
//chartOnLowerTf = currentTfInMinutes < higherTfInMinutes

// Input
switch1=input(true, title="Show MA")
exponential = input(true, title="Exponential MA")
ticker = input(false, title="Other ticker MA")

tic_ma = input(title="Ticker MA", type=input.symbol, defval="BTC_USDT:swap")
res_ma = input(title="Time MA (W, D, [min])", type=input.string, defval="M")
len_ma = input(8, minval=1, title="Period MA")

ma_cus = exponential?f_secureSecurity(tic_ma, res_ma, ema(close,len_ma)) : f_secureSecurity(tic_ma, res_ma, sma(close,len_ma))
ma_long = exponential?f_secureSecurity(syminfo.tickerid, res_ma, ema(close,len_ma)) : f_secureSecurity(syminfo.tickerid, res_ma, sma(close,len_ma))

cl1 = f_secureSecurity(syminfo.tickerid, 'M', close)
cl2 = f_secureSecurity(tic_ma, 'M', close)

// Input Backtest Range
showDate  = input(defval = false, title = "Show Date Range", type = input.bool)
fromMonth = input(defval = 1,    title = "From Month",      type = input.integer, minval = 1, maxval = 12)
fromDay   = input(defval = 1,    title = "From Day",        type = input.integer, minval = 1, maxval = 31)
fromYear  = input(defval = 1995, title = "From Year",       type = input.integer, minval = 1850)
thruMonth = input(defval = 1,    title = "Thru Month",      type = input.integer, minval = 1, maxval = 12)
thruDay   = input(defval = 1,    title = "Thru Day",        type = input.integer, minval = 1, maxval = 31)
thruYear  = input(defval = 2112, title = "Thru Year",       type = input.integer, minval = 1850)

// Funcion Example
start     = timestamp(fromYear, fromMonth, fromDay, 00, 00)        // backtest start window
finish    = timestamp(thruYear, thruMonth, thruDay, 23, 59)        // backtest finish window
window()  => time >= start and time <= finish ? true : false       // create function "within window of time"

// Calculation
bullish_cross = ticker?cl2>ma_cus : cl1>ma_long
bearish_cross = ticker?cl2<ma_cus : cl1<ma_long

MAColor = bullish_cross ? color.green : bearish_cross ? color.red : color.orange

// Strategy
strategy.entry("long", strategy.long, when = window() and bullish_cross)
strategy.close("long", when = window() and bearish_cross)

// Output
plot(switch1?ma_long:na,color = MAColor,linewidth=4)

// Alerts
alertcondition(bullish_cross, title='Bullish', message='Bullish')
alertcondition(bearish_cross, title='Bearish', message='Bearish')

Lebih lanjut