Strategi persilangan harga penutupan bulanan dan rata-rata pergerakan


Tanggal Pembuatan: 2023-11-23 17:09:01 Akhirnya memodifikasi: 2023-11-23 17:09:01
menyalin: 0 Jumlah klik: 570
1
fokus pada
1617
Pengikut

Strategi persilangan harga penutupan bulanan dan rata-rata pergerakan

Ringkasan

Strategi ini memanfaatkan persilangan antara harga close out dan moving average untuk menghasilkan sinyal perdagangan. Ketika close out melewati moving average di atas harga close out, lakukan over; ketika close out melewati moving average di bawah harga close out, lakukan close out.

Prinsip Strategi

Logika inti dari strategi ini adalah:

  1. Masukkan parameter periodik dari Moving Average, pilih SMA atau EMA
  2. Anda dapat memilih untuk menampilkan rata-rata bergerak
  3. Anda dapat memilih harga penutupan saham lain sebagai sinyal.
  4. Sinyal perdagangan berdasarkan hubungan antara harga close out dan moving average
    • “Saya tidak tahu apa-apa tentang itu, saya tidak tahu apa-apa tentang itu.
    • Penutupan harga di bawah Moving Average Line, posisi kosong

Strategi ini memanfaatkan sifat halus dari moving averages untuk menyaring sebagian dari kebisingan harga dan menangkap pergeseran tren jangka menengah harga saham. Ketika harga saham di atas rata-rata, itu menunjukkan bahwa harga saham sedang membentuk tren bullish; Ketika harga saham di bawah rata-rata, itu menunjukkan bahwa tren harga saham sedang berubah menjadi bearish.

Keunggulan Strategis

Strategi ini memiliki keuntungan utama sebagai berikut:

  1. Menggunakan data bulan untuk memfilter kebisingan malam hari dan menangkap tren jangka menengah dan panjang
  2. Periode rata-rata bergerak yang dapat disesuaikan, parameter yang dioptimalkan untuk menyesuaikan dengan berbagai saham
  3. Dapat memilih saham lain sebagai sumber sinyal, yang membantu meningkatkan stabilitas
  4. Menggunakan teknologi anti-repainting canggih untuk mencegah penarikan
  5. Dapat menginput periode waktu pengembalian yang arbitrer untuk memudahkan pengujian dan optimalisasi

Secara keseluruhan, kerangka strategi ini sederhana dan praktis, dapat diterapkan pada sebagian besar saham melalui pengoptimalan parameter, terutama cocok untuk investor menengah dan menengah.

Risiko Strategis

Strategi ini juga memiliki beberapa risiko, yang terkonsentrasi pada beberapa hal:

  1. Data bulanan lambat diperbarui, tidak dapat mencerminkan perubahan harga secara real time
  2. Ada beberapa keterlambatan, kemungkinan kehilangan peluang transaksi singkat
  3. Garis rata-rata bergerak memiliki keterlambatan, tidak dapat dikendalikan pada titik waktu yang menghasilkan sinyal
  4. Pilihan parameter yang tidak tepat dapat menyebabkan terlalu konservatif atau kehilangan kesempatan

Untuk mengurangi risiko, ada beberapa hal yang dapat dioptimalkan:

  1. Indikator teknis dalam kerangka waktu yang lebih rendah untuk penilaian tambahan
  2. Menyesuaikan periode rata-rata bergerak untuk menemukan kombinasi parameter yang optimal
  3. Menggunakan indikator yang lebih stabil sebagai sumber sinyal
  4. Menyesuaikan ukuran posisi dengan tepat untuk mengendalikan kerugian tunggal

Arah optimasi strategi

Strategi ini juga memiliki ruang untuk pengoptimalan yang besar, terutama dalam beberapa hal berikut:

  1. Meningkatkan strategi stop loss untuk mengunci keuntungan dan mengendalikan risiko
  2. Tergabung dengan indikator lain, seperti KD, MACD, dan lain-lain, untuk meningkatkan akurasi sinyal perdagangan
  3. Mengoptimalkan parameter rata-rata bergerak secara dinamis menggunakan teknologi pembelajaran mesin
  4. Menambahkan modul manajemen posisi untuk mengubah alokasi posisi sesuai tren
  5. Tambahkan fungsi konversi multi-ruang, dapat disesuaikan dengan kondisi pasar yang fleksibel
  6. joining dengan K-line pada kerangka waktu yang lebih rendah, untuk transaksi yang lebih sensitif

Meringkaskan

Strategi crossover harga close out dan moving average secara keseluruhan jelas dan mudah diterapkan, dapat diterapkan pada berbagai saham melalui penyesuaian parameter, terutama cocok untuk investor lini tengah dan panjang. Dengan peningkatan modul seperti parameter stop loss dan optimasi, strategi ini diharapkan menghasilkan kinerja yang lebih baik.

Kode Sumber Strategi
/*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')