Strategi Crossover Harga Penutupan Bulanan dan Rata-rata Gerak

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

img

Gambaran umum

Strategi ini menghasilkan sinyal perdagangan berdasarkan persilangan antara harga penutupan bulanan dan garis rata-rata bergerak.

Logika Strategi

Logika inti dari strategi ini adalah:

  1. Ambil parameter moving average periode sebagai input. Pilih antara SMA dan EMA.
  2. Pilihan untuk menampilkan garis rata-rata bergerak.
  3. Opsi untuk menggunakan harga penutupan ticker lain sebagai sumber sinyal.
  4. Tentukan sinyal perdagangan berdasarkan hubungan antara harga penutupan bulanan dan rata-rata bergerak:
    • Penembusan harga dekat di atas MA - Long
    • Pengecualian untuk posisi panjang

Strategi ini memanfaatkan kemampuan smoothing moving averages untuk menyaring kebisingan harga dan menangkap pembalikan tren jangka menengah.

Keuntungan

Keuntungan utama dari strategi ini adalah:

  1. Menggunakan data bulanan untuk secara efektif menyaring kebisingan intraday dan menangkap tren jangka menengah dan panjang
  2. Periode MA yang dapat disesuaikan untuk optimasi di seluruh ticker yang berbeda
  3. Pilihan untuk menggunakan ticker lain sebagai sumber sinyal meningkatkan stabilitas
  4. Mengimplementasikan teknik anti-mencat ulang canggih
  5. Kerangka waktu backtesting yang fleksibel untuk memudahkan pengujian

Singkatnya, ini adalah kerangka strategi yang sederhana namun praktis yang dapat disesuaikan dengan sebagian besar saham melalui penyesuaian parameter, terutama cocok untuk investor jangka menengah dan panjang.

Risiko

Ada juga beberapa risiko yang perlu dicatat:

  1. Pembaruan data bulanan lambat, tidak dapat mencerminkan perubahan harga secara real time
  2. Ketinggalan dan bisa kehilangan peluang jangka pendek
  3. MAs memiliki keterlambatan yang melekat, waktu sinyal tidak dapat diprediksi
  4. Pemilihan parameter yang kurang optimal menyebabkan terlalu konservatif atau kehilangan peluang

Cara yang disarankan untuk mengurangi risiko:

  1. Menggabungkan indikator teknis jangka waktu yang lebih cepat untuk penilaian tambahan
  2. Optimalkan periode MA untuk menemukan parameter terbaik
  3. Gunakan patokan yang lebih stabil sebagai sumber sinyal
  4. Sesuaikan ukuran posisi untuk membatasi kerugian

Peluang Peningkatan

Strategi ini memiliki potensi yang besar untuk ditingkatkan:

  1. Menggabungkan stop loss untuk mengunci keuntungan dan mengendalikan risiko
  2. Tambahkan indikator pelengkap seperti KD, MACD untuk meningkatkan akurasi sinyal
  3. Menggunakan teknik pembelajaran mesin untuk mengoptimalkan parameter MA secara dinamis
  4. Memperkenalkan ukuran posisi yang selaras dengan tren
  5. Membangun kemampuan beralih panjang/pendek berdasarkan kondisi pasar
  6. Gabungkan dengan harga jangka waktu yang lebih cepat untuk reaksi yang lebih cepat

Kesimpulan

Strategi penutupan bulanan dan MA crossover memiliki logika yang sederhana dan mudah dan dapat disesuaikan dengan berbagai ticker melalui penyesuaian parameter. Ini sangat cocok untuk investor jangka menengah dan panjang. Dengan peningkatan yang berkelanjutan dari stop loss, optimasi parameter dan modul lainnya, strategi ini menunjukkan janji 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 banyak