
Strategi ini menggabungkan penggunaan isyarat forks mati MACD, hubungan harga penutupan K dengan garis tengah, dan ciri-ciri pergerakan harga untuk menilai masa masuk dan keluar, sambil menetapkan mekanisme masuk semula dan pembetulan masuk, dengan tujuan untuk mendapatkan lebih banyak peluang perdagangan dan mengawal risiko untuk mencapai keuntungan yang stabil.
Strategi ini berdasarkan kepada prinsip-prinsip berikut:
Menggunakan analisis MACD untuk talian cepat dan talian lambat untuk menilai pasaran bertopeng dan kosong, serta titik masuk tertentu.
Gunakan K-baris untuk menentukan sama ada harga penutup dan garis tengah berakhir, dan titik permulaan.
Menetapkan mekanisme kemasukan semula untuk meningkatkan peluang keuntungan apabila MACD berakhir, jika ia terus mengikut trend.
Menetapkan mekanisme kemasukan yang dikoreksi, jika harga mengalami penyesuaian separa tetapi belum berbalik, maka kedudukan tambahan akan diberikan, yang merupakan penyesuaian dalam trend.
Menggabungkan beberapa perkara di atas, secara dinamik menyesuaikan kedudukan, mendapatkan keuntungan sebanyak mungkin dalam trend, dan keluar dengan cepat apabila trend berakhir.
Khususnya, strategi pertama kali menilai apakah garis cepat dan lambat MACD mengalami fenomena garpu emas atau garpu mati, jika garpu emas lebih banyak, jika garpu mati kosong; kemudian menilai sama ada garis K ditutup menyentuh garis pertengahan, jika disentuh, ia dianggap sebagai akhir trend dan posisi rata.
Di samping itu, strategi ini juga menyediakan mekanisme masuk semula, iaitu selepas berakhirnya trend arah asal, jika MACD terus menunjukkan isyarat arah yang sama, strategi ini akan membuka kedudukan untuk mengikuti trend lagi; dan juga menyediakan mekanisme masuk pembetulan, jika harga mengalami penyesuaian kecil tetapi belum berbalik sepenuhnya, strategi ini akan meningkatkan kedudukan dengan sewajarnya, yang merupakan tindak balas penyesuaian normal dalam trend.
Melalui tetapan ini, strategi dapat menyesuaikan kedudukan secara dinamik dalam trend, masuk dan keluar lebih banyak, dan memperoleh keuntungan yang lebih tinggi dengan syarat mengawal risiko.
Strategi ini menggunakan pelbagai indikator dan mempunyai kelebihan utama:
MACD boleh mengenal pasti trend dan titik balik, menentukan titik masuk tertentu.
Penghakiman hubungan harga penutupan dengan garis tengah dapat menentukan dengan tepat akhir trend.
Mekanisme kemasukan semula telah meningkatkan jumlah pembukaan dan meningkatkan kecekapan penggunaan dana.
Memperbaiki mekanisme kemasukan untuk menambah stok tepat pada masanya dan menangkap trend.
Operasi strategi mempunyai frekuensi yang tinggi tetapi risiko boleh dikawal dan faktor keuntungan yang lebih tinggi.
Setiap parameter boleh disesuaikan dan boleh dioptimumkan untuk pelbagai jenis dan keadaan.
Strategi yang jelas dan mudah difahami, kod yang ringkas dan mudah untuk dikendalikan.
Data pengesanan mencukupi, kebolehpercayaan yang tinggi, dan kesan yang mudah disahkan di cakera.
Strategi ini juga mempunyai risiko utama:
Kemungkinan MACD menghantar isyarat palsu, perlu digabungkan dengan penunjuk lain untuk disahkan.
Tetapan stop loss tahap besar terlalu kecil mungkin akan tersingkir oleh keadaan yang sangat teruk.
Kemasukan semula dan kemasukan baharu meningkatkan frekuensi operasi dan memerlukan penggunaan dana yang terkawal.
“Selain itu, ia boleh menyebabkan kerugian yang lebih besar.
Varieti perdagangan dan parameter yang perlu dioptimumkan tidak berlaku untuk semua varieti.
Ia memerlukan pengesanan semula dan pengoptimuman berterusan, mengikut parameter penyesuaian pasaran.
Kesan kos slippage perlu dipertimbangkan di dalam hard disk.
Langkah-langkah pengurusan risiko yang berkaitan termasuk: menetapkan stop loss yang memastikan kerugian tunggal terhad; menilai penggunaan dana, mengekalkan rizab tunai yang munasabah; melakukan pengembalian terhadap kombinasi parameter yang sesuai untuk pemilihan varieti; terus memperhatikan perubahan ciri-ciri pasaran untuk mengoptimumkan parameter; mempertimbangkan kesan kos slip dalam pengembalian dan simulasi.
Strategi ini boleh dioptimumkan dengan cara berikut:
Gabungan dengan penunjuk lain untuk mengesahkan isyarat, meningkatkan ketepatan isyarat. Seperti penunjuk KDJ.
Tetapkan standard penangguhan kerosakan dinamik yang menyesuaikan diri.
Mengoptimumkan logik syarat kemasukan semula dan kemasukan semula.
Pengoptimuman parameter subspesies, menetapkan kombinasi parameter yang optimum.
Mengoptimumkan peratusan penggunaan dana, menetapkan had dana untuk kemasukan semula dan kemasukan baharu.
Indeks kuantiti gabungan untuk mengelakkan kerugian pelaburan dalam keadaan pemulihan.
Menambah mekanisme penyingkiran, seperti menetapkan hentian bergerak dan sebagainya.
Pertimbangkan untuk menggunakan bungkusan strategi sebagai robot perdagangan untuk automasi perdagangan.
Tambahkan pertimbangan dalaman seperti kos slider.
Dengan pengoptimuman ini, kita dapat meningkatkan lagi kestabilan, kebolehpasaran, tahap automasi dan keberkesanan strategi di lapangan.
Strategi ini mengintegrasikan penggunaan isyarat perdagangan MACD, analisis harga penutupan K dan mekanisme masuk beberapa kali, mengawal risiko sambil menangkap trend, merupakan strategi strategi perdagangan kuantitatif yang lebih cekap. Strategi ini mempunyai kelebihan frekuensi operasi yang tinggi, penggunaan modal yang baik, dan kesukaran yang rendah, tetapi juga memerlukan perhatian terhadap kawalan risiko dan pengoptimuman strategi, dengan nilai praktikal yang kuat dan ruang untuk pengembangan.
/*backtest
start: 2023-09-29 00:00:00
end: 2023-10-29 00:00:00
period: 2h
basePeriod: 15m
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/
// © Puckapao
//@version=4
// strategy(title="MACD", shorttitle="MACD", overlay=true, initial_capital=10000.00, currency="USD", default_qty_type=strategy.cash, default_qty_value=10000.00)
// Getting inputs
reenter_delay = input(title="Re-enter Delay", type=input.integer, defval=2)
sculp_delay = input(title="Sculp Delay", type=input.integer, defval=4)
fast_length = input(title="Fast Length", type=input.integer, defval=12)
slow_length = input(title="Slow Length", type=input.integer, defval=26)
src = input(title="Source", type=input.source, defval=close)
signal_length = input(title="Signal Smoothing", type=input.integer, minval = 1, maxval = 50, defval = 9)
sma_source = input(title="Simple MA(Oscillator)", type=input.bool, defval=false)
sma_signal = input(title="Simple MA(Signal Line)", type=input.bool, defval=true)
ema_period = input(title="EMA Period", type=input.integer, defval=21)
// Get date
startDate = input(title="Start Date", type=input.integer,
defval=19, minval=1, maxval=31)
startMonth = input(title="Start Month", type=input.integer,
defval=09, minval=1, maxval=12)
startYear = input(title="Start Year", type=input.integer,
defval=2017, minval=1800, maxval=2100)
endDate = input(title="End Date", type=input.integer,
defval=31, minval=1, maxval=31)
endMonth = input(title="End Month", type=input.integer,
defval=3, minval=1, maxval=12)
endYear = input(title="End Year", type=input.integer,
defval=2021, minval=1800, maxval=2100)
// STEP 2:
// Look if the close time of the current bar
// falls inside the date range
inDateRange = true
reenter_cnt = 0
reenter_cnt := nz(reenter_cnt[1])
sculp_cnt = 0
sculp_cnt := nz(sculp_cnt[1])
close_cnt = 0
close_cnt := nz(close_cnt[1])
on_long = false
on_long := nz(on_long[1])
on_short = false
on_short := nz(on_short[1])
sculp = false
reenter = false
slowdown = false
ema = ema(close, ema_period)
// Plot colors
col_grow_above = #26A69A
col_grow_below = #FFCDD2
col_fall_above = #B2DFDB
col_fall_below = #EF5350
col_macd = #0094ff
col_signal = #ff6a00
// Calculating
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
// plot(hist, title="Histogram", style=plot.style_columns, color=(hist>=0 ? (hist[1] < hist ? col_grow_above : col_fall_above) : (hist[1] < hist ? col_grow_below : col_fall_below) ), transp=0 )
// plot(macd, title="MACD", color=col_macd, transp=0)
// plot(signal, title="Signal", color=col_signal, transp=0)
cross_up = crossover(macd, signal)
cross_down = crossunder(macd, signal)
if (inDateRange)
over_macd = macd > 0 and signal > 0 ? true : false
under_macd = macd < 0 and signal < 0 ? true : false
over_water = close > ema ? true : false
under_water = close < ema ? true : false
slowdown := hist >= 0 ? (hist[1] > hist ? true : false) : (hist[1] > hist ? false : true)
reenter := hist >= 0 ? (hist[1] < hist ? true : false) : (hist[1] > hist ? true : false)
sculp := (hist >= 0 ? (hist[1] > hist ? true : false) : (hist[1] < hist ? true : false))
if(reenter == true)
if(reenter_cnt < reenter_delay)
reenter_cnt := reenter_cnt + 1
else
if(reenter_cnt > 0)
reenter_cnt := reenter_cnt - 1
if(sculp == true)
if(sculp_cnt < sculp_delay)
sculp_cnt := sculp_cnt + 1
else
if(sculp_cnt > 0)
sculp_cnt := sculp_cnt - 1
if(slowdown == false)
if(close_cnt < 2)
close_cnt := close_cnt + 1
else
close_cnt := 0
// plotchar(fork_cnt, "fork count", "")
// plotchar(spoon_cnt, "spoon count", "")
// Entry
if (cross_up == true)
strategy.entry("long", strategy.long, comment = "long", alert_message = "long")
on_long := true
on_short := false
if (cross_down == true)
strategy.entry("short", strategy.short, comment = "short", alert_message = "short")
on_short := true
on_long := false
// Sculp bottom / top
if (sculp == true and sculp_cnt >= sculp_delay)
if (hist >= 0)
strategy.entry("sculp-short", strategy.short, comment = "sculp-short", alert_message = "sculp-short")
else
strategy.entry("sculp-long", strategy.long, comment = "sculp-long", alert_message = "sculp-long")
sculp_cnt := 0
sculp := false
// Re-Entry
if (reenter == true and reenter_cnt >= reenter_delay)
if (hist >= 0)
strategy.entry("re-long", strategy.long, comment = "re-long", alert_message = "re-long")
else
strategy.entry("re-short", strategy.short, comment = "re-short", alert_message = "re-short")
reenter_cnt := 0
reenter := false
// Close
strategy.close("long", when = slowdown, comment = "close long", alert_message = "close long")
strategy.close("short", when = slowdown, comment = "close short", alert_message = "close short")
strategy.close("re-long", when = slowdown, comment = "close re-long", alert_message = "close re-long")
strategy.close("re-short", when = slowdown, comment = "close re-short", alert_message = "close re-short")
strategy.close("sculp-long", when = slowdown, comment = "close sculp-long", alert_message = "close sculp-long")
strategy.close("sculp-short", when = slowdown, comment = "close sculp-short", alert_message = "close sculp-short")
if (slowdown)
if (hist >= 0)
on_long := false
else
on_short := false
plotchar(slowdown, "close", "")
plotchar(reenter, "reenter", "")
plotchar(reenter_cnt, "reenter count", "")
plotchar(sculp, "sculp", "")
plotchar(sculp_cnt, "sculp count", "")