Strategi ini adalah strategi perdagangan indikator kuantitatif dalam jangka masa yang pelbagai. Ia menggunakan indeks kekuatan relatif lemah (RSI), purata gelombang sebenar (ATR), purata bergerak sederhana (SMA), dan syarat kuantitatif yang disesuaikan untuk mengenal pasti isyarat perdagangan yang berpotensi.
Strategi ini adalah berdasarkan kepada beberapa perkara utama:
Khususnya, strategi ini menetapkan parameter panjang dan garis oversold untuk penunjuk RSI, dan berdasarkan parameter ini, nilai RSI dikira. Apabila penunjuk RSI menghasilkan isyarat oversold apabila terdapat beberapa garis K berturut-turut di bawah garis oversold.
Di samping itu, strategi ini mentakrifkan 3 nilai terhad bagi jumlah transaksi, dengan menetapkan pelbagai set syarat kuantiti berdasarkan data untuk tempoh masa yang berbeza. Sebagai contoh, nilai kuantiti 90 kitaran lebih besar daripada 1.5 kali nilai kuantiti 49 kitaran. Apabila syarat-syarat kuantiti ini dipenuhi pada masa yang sama, isyarat melakukan lebih banyak indikator kuantiti dikeluarkan.
Dari segi harga, strategi ini mengira indikator SMA 13 kitaran dan mengkaji jumlah garis K yang telah diletakkan oleh harga ke atas sejak ia menembusi SMA. Apabila harga menembusi SMA dari bawah ke atas dan jumlah garis K yang telah diletakkan selepas penembusan kurang dari 5 buah, ia dianggap sebagai isyarat harga yang pecah.
Dari segi parameter kitaran ATR, strategi ini menetapkan ATR untuk kitaran kecil 5 dan kitaran besar 14. Apabila ATR kitaran kecil lebih rendah daripada ATR kitaran besar, ini menunjukkan peningkatan pergerakan pasaran yang semakin berkurangan, sebagai isyarat melakukan lebih banyak.
Akhirnya, strategi ini secara menyeluruh mempertimbangkan beberapa syarat pembelian di atas, termasuk oversold, indikator harga kuantitatif, penembusan harga dan indikator ATR. Apabila syarat-syarat ini dipenuhi pada masa yang sama, menghasilkan isyarat melakukan lebih banyak akhir, dan membina melakukan lebih banyak kedudukan.
Strategi ini mempunyai beberapa kelebihan:
Penghakiman indikator harga kuantitatif pelbagai bingkai masa, meningkatkan ketepatan. Strategi tidak hanya mempertimbangkan data harga kuantitatif untuk satu tempoh, tetapi menilai persilangan pelbagai keadaan harga kuantitatif untuk tempoh yang berbeza, yang dapat menentukan kepekatan kuantitatif dengan lebih tepat.
Mekanisme penilaian tiga kali ganda jual lebihan + kuantiti + harga, memastikan kebolehpercayaan isyarat pembelian. Jualan lebihan menyediakan pemilihan masa pembelian yang paling asas, selain itu, penyambungan indikator kuantiti dan harga menambah pengesahan tambahan untuk masa pembelian, kebolehpercayaan yang lebih tinggi.
Tetapkan mekanisme hentian hentian untuk mengawal risiko perdagangan tunggal dengan ketat. Parameter hentian dan hentian boleh disesuaikan dengan pilihan risiko individu, mengawal risiko setiap unit dengan munasabah sambil memaksimumkan keuntungan.
Keputusan bersepadu berbilang indikator meningkatkan kelenturan. Walaupun beberapa indikator gagal atau salah, penilaian indikator lain masih dapat diandalkan untuk memastikan keupayaan operasi yang berterusan.
Strategi ini mempunyai beberapa risiko:
Pengaturan parameter risiko. Pengaturan parameter pelbagai jenis penunjuk mempengaruhi keputusan keputusan secara langsung. Parameter yang tidak munasabah boleh menyebabkan isyarat perdagangan menjadi menyimpang.
Ruang keuntungan terhad. Sebagai strategi untuk menggabungkan beberapa petunjuk untuk membuat keputusan bersepadu, frekuensi penjanaan isyarat adalah lebih konservatif, jumlah transaksi yang lebih sedikit dalam satu unit masa, ruang keuntungan mempunyai batasan tertentu.
Risiko penyebaran penunjuk. Apabila beberapa penunjuk menghantar isyarat melakukan lebih dan beberapa penunjuk lain menghantar isyarat tidak, strategi tidak dapat menentukan keputusan yang optimum. Ini memerlukan pengenalan dan penyelesaian kemungkinan penyebaran antara penunjuk terlebih dahulu.
Strategi ini boleh dioptimumkan dengan lebih lanjut dalam beberapa aspek:
Menambah penilaian pembantu model pembelajaran mesin. Ia boleh melatih model harga kuantiti dan ciri-ciri fluktuasi, membantu parameter yang ditetapkan oleh tangan, dan mewujudkan dinamika parameter.
Meningkatkan kematangan strategi penangguhan. Sebagai contoh, penangguhan terapung, penangguhan berbantalan, penangguhan pengesanan, dan lain-lain dapat meningkatkan pendapatan setiap unit dengan mengelakkan kejatuhan.
Penilaian data bukaan yang diperkenalkan. Selain data harga K-line, data bukaan beli dan jual yang mendalam juga dapat menilai penyebaran pegangan dan memberikan isyarat rujukan tambahan.
Uji integrasi indikator lain. Strategi ini menggunakan indikator seperti RSI, ATR dan SMA untuk integrasi, tetapi anda juga boleh mencuba memperkenalkan kombinasi indikator lain seperti Brinline, KDJ dan lain-lain untuk memperkaya dan mengoptimumkan sumber isyarat perdagangan.
Strategi ini menggunakan RSI, ATR, SMA dan penilaian syarat harga tersuai untuk mengenal pasti peluang yang berpotensi. Ia juga mempunyai kelebihan seperti penilaian indikator harga kuantiti bingkai masa, mekanisme pengesahan isyarat tiga dan risiko kawalan hentian berhenti. Sudah tentu, anda juga perlu memperhatikan risiko konfigurasi parameter, batasan ruang keuntungan.
/*backtest
start: 2023-10-24 00:00:00
end: 2023-11-23 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
// © Kimply_Tr
//@version=5
// Strategy settings and parameters
strategy(title='Volume ValueWhen Velocity', overlay=true)
// Define the stop-loss and take-profit percentages for the long strategy
long_stoploss_value = input.float(defval=3, title='Stop-Loss (SL) %', minval=0, group='▶ Stop Loss/Take Profit => Long-Strategy', inline='2')
long_stoploss_percentage = close * (long_stoploss_value / 100) / syminfo.mintick // Calculate long stop-loss percentage
long_takeprofit_value = input.float(defval=2, title='Take-Profit (TP) %', minval=0, group='▶ Stop Loss/Take Profit => Long-Strategy', inline='2')
long_takeprofit_percentage = close * (long_takeprofit_value / 100) / syminfo.mintick // Calculate long take-profit percentage
// Define parameters related to ValueWhen occurrences
occurrence_ValueWhen_1 = input.int(title='occurrence_ValueWhen_1', defval=1, maxval=100, step=1, group="▶ ValueWhen",tooltip ="Its value must be smaller than (occurrence_ValueWhen_2)")
occurrence_ValueWhen_2 = input.int(title='occurrence_ValueWhen_2', defval=5, maxval=100, step=1, group="▶ ValueWhen" ,tooltip="Its value must be greater than (occurrence_ValueWhen_1)")
distance_value=input.int(title='distance_value_occurrence', defval=170, maxval=5000, step=1, group="▶ ValueWhen" ,tooltip="It indicates the minimum distance between the occurrences of 1 and 2, i.e. the difference between the occurrences of 1 and 2 is greater than (distance_value_occurrence)")
// Define RSI-related parameters
rsi_over_sold = input.int(defval=60, minval=1, title='Oversold Level', group='▶ RSI',inline ='2') // Input for oversold level in RSI
rsi_length = input.int(defval=40, minval=1, title='RSI Length', group='▶ RSI',inline ='2') // Input for RSI length
rsi = ta.rsi(close, rsi_length) // Calculate RSI
// Define volume thresholds
volume_threshold1 = input.float(title='volume_threshold_1', defval=0.5, maxval=10, step=0.1, group="▶ Volume")
volume_threshold2 = input.float(title='volume_threshold_2', defval=0.4, maxval=10, step=0.1, group="▶ Volume")
volume_threshold3 = input.float(title='volume_threshold_3', defval=0.62, maxval=10, step=0.1, group="▶ Volume")
// ATR (Average True Range)
// Define ATR parameters
atr_small = input.int(title='ATR_Small', defval=5, maxval=500, step=1, group="▶ Atr",inline ='2')
atr_big = input.int(title='ATR_Big ', defval=14, maxval=500, step=1, group="▶ Atr",inline ='2')
atr_value3 = ta.atr(15) // Calculate ATR value 3
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Date Range
// Define the date range for back-testing
start_date = input.int(title='Start Day', defval=1, minval=1, maxval=31, group='▶ Time-Period for Back-Testing', inline='1') // Input for start day
end_date = input.int(title='until Day', defval=1, minval=1, maxval=31, group='▶ Time-Period for Back-Testing', inline='1') // Input for end day
start_month = input.int(title='Start Month', defval=7, minval=1, maxval=12, group='▶ Time-Period for Back-Testing', inline='2') // Input for start month
end_month = input.int(title='until Month', defval=1, minval=1, maxval=12, group='▶ Time-Period for Back-Testing', inline='2') // Input for end month
start_year = input.int(title='Start Year', defval=2022, minval=1800, maxval=3000, group='▶ Time-Period for Back-Testing', inline='3') // Input for start year
end_year = input.int(title='until Year', defval=2077, minval=1800, maxval=3000, group='▶ Time-Period for Back-Testing', inline='3') // Input for end year
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) // Check if the current time is within the specified date range
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
was_over_sold = ta.barssince(rsi <= rsi_over_sold) <= 10 // Check if RSI was oversold in the last 10 bars
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
getVolume(symbol, bar) =>
request.security(syminfo.tickerid, "D", volume)[bar] // Function to get volume data for a specific symbol and bar
getVolume2(symbol, bar) =>
request.security(syminfo.tickerid, "39", volume)[bar] // Function to get volume data for a specific symbol and bar 2
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
firstCandleColor1 = request.security(syminfo.tickerid, "D", close[2] > open[1] ? 1 : 0)
firstCandleColor2 = request.security(syminfo.tickerid, "1", close[2] > open[0] ? 1 : 0)
firstCandleColor3 = request.security(syminfo.tickerid, "W", close[1] > open[1] ? 1 : 0)
firstCandleColor= ((firstCandleColor1+firstCandleColor2)) > firstCandleColor3 ? 1 : 0
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
sma = ta.sma(close, 13) // Calculate the simple moving average (SMA) of the close price over 13 periods
numCandles = ta.barssince(close > sma) // Count the number of candles since the close price crossed above the SMA
atr1=request.security(syminfo.tickerid, "30", ta.atr(atr_small)<ta.atr(atr_big)) // Get the ATR value for the specific security and timeframe (30 minutes) and check if ATR_small is less than ATR_big
prevClose = ta.valuewhen(close > sma, close, occurrence_ValueWhen_1) // Get the close price when it first crosses above the SMA based on occurrence_ValueWhen_1
prevCloseBarsAgo = ta.valuewhen(close > sma, close, occurrence_ValueWhen_2) // Get the close price when it first crosses above the SMA based on occurrence_ValueWhen_2
prevCloseChange = (prevCloseBarsAgo - prevClose ) // Calculate the change in the close price between the occurrences of crossing above the SMA
atrval=(atr_value3>140) or (atr_value3 < 123) // Check if atr_value3 is either greater than 140 or less than 123
Condition = getVolume(syminfo.tickerid, 90) > volume_threshold1 * getVolume(syminfo.tickerid, 49) and getVolume(syminfo.tickerid, 110) > volume_threshold3 * getVolume(syminfo.tickerid, 49) and getVolume2(syminfo.tickerid, 30) > volume_threshold2 * getVolume2(syminfo.tickerid, 55) and getVolume2(syminfo.tickerid, 7) > volume_threshold2 * getVolume2(syminfo.tickerid, 3) // Check multiple volume conditions
buy_signal=Condition and atrval and firstCandleColor==0 and was_over_sold and prevCloseChange> distance_value and atr1 and numCandles<5 // Determine if the buy signal is generated based on various conditions
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Long Strategy
// Enter long position if the buy signal conditions are met and within the specified date range
if buy_signal and in_date_range
strategy.entry('Long', strategy.long, alert_message='Open Long Position') // Enter long position
strategy.exit('Long SL/TP', from_entry='Long', loss=long_stoploss_percentage, profit=long_takeprofit_percentage, alert_message='Your SL/TP-Limit for the Long-Strategy has been activated.') // Exit long position with stop-loss and take-profit