
Strategi tren silang dua garis sejajar adalah strategi perdagangan berdasarkan purata bergerak. Ia menggunakan persilangan EMA garis cepat dan SMA garis lambat sebagai isyarat membeli dan menjual, dan digabungkan dengan penarikan dari penunjuk MACD untuk memfilter isyarat. Strategi ini mengambil kira pelbagai faktor seperti harga, trend dan momentum sekaligus, membentuk sistem perdagangan yang agak lengkap.
Strategi ini menggunakan dua rata-rata bergerak EMA dan SMA. EMA mempunyai panjang 200 hari dan SMA mempunyai panjang 100 hari. Ia menghasilkan isyarat beli apabila kenaikan harga menembusi dua garis rata-rata; ia menghasilkan isyarat jual apabila penurunan harga menembusi dua garis rata-rata.
Untuk meningkatkan lagi kebolehpercayaan isyarat, strategi ini juga memperkenalkan penunjuk MACD. Apabila harga menembusi EMA dan SMA membentuk isyarat, diperlukan garis pantas MACD dari bawah untuk menembusi garis perlahan, dan grafik pilar MACD berada di atas paksi 0 untuk mencetuskan isyarat beli yang sebenar. Sebaliknya, garis pantas MACD dari atas untuk menembusi garis perlahan, dan grafik pilar MACD berada di bawah paksi 0 untuk mencetuskan isyarat jual yang sebenar.
Selain itu, strategi juga menetapkan hentian dan hentian. Setelah strategi membuka kedudukan, ia akan dikira dan menetapkan titik hentian dan hentian berdasarkan perkadaran yang ditetapkan oleh pengguna. Ini dapat mengawal risiko perdagangan tunggal dengan berkesan.
Secara keseluruhannya, strategi ini mengambil kira pelbagai indikator, menetapkan syarat penapisan yang ketat untuk isyarat beli dan jual, dan menggunakan risiko pengurusan hentian hentian untuk membentuk sistem perdagangan yang agak ketat dan lengkap.
Kaedah ini mempunyai beberapa kelebihan:
Gabungan pelbagai petunjuk, harga, trend dan momentum yang dipertimbangkan secara menyeluruh, syarat penapisan yang ketat ditetapkan untuk isyarat, yang dapat menghalang isyarat palsu dan meningkatkan kebolehpercayaan isyarat.
Garis bergerak dengan dua parameter yang berbeza dapat mengidentifikasi trend pasaran dengan lebih baik, menapis pergerakan. Garis EMA yang cepat digunakan untuk mengesan perubahan harga dalam masa yang tepat; Garis SMA yang perlahan digunakan untuk menentukan trend jangka panjang.
Memperkenalkan pelbagai parameter yang boleh ditetapkan dalam penunjuk MACD, yang boleh disesuaikan mengikut ciri-ciri pasaran yang berbeza, fleksibiliti yang tinggi. Tetapan MACD memastikan isyarat perdagangan mendapat sokongan harga, trend dan momentum pada masa yang sama, sehingga mempunyai nilai aplikasi yang kuat.
Tetapkan titik henti rugi untuk mengawal kerugian maksimum dalam satu transaksi, mengelakkan SIZE_MATHFUNC Risiko kerugian tunggal yang terlalu besar. Peratusan yang munasabah dalam penyetempatan boleh mengunci sebahagian daripada keuntungan dan mengurangkan pendedahan risiko pasaran selepas keuntungan.
Parameter strategi ini boleh diatur secara fleksibel dan boleh disesuaikan dengan strategi berdasarkan hasil pengoptimuman, sangat praktikal. Terdapat banyak ruang pengoptimuman untuk menguji pasaran dan parameter yang berbeza.
Terdapat juga beberapa risiko dalam strategi tren silang dua hala, yang tertumpu kepada beberapa aspek berikut:
EMA dan SMA mungkin mengalami beberapa kali salah persilangan ketika harga saham menunjukkan pergerakan yang kuat, menyebabkan isyarat perdagangan sering terbuka dan ditutup. Ini akan meningkatkan frekuensi perdagangan dan perbelanjaan untuk bayaran.
Indikator MACD mungkin berlaku dalam keadaan pecah palsu, terutamanya semasa momentum goyah masih tidak jelas. Dalam keadaan ini, isyarat juga tidak boleh dipercayai dan mungkin menyebabkan kerugian yang tidak perlu.
Lokasi dan perkadaran yang ditetapkan untuk menghentikan kerugian sangat mempengaruhi hasil keuntungan dan kerugian. Jika set terlalu kecil, terdapat risiko untuk ditutup; dan jika set terlalu besar, kerugian tunggal mungkin terlalu besar. Ini memerlukan ujian yang mencukupi untuk mencari parameter terbaik.
Rata-rata bergerak sebagai petunjuk trend, apabila harga berbalik dengan cepat, ia akan mengurangkan keberkesanannya. Strategi ini mungkin tidak dapat menghentikan kerugian dan akan dipukul oleh harga yang berbalik, menyebabkan kerugian yang lebih besar.
Penyelesaian yang sesuai adalah seperti berikut:
Untuk keadaan gegaran yang kuat, parameter purata bergerak boleh disesuaikan dengan betul, menggunakan EMA dan SMA parameter rendah, mengurangkan jumlah persilangan.
Menambah syarat penapisan untuk MACD menembusi ke atas dan ke bawah pada paksi sifar dapat mengurangkan penembusan palsu. Anda juga boleh mempertimbangkan untuk menggabungkan indikator lain, seperti KDJ, BOLL, dan sebagainya.
Tetapan kedudukan dan perkadaran berhenti kehilangan memerlukan pengoptimuman yang cukup untuk mencari parameter yang optimum. Berdasarkan ini, pemantauan berterusan dan penyesuaian dinamik juga perlu dipertimbangkan.
Mekanisme pengesanan boleh ditetapkan untuk mengenal pasti harga yang berubah dengan cepat. Apabila terdapat perubahan yang tidak normal, ambil langkah-langkah kecemasan untuk mengurangkan kedudukan atau menangguhkan strategi perdagangan untuk mengawal risiko.
Terdapat ruang untuk pengoptimuman yang lebih lanjut dalam strategi trend silang dua hala, yang memfokuskan pada aspek berikut:
Uji lebih banyak penunjuk untuk kombinasi, mencari parameter yang lebih baik. Contohnya, memperkenalkan saluran BOLL, mempertimbangkan kesan kadar turun naik dan sebagainya.
Mengoptimumkan parameter panjang rata-rata bergerak untuk mencari kombinasi parameter terbaik dalam keadaan pasaran yang berbeza. Pengoptimuman parameter bergulir juga merupakan pilihan.
Menetapkan strategi stop loss dengan lebih saintifik dan munasabah. Contohnya, memperkenalkan stop loss yang dijejaki, atau menetapkan nisbah pulangan risiko dinamik berdasarkan hasil statistik sejarah. Ini dapat meningkatkan kestabilan strategi.
Menubuhkan mekanisme pengenalan dan kecemasan automatik untuk perubahan harga yang tidak normal. Bergerak untuk mengurangkan kedudukan atau menangguhkan strategi dalam keadaan yang melampau untuk mengelakkan kerugian besar.
Perluasan kepada varian perdagangan, seperti varian lain seperti forex, mata wang digital dan lain-lain. Uji kekuatan parameter varian yang berbeza, meluaskan ruang lingkup penggunaan strategi.
Strategi pengurusan wang yang mengoptimumkan strategi, seperti perdagangan kuantitatif, peratusan kedudukan tetap, dan lain-lain. Mengendalikan risiko kerugian tunggal, menjadikan kurva wang keseluruhan lebih rata.
Strategi trend silang dua hala merangkumi pelbagai faktor yang dipertimbangkan secara menyeluruh, memerlukan sokongan dari pelbagai indikator harga, trend dan momentum ketika menghantar isyarat perdagangan, untuk memastikan kebolehpercayaan isyarat. Strategi ini juga menggunakan stop loss stop yang bergerak, yang dapat mengawal risiko perdagangan satu kali dengan berkesan.
Walau bagaimanapun, tidak ada strategi yang sempurna. Strategi ini juga akan menghadapi beberapa kesukaran dalam penerapannya, seperti perdagangan yang kerap, penembusan palsu dan penyetempatan kedudukan berhenti. Ini memerlukan kita untuk berusaha dalam pelbagai aspek, dari mengoptimumkan set parameter, memperkenalkan set indikator teknikal baru, memperbaiki mekanisme berhenti, dan seterusnya meningkatkan kestabilan dan keuntungan strategi.
Secara keseluruhannya, strategi tren silang dua hala membentuk sistem perdagangan yang agak lengkap dan ketat. Dalam kajian dan aplikasi kemudian, strategi ini dijangka dapat memberikan nilai pertempuran yang lebih besar melalui pengoptimuman dan penambahbaikan yang berterusan.
/*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)