Strategi ini menggabungkan isyarat salib emas dan salib mati penunjuk MACD, hubungan harga penutupan dengan garis median, dan ciri-ciri turun naik harga untuk menentukan titik masuk dan keluar. Ia juga menetapkan mekanisme masuk kembali dan pembetulan untuk mendapatkan lebih banyak peluang perdagangan sambil mengawal risiko dan merealisasikan pulangan yang stabil.
Strategi ini berdasarkan prinsip-prinsip berikut:
Gunakan garis cepat MACD dan garis perlahan golden cross dan cross mati untuk menentukan pasaran bull dan bear dan titik kemasukan tertentu.
Gunakan hubungan harga penutupan dengan garis median untuk menentukan akhir trend dan titik keluar.
Tetapkan mekanisme kemasukan semula untuk memasuki semula pasaran ke arah yang sama selepas akhir trend MACD semasa untuk meningkatkan keuntungan.
Tetapkan mekanisme kemasukan pembetulan untuk menambah kedudukan semasa pembetulan harga separa dalam trend.
Sesuaikan kedudukan secara dinamik berdasarkan perkara di atas untuk memaksimumkan keuntungan dalam trend sambil keluar dengan cepat apabila trend berakhir.
Secara khusus, strategi ini terlebih dahulu memeriksa sama ada salib emas atau salib mati berlaku antara garis cepat dan perlahan MACD untuk pergi panjang atau pendek. Ia kemudian memeriksa sama ada harga penutupan menyentuh garis median untuk menentukan akhir trend dan menutup kedudukan.
Di samping itu, strategi ini mempunyai mekanisme kemasukan semula untuk membuka semula kedudukan dalam arah asal jika MACD terus menunjukkan isyarat ke arah yang sama selepas trend awal berakhir.
Melalui tetapan ini, strategi dapat menyesuaikan kedudukan secara dinamik, meningkatkan frekuensi masuk dan keluar, dan memaksimumkan pulangan sambil mengawal risiko dalam trend.
Kelebihan utama strategi pelbagai penunjuk ini ialah:
MACD mengenal pasti trend dan titik pembalikan untuk kemasukan.
Hubungan harga penutupan dan garis median dengan tepat menentukan akhir trend.
Masuk semula meningkatkan kecekapan penggunaan modal.
Pendaftaran pembetulan menambah kedudukan tepat pada masanya untuk menangkap trend.
Frekuensi perdagangan yang tinggi dengan risiko yang terkawal menghasilkan faktor keuntungan yang tinggi.
Parameter yang boleh disesuaikan untuk pengoptimuman di seluruh produk dan pasaran.
Logik yang jelas dan kod ringkas untuk perdagangan langsung yang mudah.
Data backtest yang mencukupi memastikan kebolehpercayaan.
Risiko utama ialah:
Kemungkinan isyarat MACD yang salah perlu disahkan dengan penunjuk lain.
Hentian yang terlalu ketat boleh dihentikan oleh pergerakan yang tidak menentu.
Peningkatan kekerapan perdagangan memerlukan kawalan penggunaan modal.
Masukan pembetulan boleh menyebabkan kerugian semasa menarik balik.
Pengoptimuman yang diperlukan untuk produk dan pasaran yang berbeza.
Memerlukan pengujian dan pengoptimuman yang berterusan.
Kos slippage perlu dipertimbangkan untuk perdagangan langsung.
Langkah-langkah pengurusan risiko termasuk menggunakan hentian untuk mengehadkan kerugian, menilai penggunaan modal, mengoptimumkan parameter setiap produk melalui backtesting, memantau dinamik pasaran untuk memperbaiki parameter, dan perakaunan untuk tergelincir dalam ujian.
Peluang peningkatan:
Tambah penunjuk lain untuk mengesahkan isyarat, contohnya KDJ.
Melaksanakan hentian dinamik adaptif.
Mengoptimumkan logik kemasukan semula dan pembetulan.
Pengoptimuman parameter untuk setiap produk.
Mengoptimumkan penggunaan modal untuk entri.
Memasukkan penunjuk jumlah untuk mengelakkan kerugian daripada entri menarik balik.
Tambahkan mekanisme keluar seperti berhenti bergerak.
Buat bot perdagangan automatik.
Mengira faktor dunia sebenar seperti tergelincir.
Ini dapat meningkatkan kestabilan, kesesuaian, automasi, dan prestasi langsung.
Strategi ini mengintegrasikan isyarat MACD, analisis harga penutupan, dan pelbagai mekanisme kemasukan untuk memaksimumkan trend sambil mengawal risiko. Ia mempunyai kecekapan modal yang tinggi dan kemudahan pelaksanaan tetapi memerlukan kawalan risiko dan pengoptimuman. Automasi boleh menjadikannya sistem perdagangan kuantitatif yang kukuh.
/*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", "")