Strategi Squeeze Momentum

Penulis:ChaoZhang, Tarikh: 2023-11-14 14:04:24
Tag:

img

Ringkasan

Idea utama strategi ini adalah menggabungkan penunjuk momentum Lazy Bear dan penunjuk MFI Crypto Face untuk pergi panjang apabila trend naik dan pergi pendek apabila trend turun, mewujudkan strategi perdagangan kuantitatif yang mengikuti trend pasaran.

Logika Strategi

  1. Gunakan penunjuk momentum Lazy Bear BlueWave, yang mengira regresi linear harga penutupan berbanding purata tertinggi, terendah terendah dan dekat 20 hari untuk menentukan arah trend. Apabila BlueWave melintasi di atas 0, ia menunjukkan trend menaik; apabila melintasi di bawah 0, ia menunjukkan trend menurun.

  2. Gunakan penunjuk MFI yang dipertingkatkan oleh Crypto Face, yang mengira jumlah perubahan harga dan jumlah selama 58 hari yang lalu untuk menentukan aliran wang.

  3. Apabila BlueWave melintasi di atas 0 dan MFI lebih besar daripada 0, isyarat beli dihasilkan untuk membuka kedudukan panjang; apabila BlueWave melintasi di bawah 0 dan MFI kurang daripada 0, isyarat jual dihasilkan untuk membuka kedudukan pendek.

  4. Tetapkan syarat stop loss dan mengambil keuntungan untuk mengikuti trend pasaran untuk keuntungan, sambil mengawal risiko.

Kelebihan

  1. Menggabungkan dua penunjuk dapat menentukan arah trend pasaran dengan lebih tepat.

  2. Kurva halus BlueWave mengelakkan bias dari nilai luar biasa, menjadikan penilaian trend lebih boleh dipercayai.

  3. MFI boleh menentukan aliran wang, mengelakkan kerugian daripada pelarian palsu.

  4. Strategi ini mempunyai beberapa parameter dan mudah dilaksanakan dan beroperasi.

  5. Tetapan stop loss dan mengambil keuntungan yang fleksibel membantu mengawal risiko perdagangan.

  6. Sesi dagangan boleh ditetapkan untuk mengelakkan turun naik yang tidak normal semasa waktu pasaran tertentu.

Risiko

  1. Trend penurunan yang berterusan boleh membawa kepada kedudukan pendek dan kerugian berturut-turut.

  2. Isyarat palsu boleh membawa kepada terperangkap selepas memasuki kedudukan.

  3. Stop loss yang terlalu besar boleh meningkatkan kerugian.

  4. Volatiliti yang tinggi boleh sering mencapai titik stop loss.

  5. Pengoptimuman parameter yang tidak betul boleh membawa kepada prestasi strategi yang buruk.

  6. Isyarat dagangan yang terlalu kerap boleh meningkatkan kos transaksi dan slippage.

Peningkatan

  1. Mengoptimumkan parameter BlueWave dan MFI untuk isyarat yang lebih stabil dan boleh dipercayai.

  2. Menggabungkan penunjuk trend untuk mengelakkan kerugian pendek yang berterusan.

  3. Sesuaikan secara dinamik nisbah stop loss/take profit untuk mengurangkan kemungkinan terperangkap.

  4. Memperbaiki keadaan masuk untuk mengurangkan isyarat palsu.

  5. Pertimbangkan saiz kedudukan untuk mengelakkan mengejar perhimpunan dan membuang penurunan.

  6. Gabungkan dengan model pembelajaran mesin untuk titik masuk dan keluar yang lebih tepat.

Kesimpulan

Strategi ini menggabungkan BlueWave dan penunjuk MFI untuk menentukan arah trend, pergi panjang pada trend menaik dan pendek pada trend menurun, dengan berkesan mengikuti trend pasaran untuk keuntungan. Walau bagaimanapun, terdapat risiko dalam tetapan parameter, hentikan kerugian / mengambil keuntungan, penurunan berterusan dan lain-lain, yang memerlukan pengoptimuman lebih lanjut pada penyesuaian parameter, mekanisme hentikan kerugian, keadaan penapis dan lain-lain untuk meningkatkan prestasi strategi dan ketahanan. Secara keseluruhan, strategi ini intuitif dan berfungsi dengan baik untuk trend jangka panjang, tetapi kerugian mungkin timbul apabila terperangkap dalam pasaran yang berbeza.


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

// @version=4
// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © Bunghole 2021
strategy(title="Crypto Squeeze Strategy", initial_capital = 100000, default_qty_type = strategy.percent_of_equity, default_qty_value = 100, pyramiding = 0, currency = 'USD', overlay=true)

//// Stoploss and Take Profit Parameters
// Enable Long Strategy
enable_long_strategy = input(true, title="Enable Long Strategy", group="SL/TP For Long Strategy",inline="1")
long_stoploss_value = input(defval=50, title='Stoploss %', type=input.float, minval=0.1, group="SL/TP For Long Strategy",inline="2")
long_stoploss_percentage = (close * (long_stoploss_value / 100)) / syminfo.mintick
long_takeprofit_value = input(defval=50, title='Take Profit %', type=input.float, minval=0.1, group="SL/TP For Long Strategy",inline="2")
long_takeprofit_percentage = (close * (long_takeprofit_value / 100)) / syminfo.mintick

// Enable Short Strategy
enable_short_strategy = input(true, title="Enable Short Strategy", group="SL/TP For Short Strategy",inline="3")
short_stoploss_value = input(defval=50, title='Stoploss %', type=input.float, minval=0.1, group= "SL/TP For Short Strategy",inline="4")
short_stoploss_percentage = (close * (short_stoploss_value / 100)) / syminfo.mintick
short_takeprofit_value = input(defval=50, title='Take Profit %', type=input.float, minval=0.1, group="SL/TP For Short Strategy",inline="4")
short_takeprofit_percentage = (close * (short_takeprofit_value / 100)) / syminfo.mintick

// Plot Stoploss & Take Profit Levels
long_stoploss_price = strategy.position_avg_price * (1 - long_stoploss_value/100)
long_takeprofit_price = strategy.position_avg_price * (1 + long_takeprofit_value/100)
short_stoploss_price = strategy.position_avg_price * (1 + short_stoploss_value/100)
short_takeprofit_price = strategy.position_avg_price * (1 - short_takeprofit_value/100)
plot(enable_long_strategy and not enable_short_strategy ? long_stoploss_price: na, color=#ff0000, style=plot.style_linebr, linewidth=2, title="Long SL Level")
plot(enable_long_strategy and not enable_short_strategy ? long_takeprofit_price: na, color=#008000, style=plot.style_linebr, linewidth=2, title="Long TP Level")
plot(enable_short_strategy and not enable_long_strategy ? short_stoploss_price: na, color=#ff0000, style=plot.style_linebr, linewidth=2, title="Short SL Level")
plot(enable_short_strategy and not enable_long_strategy ? short_takeprofit_price: na, color=#008000, style=plot.style_linebr, linewidth=2, title="Short TP Level")

// Date Range
start_date = input(title="Start Date", type=input.integer, defval=1, minval=1, maxval=31, group="Date Range")
start_month = input(title="Start Month", type=input.integer, defval=1, minval=1, maxval=12, group="Date Range")
start_year = input(title="Start Year", type=input.integer, defval=1804, minval=1800, maxval=3000, group="Date Range")
end_date = input(title="End Date", type=input.integer, defval=1, minval=1, maxval=3, group="Date Range")
end_month = input(title="End Month", type=input.integer, defval=1, minval=1, maxval=12, group="Date Range")
end_year = input(title="End Year", type=input.integer, defval=2077, minval=1800, maxval=3000, group="Date Range")
in_date_range = (time >= timestamp(syminfo.timezone, start_year, start_month, start_date, 0, 0)) and (time < timestamp(syminfo.timezone, end_year, end_month, end_date, 0, 0))


//// Indicator Inputs
// Lazy Bear's Momentum Indicator
BlueWave = linreg(close - avg(avg(highest(high, 20), lowest(low, 20)), sma(close, 20)), 20, 0)

// Replicated version of Crypto Face's MFI Indicator
mfiUpper = sum(volume * (change(hlc3) <= 0 ? 0 : hlc3), 58)
mfiLower = sum(volume * (change(hlc3) >= 0 ? 0 : hlc3), 58)
_mfiRsi(mfiUpper, mfiLower) =>
    if mfiLower == 0
        100
    if mfiUpper == 0
        0
	100.0 - (100.0 / (1.0 + mfiUpper / mfiLower))

mf = _mfiRsi(mfiUpper, mfiLower)
mfi = (mf - 50) * 3


//// Strategy
// Creating Long and Short Strategy
buy_signal = crossover(BlueWave, 0) and mfi > 0 
sell_signal = crossunder(BlueWave, 0) and mfi < 0 

// Long Strategy
if buy_signal and in_date_range and enable_long_strategy == true
    strategy.entry("Long", true, when=buy_signal, alert_message="Open Long Position")
    strategy.exit("Long  SL/TP", from_entry="Long", loss=long_stoploss_percentage, profit=long_takeprofit_percentage, alert_message="Your Long SL/TP Limit As Been Triggered.")
    strategy.close("Long", when=sell_signal, alert_message="Close Long Position")

// Short Strategy
if sell_signal and in_date_range and enable_short_strategy == true
    strategy.entry("Short", false, when = sell_signal, alert_message="Open Short Position")
    strategy.exit("Short SL/TP", from_entry="Short", loss=short_stoploss_percentage, profit=short_takeprofit_percentage, alert_message="Your Short SL/TP Limit As Been Triggered.")
    strategy.close("Short", when=buy_signal, alert_message="Close Short Position")


Lebih lanjut