Strategi Tren Crossover Rata-rata Bergerak Ganda

Penulis:ChaoZhang, Tanggal: 2023-12-06 11:52:10
Tag:

img

Gambaran umum

Strategi Trend Crossover Dual Moving Average adalah strategi perdagangan yang didasarkan pada moving average. Strategi ini menggunakan crossover EMA cepat dan SMA lambat sebagai sinyal beli dan jual, dan menggabungkan divergensi indikator MACD untuk menyaring sinyal. Strategi ini mempertimbangkan beberapa faktor seperti harga, tren dan momentum, membentuk sistem perdagangan yang relatif lengkap.

Prinsip Strategi

Strategi ini menggunakan dua rata-rata bergerak, EMA dengan durasi 200 hari dan SMA dengan durasi 100 hari. Ketika harga menembus kedua garis ke atas, sinyal beli dihasilkan. Ketika harga menembus kedua garis ke bawah, sinyal jual dihasilkan. Ini dapat secara efektif menyaring tren osilasi dan penarikan jangka pendek.

Untuk lebih meningkatkan keandalan sinyal, indikator MACD juga diperkenalkan. Ketika harga menembus EMA dan SMA untuk membentuk sinyal, garis cepat MACD perlu menembus garis lambat dari bawah, dan histogram MACD perlu berada di atas sumbu 0, untuk memicu sinyal beli nyata. Sebaliknya, ketika garis cepat MACD menembus garis lambat dari atas, dan histogram MACD berada di bawah sumbu 0, itu akan memicu sinyal jual nyata.

Selain itu, stop loss dan take profit ditetapkan dalam strategi. Setelah strategi membuka posisi, stop loss point dan take profit point akan dihitung dan ditetapkan sesuai dengan persentase yang ditetapkan oleh pengguna. Hal ini dapat secara efektif mengendalikan risiko satu perdagangan.

Singkatnya, strategi ini secara komprehensif mempertimbangkan beberapa indikator, menetapkan kondisi penyaringan yang ketat untuk sinyal beli dan jual, dan mengadopsi stop loss dan mengambil keuntungan untuk mengelola risiko, membentuk sistem perdagangan yang relatif ketat dan lengkap.

Analisis Keuntungan

Strategi Trend Crossover Dual Moving Average memiliki keuntungan berikut:

  1. Menggabungkan beberapa indikator, secara komprehensif mempertimbangkan harga, tren dan momentum, dan menetapkan kondisi penyaringan yang ketat untuk sinyal dapat secara efektif menghindari sinyal palsu dan meningkatkan keandalan sinyal.

  2. Penggunaan dua rata-rata bergerak dengan parameter yang berbeda dapat lebih mengidentifikasi tren pasar dan menyaring pasar osilasi. Garis EMA cepat digunakan untuk melacak perubahan harga tepat waktu; Garis SMA lambat digunakan untuk menentukan tren jangka panjang. Kombinasi kedua garis bekerja lebih baik.

  3. Indikator MACD memperkenalkan parameter yang dapat disesuaikan yang dapat disesuaikan sesuai dengan karakteristik pasar yang berbeda dan memiliki fleksibilitas yang tinggi.

  4. Menetapkan titik stop loss dan take profit dapat memaksimalkan kontrol atas kerugian perdagangan tunggal dan menghindari kerugian yang berlebihan. pengaturan persentase yang wajar untuk mengambil keuntungan dapat mengunci keuntungan parsial dan mengurangi paparan risiko pasar setelah menghasilkan keuntungan.

  5. Parameter strategi ini dapat diatur secara fleksibel, dan strategi dapat disesuaikan berdasarkan hasil optimasi, yang sangat praktis.

Analisis Risiko

Strategi Trend Crossover Dual Moving Average juga memiliki beberapa risiko, terutama di bidang-bidang berikut:

  1. Ketika harga saham menunjukkan fluktuasi yang keras, EMA dan SMA dapat menyeberang secara salah berkali-kali, yang mengakibatkan pembukaan dan penutupan sinyal perdagangan yang sering.

  2. Indikator MACD mungkin memiliki false breakout, terutama dalam proses ketika momentum masih tidak jelas. Dalam hal ini, sinyal juga tidak dapat diandalkan, yang dapat menyebabkan kerugian yang tidak perlu.

  3. Posisi dan rasio pengaturan stop loss memiliki pengaruh besar pada hasil profit dan loss. Jika stop loss diatur terlalu kecil, ada risiko tertangkap; jika stop loss diatur terlalu besar, single loss mungkin terlalu berat. Ini membutuhkan pengujian yang cukup untuk menemukan parameter optimal.

  4. Sebagai indikator pelacakan tren, efektivitas rata-rata bergerak akan didiskon ketika harga berbalik dengan cepat. Strategi mungkin tidak memiliki waktu untuk menghentikan kerugian sebelum terkena pembalikan harga, menyebabkan kerugian yang lebih besar.

Solusi yang sesuai adalah sebagai berikut:

  1. Untuk pasar yang volatile, sesuaikan parameter rata-rata bergerak, menggunakan EMA dan SMA parameter yang lebih rendah untuk mengurangi frekuensi crossover.

  2. Meningkatkan kondisi penyaringan seperti MACD yang pecah di atas dan di bawah garis nol, yang dapat mengurangi pecah palsu sampai batas tertentu.

  3. Pengaturan posisi stop loss dan rasio membutuhkan pengujian backtesting dan optimalisasi yang cukup untuk menemukan parameter yang optimal.

  4. Mekanisme dapat dibentuk untuk mengidentifikasi pembalikan harga yang cepat. Ketika pembalikan yang tidak normal terdeteksi, tindakan darurat dapat diambil seperti mengurangi posisi atau menangguhkan strategi perdagangan untuk mengendalikan eksposur risiko.

Arahan Optimasi

Masih ada ruang untuk optimalisasi lebih lanjut dari strategi Dual Moving Average Crossover Trend, terutama dalam aspek-aspek berikut:

  1. Uji lebih banyak indikator untuk kombinasi untuk menemukan parameter yang lebih baik, seperti menggabungkan saluran BOLL dan mempertimbangkan dampak volatilitas.

  2. Mengoptimalkan parameter panjang rata-rata bergerak untuk menemukan kombinasi parameter terbaik di bawah kondisi pasar yang berbeda.

  3. Menetapkan strategi stop loss dan mengambil keuntungan yang lebih ilmiah dan masuk akal, seperti memperkenalkan stop loss trailing, atau menetapkan rasio risiko-imbalan dinamis berdasarkan hasil statistik historis.

  4. Menetapkan mekanisme untuk identifikasi otomatis dan tanggapan darurat dari pembalikan harga yang tidak normal. Dalam kondisi pasar yang ekstrem, proaktif mengurangi posisi atau menangguhkan strategi untuk menghindari kerugian besar.

  5. Memperluas varietas perdagangan seperti valuta asing, cryptocurrency dan varietas lainnya. Uji ketahanan parameter di berbagai varietas untuk memperluas penerapan strategi.

  6. Mengoptimalkan strategi manajemen modal dari strategi, seperti perdagangan dengan jumlah tetap, rasio posisi tetap, dll. Mengontrol risiko kerugian perdagangan tunggal, membuat kurva modal secara keseluruhan lebih stabil.

Kesimpulan

Dual Moving Average Crossover Trend Strategy secara komprehensif mempertimbangkan beberapa faktor. Saat menghasilkan sinyal perdagangan, dibutuhkan dukungan dari beberapa indikator seperti harga, tren dan momentum untuk memastikan keandalan sinyal. Strategi ini juga mengadopsi stop loss bergerak dan mengambil keuntungan untuk mengontrol risiko perdagangan individu secara efektif. Pengaturan parameter yang fleksibel dari strategi ini membuatnya sangat praktis untuk perdagangan otomatis.

Namun, tidak ada strategi yang dapat sempurna. Strategi ini juga akan menghadapi beberapa kesulitan dalam penerapannya, seperti perdagangan yang sering, breakout palsu, posisi stop loss, dll. Untuk lebih meningkatkan ketahanan dan profitabilitas strategi, upaya perlu dilakukan dalam banyak aspek, termasuk mengoptimalkan portofolio parameter, memperkenalkan indikator teknis baru, meningkatkan mekanisme stop loss, dan sebagainya.

Singkatnya, Dual Moving Average Crossover Trend Strategy membentuk sistem perdagangan yang relatif lengkap dan ketat. Melalui optimasi dan peningkatan berkelanjutan dalam penelitian dan aplikasi di masa depan, strategi ini memiliki potensi untuk mencapai nilai praktis yang lebih besar.


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

//@version=4
// Hi,
// This is my first strategy made by myself(except for the MACD indicator). I'm publishing this to get myself out there and for some newer people to see how a basic strategy works. All credits go to Zen&TheArtofTrading, for teaching me almost everything I know about Pinescript
// The strategy is basically an MACD crossover trend strategy. If the MACD line crosses the signal line upward, above the zero point of the histogram, while the price is above 200 EMA and 100 SMA it's a buy signal
// If the MACD line crosses the signal line downward, while below zero point of the histogram, as well as the price being below 200 EMA and 100 SMA it's a sell signal
// I used the 200 EMA and 100 SMA because I wanted to filter weak signals as much as possible when the market is ranging, if you have any suggestions to go around this better, please let me know, still learning everyday

// If you have any suggestions, tips or tricks please let me know. I'm still new to Pinescript, but having a lot of fun trying stuff out. If you see something in my code that you don't understand, feel free to ask, I'll try to answer as best as I can

// I opened the strategy with predetermined backtesting pyramiding, currency etc. This made the progress of backtesting multiple TP and SL easier. Also the commission value is from Binance Futures, I just left it in there for anyone who wants to just copy this strategy
strategy("MACD Crossover Trend Strategy Template", overlay = true )

// Determining inputs and values, I just copied the built-in MACD strategy and removed everything I didn't need, just needed the barebone indicator and added EMA + SMA inputs
fast_length = input(title = "Fast Length", type = input.integer, defval = 12, group = "MACD Values")
slow_length = input(title = "Slow Length", type = input.integer, defval = 26, group = "MACD Values")
src = input(title = "Source", type = input.source, defval = close, group = "MACD Values")
signal_length = input(title = "Signal Smoothing", type=input.integer, minval = 1, maxval = 50, defval = 9, group = "MACD Values")
sma_source = input(title = "Simple MA (Oscillator)", type = input.bool, defval = false, group = "MACD Values")
sma_signal = input(title = "Simple MA (Signal Line)", type = input.bool, defval = false, group = "MACD Values")
fast_ma = sma_source ? sma(src, fast_length) : ema(src, fast_length)
slow_ma = sma_source ? sma(src, slow_length) : ema(src, slow_length)
macd = fast_ma - slow_ma
signal = sma_signal ? sma(macd, signal_length) : ema(macd, signal_length)
hist = macd - signal
emaLength = input(title = "EMA", type = input.integer, defval = 200, step = 10, group = "Moving Averages")
smaLength = input(title = "SMA", type = input.integer, defval = 100, step = 10, group = "Moving Averages")

// Input backtest range, you can adjust this here or in the input options
fromMonth = input(defval = 1,    title = "From Month",      type = input.integer, minval = 1, maxval = 12, group = "Backtest Date Range")
fromDay   = input(defval = 1,    title = "From Day",        type = input.integer, minval = 1, maxval = 31, group = "Backtest Date Range")
fromYear  = input(defval = 2000, title = "From Year",       type = input.integer, minval = 1970, group = "Backtest Date Range")
thruMonth = input(defval = 1,    title = "Thru Month",      type = input.integer, minval = 1, maxval = 12, group = "Backtest Date Range")
thruDay   = input(defval = 1,    title = "Thru Day",        type = input.integer, minval = 1, maxval = 31, group = "Backtest Date Range")
thruYear  = input(defval = 2099, title = "Thru Year",       type = input.integer, minval = 1970, group = "Backtest Date Range")

// Inputs for EMA, SMA and to adjust your take profit and stop losses in the input options while backtesting, it's result of your input is calculated back to percentages
ema = ema(close, emaLength)
sma = sma(close, smaLength)
profitlong = input(title = "Profit Long %", type = input.float, defval = 2, minval = 0.1, maxval = 100, step = 0.1, group = "TP / SL %") * 0.01
losslong = input(title = "Loss Long %", type = input.float, defval = 1, minval = 0.1, maxval = 100, step = 0.1, group = "TP / SL %") * 0.01
profitshort = input(title = "Profit Short %", type = input.float, defval = 2, minval = 0.1, maxval = 100, step = 0.1, group = "TP / SL %") * 0.01
lossshort = input(title = "Loss Short %", type = input.float, defval = 1, minval = 0.1, maxval = 100, step = 0.1, group = "TP / SL %") * 0.01

// Check EMA and SMA also check the backtest range. inDataRange is a true or false statement, true if the date right now is between the parameters that's filled at the corresponding inputs
// (for example 1-1-2020 till 12-12-2020, if that specific bar is between these dates, statement is true and trade will be executed)
// If the date is not in between the given parameters, statement turns to false and it won't allow new trades and closes all current trades as seen with the strategy.close_all function
inDataRange = (time >= timestamp(syminfo.timezone, fromYear, fromMonth, fromDay, 0, 0)) and (time < timestamp(syminfo.timezone, thruYear, thruMonth, thruDay, 0, 0))
long = close > ema and close > sma and inDataRange
short = close < ema and close < sma and inDataRange

// Entry and exit signals + checking backtest date range, what the signals are supposed to do is noted at the beginning of the code
// I want a way to filter out weak signals that are ranging around the zero point of the histogram. 
// So far couldn't think of a decent way to do this over multiple symbols since the range of the histogram changes with every symbol, sometimes ranging between 0 and 1 or sometimes ranging between 0 and 1000
// I could probably use a cofficiency or something, but that's beyond my grasp at the moment
// Also I wanted a way to let my strategy determine a stop loss based on the pullback and having a 1.5 risk/reward TP on top of that. Couldn't really figure out a way to determine the pullback
if (crossover(macd, signal) and macd > 0)
    strategy.entry("Long", long = strategy.long,
     comment = "Long Buy",
     when = long)

strategy.exit("Exit Long", "Long", profit = close * profitlong / syminfo.mintick, loss = close * losslong / syminfo.mintick)


if (crossunder(macd, signal) and macd < 0)
    strategy.entry("Short", long = strategy.short,
     comment = "Short Buy",
     when = short)

strategy.exit("Exit Short", "Short", profit = close * profitshort / syminfo.mintick, loss = close * lossshort / syminfo.mintick)

// To make sure the backtesting doesn't leave a position open beyond, or before, our applied dates
if (not inDataRange)
    strategy.close_all()

// plot(strategy.equity, title="equity", color=color.red, linewidth=2, style=plot.style_areabr)

Lebih banyak