Strategi purata amplop pembalikan purata bergerak

Penulis:ChaoZhang, Tarikh: 2023-12-04 16:12:39
Tag:

img

Ringkasan

Strategi purata pergerakan amplop pembalikan adalah strategi perdagangan pembalikan purata berdasarkan purata bergerak. Ia menggunakan purata bergerak eksponen ganda (DEMA) sebagai pengiraan asas dan menambah beberapa sampul di atas dan di bawahnya. Apabila harga menyentuh jalur sampul, ia membuka kedudukan panjang atau pendek berdasarkan arah. Apabila harga regresi ke purata bergerak, ia menutup semua kedudukan.

Logika Strategi

Strategi ini menggunakan purata bergerak eksponen ganda (DEMA) sebagai penunjuk asas, yang merupakan purata bergerak yang lebih sensitif terhadap perubahan harga baru-baru ini. Di atas dan di bawah DEMA, beberapa jalur harga ditambahkan untuk membentuk zon sampul. Julat sampul ditetapkan oleh pengguna, dengan selang peratusan tetap antara setiap jalur.

Apabila harga naik dan mendekati jalur sampul atas, strategi membuka kedudukan pendek. Apabila harga jatuh dan mencapai jalur sampul bawah, ia membuka kedudukan panjang. Ia menambah kedudukan baru setiap kali jalur harga baru disentuh. Apabila harga merosot dekat dengan purata bergerak, semua kedudukan ditutup.

Melalui menangkap turun naik harga yang berlebihan dengan band sampul dan mendapat keuntungan daripada pembalikan, strategi ini bertujuan untuk membeli rendah dan menjual tinggi.

Kelebihan

  • Menggunakan purata bergerak eksponensial berganda, yang sensitif terhadap perubahan harga jangka pendek untuk menangkap pembalikan trend.
  • Band sampul di sekitar purata bergerak dapat menangkap pembalikan harga dengan tepat.
  • Membuka kedudukan dalam kumpulan, sepenuhnya menggunakan kecekapan modal.
  • Cepat menukar arah selepas keuntungan untuk menyesuaikan diri dengan perubahan pasaran.
  • Parameter boleh dioptimumkan secara bebas.

Risiko

  • Tidak dapat mendapat keuntungan daripada pasaran yang kuat.
  • Parameter yang tidak betul boleh menyebabkan perdagangan berlebihan.
  • Membutuhkan pasaran yang agak stabil, tidak sesuai untuk persekitaran yang sangat tidak menentu.
  • Envelope yang terlalu sempit boleh menghalang masuk kedudukan.

Risiko boleh dikurangkan dengan memperluaskan julat sampul yang sesuai untuk meningkatkan kepekaan dan menyesuaikan panjang purata bergerak untuk menyesuaikan kitaran pasaran yang berbeza.

Arahan pengoptimuman

Strategi ini boleh dioptimumkan dalam aspek berikut:

  1. Uji algoritma purata bergerak yang berbeza.

  2. Sesuaikan parameter panjang purata bergerak untuk menyesuaikan diri dengan fluktuasi jangka pendek.

  3. Mengoptimumkan parameter sampul dengan menguji tetapan peratusan yang berbeza.

  4. Tambah kaedah stop loss seperti trailing stop loss untuk menghadkan kerugian perdagangan tunggal.

  5. Tambah keadaan penapisan dengan penunjuk lain untuk mengelakkan kemasukan yang tidak sah di pasaran yang tidak rasional.

Kesimpulan

Strategi purata pergerakan amplop pembalikan purata secara berkesan menangkap peluang pembalikan purata dengan membina saluran harga di sekitar purata bergerak. Ia boleh disesuaikan dengan fleksibel dengan persekitaran pasaran yang berbeza melalui penyesuaian parameter. Dengan kos urus niaga yang agak rendah dan pulangan yang tinggi, ini adalah strategi perdagangan kuantitatif yang disyorkan.


/*backtest
start: 2022-11-27 00:00:00
end: 2023-12-03 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
strategy("Mean Reversion - Envelope Strategy", overlay=true )

// ----------------------- DESCRIPTION -----------------------
// THIS SCRIPT IS A MEAN REVERSION SYSTEM THAT USES A MOVING AVERAGE AS BASE CALCULATION AND A % OF THIS MOVING AVERAGE TO CALCULATE THE ENVELOPE
// BY DEFAULT, THE SYSTEM WILL PLACE LONG ORDERS ON THE MOVING AVERAGE -5% PER ENVELOPE COUNT (5%, 10% AND SO ON...)
// YOU CAN ENABLE THE SHORT ORDERS THAT WILL FOLLOW THE SAME LOGIC ON THE OPPOSITE SIDE
// THE SYSTEM WILL CLOSE EVERY ONGOING TRADE WHEN THE PRICE RETURNS TO THE MEAN

// ---------------------------------------------
// ---------------- SETTINGS -------------------
src = input(close, "Moving Average Source", group = "Moving Average")
ma_window = input.int(5, "Moving Average Window", step = 1, group = "Moving Average")
ma_type = input.string('4. DEMA', "Moving Average Type", options=['1. SMA', '2. EMA', '3. RMA', '4. DEMA'], group = "Moving Average")
enveloppe_step = input.float(0.05, "Delta Per Enveloppe", step = 0.01, group = "Envelope")
envelope_count = input.int(5, "Envelope count", options = [1, 2, 3, 4, 5], group = "Envelope")
use_longs = input.bool(true, 'Use Long Orders ?', group = "Orders") 
use_short = input.bool(false, 'Use Short Orders ?', group = "Orders")


// ---------------------------------------------
// -------------- INDICATORS -------------------
ma_funct() =>
    if(ma_type == '1. SMA') 
        ta.sma(src, ma_window)
    if(ma_type == '2. EMA') 
        ta.ema(src, ma_window)
    if(ma_type == '3. RMA') 
        ta.rma(src, ma_window)
    if(ma_type == '4. DEMA') 
        2 * ta.ema(src, ma_window) - ta.ema(ta.ema(src, ma_window), ma_window)

ma_base = ma_funct()

ma_high_1 = envelope_count > 0 ? ma_base * (1 + enveloppe_step) : na
ma_high_2 = envelope_count > 1 ? ma_base * (1 + enveloppe_step * 2) : na
ma_high_3 = envelope_count > 2 ? ma_base * (1 + enveloppe_step * 3) : na
ma_high_4 = envelope_count > 3 ? ma_base * (1 + enveloppe_step * 4) : na
ma_high_5 = envelope_count > 4 ? ma_base * (1 + enveloppe_step * 5) : na

ma_low_1 = envelope_count > 0 ? ma_base * (1 - enveloppe_step) : na
ma_low_2 = envelope_count > 0 ? ma_base * (1 - enveloppe_step * 2) : na
ma_low_3 = envelope_count > 0 ? ma_base * (1 - enveloppe_step * 3) : na
ma_low_4 = envelope_count > 0 ? ma_base * (1 - enveloppe_step * 4) : na
ma_low_5 = envelope_count > 0 ? ma_base * (1 - enveloppe_step * 5) : na


// ---------------------------------------------
// --------------- STRATEGY --------------------
if use_longs
    if envelope_count > 0 and strategy.opentrades < 1
        strategy.entry('long 1', strategy.long, limit=ma_low_1, qty=(strategy.equity / ma_low_1) * (1 / envelope_count))
    if envelope_count > 1 and strategy.opentrades < 2
        strategy.entry('long 2', strategy.long, limit=ma_low_2, qty=(strategy.equity / ma_low_2) * (1 / envelope_count))
    if envelope_count > 2 and strategy.opentrades < 3
        strategy.entry('long 3', strategy.long, limit=ma_low_3, qty=(strategy.equity / ma_low_3) * (1 / envelope_count))
    if envelope_count > 3 and strategy.opentrades < 4
        strategy.entry('long 4', strategy.long, limit=ma_low_4, qty=(strategy.equity / ma_low_4) * (1 / envelope_count))
    if envelope_count > 4 and strategy.opentrades < 5
        strategy.entry('long 5', strategy.long, limit=ma_low_5, qty=(strategy.equity / ma_low_5) * (1 / envelope_count))


if use_short
    if envelope_count > 0 and strategy.opentrades < 1
        strategy.entry('short 1', strategy.short, limit=ma_high_1, qty=(strategy.equity / ma_high_1) * (1 / envelope_count))
    if envelope_count > 1 and strategy.opentrades < 2
        strategy.entry('short 2', strategy.short, limit=ma_high_2, qty=(strategy.equity / ma_high_2) * (1 / envelope_count))
    if envelope_count > 2 and strategy.opentrades < 3
        strategy.entry('short 3', strategy.short, limit=ma_high_3, qty=(strategy.equity / ma_high_3) * (1 / envelope_count))
    if envelope_count > 3 and strategy.opentrades < 4
        strategy.entry('short 4', strategy.short, limit=ma_high_4, qty=(strategy.equity / ma_high_4) * (1 / envelope_count))
    if envelope_count > 4 and strategy.opentrades < 5
        strategy.entry('short 5', strategy.short, limit=ma_high_5, qty=(strategy.equity / ma_high_5) * (1 / envelope_count))

strategy.exit('close', limit=ma_base)


// ---------------------------------------------
// ------------------ PLOT ---------------------
ma_base_plot = plot(ma_base, title = "Base MA", color = color.orange, linewidth = 3, offset = 1)

ma_high_1_plot = plot(ma_high_1, title = "MA high 1", color = color.red, offset = 1)
ma_high_2_plot = plot(ma_high_2, title = "MA high 2", color = color.red, offset = 1)
ma_high_3_plot = plot(ma_high_3, title = "MA high 3", color = color.red, offset = 1)
ma_high_4_plot = plot(ma_high_4, title = "MA high 4", color = color.red, offset = 1)
ma_high_5_plot = plot(ma_high_5, title = "MA high 5", color = color.red, offset = 1)

ma_low_1_plot = plot(ma_low_1, title = "MA low 1", color = color.green, offset = 1)
ma_low_2_plot = plot(ma_low_2, title = "MA low 2", color = color.green, offset = 1)
ma_low_3_plot = plot(ma_low_3, title = "MA low 3", color = color.green, offset = 1)
ma_low_4_plot = plot(ma_low_4, title = "MA low 4", color = color.green, offset = 1)
ma_low_5_plot = plot(ma_low_5, title = "MA low 5", color = color.green, offset = 1)


Lebih lanjut