Strategi Trend Crossover Purata Bergerak Berganda

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

img

Ringkasan

Strategi trend crossover purata bergerak berganda adalah strategi perdagangan berdasarkan purata bergerak. Ia menggunakan persilangan garis EMA pantas dan garis SMA perlahan sebagai isyarat beli dan jual, dan menggabungkan perbezaan penunjuk MACD untuk menapis isyarat. Strategi ini mempertimbangkan pelbagai faktor seperti harga, trend dan momentum, membentuk sistem perdagangan yang agak lengkap.

Prinsip Strategi

Strategi ini menggunakan dua purata bergerak, EMA dengan panjang 200 hari dan SMA dengan panjang 100 hari. Apabila harga menembusi kedua-dua garis ke atas, isyarat beli dihasilkan. Apabila harga menembusi kedua-dua garis ke bawah, isyarat jual dihasilkan. Ini dapat menapis dengan berkesan trend berayun dan penurunan jangka pendek.

Untuk meningkatkan kebolehpercayaan isyarat, penunjuk MACD juga diperkenalkan. Apabila harga memecahkan EMA dan SMA untuk membentuk isyarat, garis pantas MACD perlu memecahkan garis perlahan dari bawah, dan histogram MACD perlu berada di atas paksi 0, untuk mencetuskan isyarat beli sebenar. Sebaliknya, apabila garis pantas MACD memecahkan garis perlahan dari atas, dan histogram MACD di bawah paksi 0, ia akan mencetuskan isyarat jual sebenar.

Selain itu, stop loss dan mengambil keuntungan ditetapkan dalam strategi. Selepas strategi membuka kedudukan, titik stop loss dan mengambil keuntungan akan dikira dan ditetapkan mengikut peratusan yang ditetapkan oleh pengguna. Ini dapat mengawal risiko perdagangan tunggal dengan berkesan.

Ringkasnya, strategi ini secara komprehensif mempertimbangkan pelbagai penunjuk, menetapkan syarat penapisan yang ketat untuk isyarat beli dan jual, dan menggunakan stop loss dan mengambil keuntungan untuk menguruskan risiko, membentuk sistem perdagangan yang agak ketat dan lengkap.

Analisis Kelebihan

Strategi Trend Crossover Dual Moving Average mempunyai kelebihan berikut:

  1. Menggabungkan pelbagai penunjuk, mempertimbangkan harga, trend dan momentum secara menyeluruh, dan menetapkan syarat penapisan yang ketat untuk isyarat dapat mengelakkan isyarat palsu dan meningkatkan kebolehpercayaan isyarat.

  2. Penggunaan dua purata bergerak dengan parameter yang berbeza dapat lebih mengenal pasti trend pasaran dan menapis pasaran berayun. Garis EMA cepat digunakan untuk mengesan perubahan harga tepat pada masanya; Garis SMA perlahan digunakan untuk menentukan trend jangka panjang. Gabungan kedua-dua garis berfungsi dengan lebih baik.

  3. Indikator MACD memperkenalkan parameter yang boleh disesuaikan yang boleh diselaraskan mengikut ciri-ciri pasaran yang berbeza dan mempunyai fleksibiliti yang tinggi. Tetapan MACD memastikan bahawa isyarat perdagangan disokong oleh harga, trend dan momentum pada masa yang sama, dengan itu mempunyai nilai aplikasi yang sangat kuat.

  4. Menetapkan titik stop loss dan mengambil keuntungan dapat memaksimumkan kawalan ke atas kerugian perdagangan tunggal dan mengelakkan kerugian yang berlebihan. Tetapan peratusan yang munasabah untuk mengambil keuntungan dapat mengunci keuntungan separa dan mengurangkan pendedahan risiko pasaran selepas membuat keuntungan.

  5. Parameter strategi ini boleh ditetapkan dengan fleksibel, dan strategi boleh diselaraskan berdasarkan hasil pengoptimuman, yang sangat praktikal.

Analisis Risiko

Strategi Trend Crossover Purata Bergerak Berganda juga mempunyai beberapa risiko, terutamanya dalam bidang berikut:

  1. Apabila harga saham menunjukkan turun naik yang ganas, EMA dan SMA boleh menyeberang secara salah untuk banyak kali, mengakibatkan pembukaan dan penutupan isyarat perdagangan yang kerap. Ini akan meningkatkan kekerapan perdagangan dan perbelanjaan komisen.

  2. Indikator MACD mungkin mempunyai pecah palsu, terutamanya dalam proses apabila momentum masih tidak jelas. Dalam kes ini, isyarat juga tidak boleh dipercayai, yang boleh menyebabkan kerugian yang tidak perlu.

  3. Kedudukan dan nisbah tetapan stop loss mempunyai pengaruh yang besar terhadap hasil keuntungan dan kerugian. Jika stop loss ditetapkan terlalu kecil, terdapat risiko terperangkap; jika stop loss ditetapkan terlalu besar, kerugian tunggal mungkin terlalu berat. Ini memerlukan ujian yang mencukupi untuk mencari parameter optimum.

  4. Sebagai penunjuk pengesanan trend, keberkesanan purata bergerak akan didiskon apabila harga berbalik dengan cepat. Strategi mungkin tidak mempunyai masa untuk menghentikan kerugian sebelum terkena pembalikan harga, menyebabkan kerugian yang lebih besar.

Penyelesaian yang sepadan adalah seperti berikut:

  1. Untuk pasaran yang tidak menentu, sesuaikan parameter purata bergerak dengan sewajarnya, menggunakan parameter EMA dan SMA yang lebih rendah untuk mengurangkan kekerapan persilangan.

  2. Tingkatkan keadaan penapisan seperti MACD pecah di atas dan di bawah garis sifar, yang boleh mengurangkan pecah palsu ke tahap tertentu.

  3. Tetapan kedudukan dan nisbah stop loss memerlukan pengujian dan pengoptimuman yang mencukupi untuk mencari parameter yang optimum.

  4. Mekanisme boleh ditubuhkan untuk mengenal pasti pembalikan harga yang cepat. Apabila pembalikan yang tidak normal dikesan, langkah kecemasan boleh diambil seperti mengurangkan kedudukan atau menangguhkan strategi perdagangan untuk mengawal pendedahan risiko.

Arahan pengoptimuman

Masih ada ruang untuk mengoptimumkan lagi strategi Trend Crossover Dual Moving Average, terutamanya dalam aspek berikut:

  1. Uji lebih banyak penunjuk untuk gabungan untuk mencari parameter yang lebih baik, seperti menggabungkan saluran BOLL dan mempertimbangkan kesan turun naik.

  2. Mengoptimumkan parameter panjang purata bergerak untuk mencari kombinasi parameter terbaik di bawah keadaan pasaran yang berbeza.

  3. Menetapkan strategi Stop Loss dan mengambil keuntungan yang lebih saintifik dan munasabah, seperti memperkenalkan Stop Loss Trailing, atau menetapkan nisbah risiko-balasan dinamik berdasarkan hasil statistik sejarah.

  4. Membina mekanisme untuk mengenal pasti secara automatik dan bertindak balas kecemasan terhadap pembalikan harga yang tidak normal. Dalam keadaan pasaran yang melampau, secara proaktif mengurangkan kedudukan atau menangguhkan strategi untuk mengelakkan kerugian besar.

  5. Memperluas jenis perdagangan seperti pertukaran asing, mata wang kripto dan jenis lain. Uji ketahanan parameter di pelbagai jenis untuk memperluaskan penerapan strategi.

  6. Mengoptimumkan strategi pengurusan modal strategi, seperti perdagangan jumlah tetap, nisbah kedudukan tetap, dll. Kawalan risiko kerugian perdagangan tunggal, menjadikan kurva modal keseluruhan lebih stabil.

Kesimpulan

Strategi Trend Crossover Rata-rata Bergerak Berganda secara komprehensif mempertimbangkan pelbagai faktor. Apabila menghasilkan isyarat perdagangan, ia memerlukan sokongan dari pelbagai penunjuk seperti harga, trend dan momentum untuk memastikan kebolehpercayaan isyarat. Strategi ini juga mengamalkan stop loss bergerak dan mengambil keuntungan untuk mengawal risiko perdagangan individu dengan berkesan. Tetapan parameter fleksibel strategi menjadikannya sangat praktikal untuk perdagangan automatik.

Walau bagaimanapun, tidak ada strategi yang sempurna. Strategi ini juga akan menghadapi beberapa kesukaran dalam penerapannya, seperti perdagangan yang kerap, pecah palsu, kedudukan stop loss, dll. Untuk meningkatkan lagi ketahanan dan keuntungan strategi, usaha perlu dilakukan dalam banyak aspek, termasuk mengoptimumkan portfolio parameter, memperkenalkan penunjuk teknikal baru, meningkatkan mekanisme stop loss, dan sebagainya.

Ringkasnya, Strategi Trend Crossover Purata Bergerak Berganda membentuk sistem perdagangan yang agak lengkap dan ketat. Melalui pengoptimuman dan penambahbaikan yang berterusan dalam penyelidikan dan aplikasi masa depan, strategi ini mempunyai potensi untuk mencapai nilai praktikal 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 lanjut