Strategi penjejakan baki jangka pendek MACD


Tarikh penciptaan: 2023-10-17 16:15:53 Akhirnya diubah suai: 2023-10-17 16:15:53
Salin: 0 Bilangan klik: 704
1
fokus pada
1617
Pengikut

Strategi penjejakan baki jangka pendek MACD

Gambaran keseluruhan

Strategi ini adalah strategi trend-following yang menggunakan penunjuk MACD untuk mengenal pasti arah polygonal. Ia menghasilkan garis utama MACD dengan mengira perbezaan antara purata bergerak cepat dan purata bergerak perlahan. Strategi ini menggunakan persilangan emas garis utama MACD dan garis isyarat untuk menghasilkan isyarat beli, dan persilangan mati untuk menghasilkan isyarat jual, untuk mencapai pemantauan keseimbangan polygonal.

Prinsip Strategi

Kod pertama menetapkan masa permulaan pengukuran semula untuk prestasi sejarah strategi ujian.

Kemudian adalah pengiraan penunjuk MACD, termasuk tetapan panjang rata-rata bergerak cepat, rata-rata bergerak perlahan dan garis purata MACD. Garis cepat bertindak balas lebih sensitif, dan garis perlahan bertindak balas lebih stabil. Nilai selisih mereka membentuk garis utama MACD, kemudian melalui garis purata membentuk garis isyarat MACD.

Berdasarkan isyarat berbilang dan kosong, rekodkan masa isyarat terakhir dihasilkan. Isyarat beli/jual disahkan dan direkodkan apabila isyarat cepat dan lambat berhadapan, dan ia boleh dibuka.

Selepas masuk, terus mengesan harga tertinggi dan terendah untuk memegang kedudukan. Tetapkan peratusan stop loss dan keluar dari stop loss apabila kerugian mencapai peratusan tersebut.

Kelebihan Strategik

  1. Penunjuk MACD dapat mengenal pasti trend dengan berkesan, dan merupakan salah satu penunjuk klasik dalam analisis teknikal.

  2. Reka bentuk rata-rata perlahan-lahan yang berbeza dapat menangkap pergerakan dan arah perubahan harga lebih awal.

  3. Ia boleh digunakan untuk menyaring beberapa isyarat palsu.

  4. Strategi ini turut dilengkapi dengan mekanisme penangguhan kerugian untuk mengawal risiko.

Risiko Strategik

  1. Penunjuk MACD mudah menghasilkan isyarat palsu, penunjuk itu sendiri boleh mengoptimumkan ruang yang terhad.

  2. Tetapan titik henti yang tidak betul mungkin terlalu aktif atau konservatif, yang perlu dioptimumkan secara individu untuk pelbagai jenis.

  3. Kedudukan jumlah tetap mudah menyebabkan leverage terlalu tinggi, dan anda boleh mempertimbangkan untuk menetapkan ambang risiko mengikut saiz modal.

  4. Keupayaan untuk memilih tetingkap masa pengembalian perlu disahkan untuk mengelakkan kesesakan.

Pengoptimuman Strategi

  1. Mengoptimumkan kombinasi parameter rata-rata, mencari parameter terbaik untuk penyesuaian pelbagai jenis.

  2. Tambah penapis untuk penunjuk lain, seperti bentuk K, pita Brin, RSI dan lain-lain untuk mengesahkan isyarat.

  3. Kesan pelbagai titik penangguhan boleh dinilai berdasarkan penarikan balik, nisbah Sharp dan sebagainya.

  4. Mengoptimumkan strategi hentikan kerugian, seperti hentikan bergerak, hentikan hentikan, dan sebagainya.

  5. Cuba untuk menetapkan kedudukan dinamik berdasarkan perubahan dana, turun naik, dan sebagainya.

ringkaskan

Strategi keseimbangan MACD adalah strategi pengesanan trend berdasarkan penunjuk teknikal klasik. Ia mempunyai keupayaan untuk menangkap dinamik perubahan harga yang sensitif, dan dapat disesuaikan dengan baik dengan pelbagai jenis melalui pengoptimuman parameter. Dengan menggabungkan lebih banyak penunjuk gelombang, cara menghentikan kerugian, dan pengurusan kedudukan dinamik, anda dapat terus meningkatkan kestabilan dan keuntungan strategi.

Kod sumber strategi
/*backtest
start: 2023-09-16 00:00:00
end: 2023-10-16 00:00:00
period: 3h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=2
strategy("MACD BF", overlay=true, initial_capital=10000, default_qty_type=strategy.percent_of_equity, default_qty_value=100, commission_type=strategy.commission.percent, commission_value=0.0)

/////////////// Component Code Start ///////////////
testStartYear = input(2017, "Backtest Start Year") 
testStartMonth = input(1, "Backtest Start Month")
testStartDay = input(1, "Backtest Start Day")
testPeriodStart = timestamp(testStartYear,testStartMonth,testStartDay, 0, 0)

testStopYear = input(2019, "Backtest Stop Year")
testStopMonth = input(12, "Backtest Stop Month")
testStopDay = input(31, "Backtest Stop Day")
testPeriodStop = timestamp(testStopYear,testStopMonth,testStopDay, 0, 0)

// A switch to control background coloring of the test period
testPeriodBackground = input(title="Color Background?", type=bool, defval=true)
testPeriodBackgroundColor = testPeriodBackground and (time >= testPeriodStart) and (time <= testPeriodStop) ? #00FF00 : na
bgcolor(testPeriodBackgroundColor, transp=97)

testPeriod() => true

///////////////  MACD Component - Default settings for one day. /////////////// 
fastLength = input(12) // 72 for 4hr
slowlength = input(26) // 156 for 4 hr
MACDLength = input(12)  // 12 for 4hr

MACD = ema(close, fastLength) - ema(close, slowlength)
aMACD = ema(MACD, MACDLength)
delta = MACD - aMACD

long = crossover(delta, 0) 
short = crossunder(delta, 0) 

last_long = long ? time : nz(last_long[1])
last_short = short ? time : nz(last_short[1])

long_signal = crossover(last_long, last_short)
short_signal = crossover(last_short, last_long)

last_open_long_signal = long_signal ? open : nz(last_open_long_signal[1])
last_open_short_signal = short_signal ? open : nz(last_open_short_signal[1])

last_long_signal = long_signal ? time : nz(last_long_signal[1])
last_short_signal = short_signal ? time : nz(last_short_signal[1])

in_long_signal = last_long_signal > last_short_signal
in_short_signal = last_short_signal > last_long_signal

last_high = not in_long_signal ? na : in_long_signal and (na(last_high[1]) or high > nz(last_high[1])) ? high : nz(last_high[1])
last_low = not in_short_signal ? na : in_short_signal and (na(last_low[1]) or low < nz(last_low[1])) ? low : nz(last_low[1])

sl_inp = input(5.0, title='Stop Loss %', type=float)/100

/////////////// Strategy Component /////////////// 
// Strategy Entry
if testPeriod()
    strategy.entry("Long Entry",  strategy.long, when=long_signal)
    strategy.entry("Short Entry", strategy.short, when=short_signal)

since_longEntry = barssince(last_open_long_signal != last_open_long_signal[1]) // LONG SL
since_shortEntry = barssince(last_open_short_signal != last_open_short_signal[1]) // SHORT SL

slLong = in_long_signal ? strategy.position_avg_price * (1 - sl_inp) : na
slShort = strategy.position_avg_price * (1 + sl_inp)
long_sl = in_long_signal ? slLong : na
short_sl = in_short_signal ? slShort : na

// Strategy SL Exit
if testPeriod()
    strategy.exit("Long SL", "Long Entry", stop=long_sl, when=since_longEntry > 1)
    strategy.exit("Short SL", "Short Entry", stop=short_sl, when=since_shortEntry > 1)

//plot(strategy.equity, title="equity", color=blue, linewidth=2, style=areabr)