
Strategi ini adalah strategi perdagangan indikator kuantitatif dalam beberapa kerangka waktu. Strategi ini menggunakan indeks relative strength (RSI), rata-rata true range (ATR), rata-rata bergerak sederhana (SMA), dan kondisi kuantitatif yang disesuaikan untuk mengidentifikasi sinyal perdagangan potensial. Strategi ini akan membangun perdagangan ketika memenuhi kondisi tertentu, seperti oversold, crossover indikator kuantitatif, atau harga terobosan.
Strategi ini didasarkan pada beberapa poin penting:
Secara khusus, strategi ini menetapkan parameter panjang dan oversold pada indikator RSI, dan berdasarkan parameter ini, nilai RSI dihitung. Sinyal oversold dihasilkan ketika indikator RSI berturut-turut lebih dari satu garis K di bawah garis oversold.
Selain itu, strategi ini mendefinisikan tiga nilai terendah volume transaksi dan menetapkan beberapa set kondisi volume berdasarkan data dari periode waktu yang berbeda. Misalnya, nilai 90 siklus lebih besar dari 1,5 kali nilai 49 siklus.
Dalam hal harga, strategi ini menghitung indikator SMA 13 siklus dan menghitung jumlah garis K yang telah terjadi sejak harga naik melewati SMA. Bila harga naik melewati SMA dari bawah dan jumlah garis K yang ada di bawahnya adalah kurang dari 5 garis, maka dianggap sebagai sinyal harga yang pecah.
Dalam hal parameter ATR siklus, strategi ini menentukan ATR untuk siklus kecil 5 dan siklus besar 14. Ketika ATR siklus kecil lebih rendah dari ATR siklus besar, ini menunjukkan akselerasi pasar yang berkurang, sebagai sinyal yang didorong.
Akhirnya, strategi ini secara komprehensif mempertimbangkan beberapa kondisi pembelian di atas, termasuk oversold, metric, price breakout, dan ATR. Ketika kondisi-kondisi ini terpenuhi secara bersamaan, menghasilkan sinyal do-plus akhir dan membangun posisi do-plus.
Strategi ini memiliki beberapa keuntungan:
Strategi tidak hanya mempertimbangkan data kuantitatif dari satu periode, tetapi juga mengevaluasi persilangan dari beberapa kelompok kondisi kuantitatif dari periode yang berbeda, yang dapat lebih tepat menilai konsentrasi kuantitatif.
Overbought + volume + harga mekanisme penilaian tiga kali lipat, memastikan keandalan sinyal beli. Overbought menyediakan yang paling dasar untuk memilih saat membeli, selain itu, crossover antara indikator volume dan harga menambahkan konfirmasi tambahan untuk saat membeli, keandalan yang lebih tinggi.
Setting stop loss and stop loss mechanism strictly controls the risk of a single trade. Stop loss and stop loss parameter dapat disesuaikan dengan preferensi risiko pribadi, dengan tujuan untuk memaksimalkan keuntungan dan juga secara rasional mengendalikan risiko per unit.
Multi-indikator integrasi penilaian meningkatkan fleksibilitas. Bahkan jika beberapa indikator mengalami kerusakan atau kesalahan, penilaian indikator lainnya dapat diandalkan untuk menjamin kemampuan operasi berkelanjutan tertentu.
Strategi ini juga memiliki beberapa risiko:
Risiko konfigurasi parameter. Pengaturan parameter dari berbagai indikator secara langsung mempengaruhi hasil penilaian, parameter yang tidak masuk akal dapat menyebabkan sinyal perdagangan menyimpang.
Ruang keuntungan terbatas. Sebagai strategi untuk menggabungkan beberapa indikator untuk penilaian terpadu, frekuensi sinyal yang dihasilkan relatif lebih konservatif, jumlah transaksi yang lebih sedikit per satuan waktu, ruang keuntungan ada batasan tertentu.
Risiko penyebaran indikator. Strategi tidak dapat menentukan keputusan yang optimal ketika beberapa indikator mengirimkan sinyal multipel dan indikator lain mengirimkan sinyal kosong. Ini memerlukan identifikasi dan penanganan kemungkinan penyebaran antar indikator di muka.
Strategi ini dapat dioptimalkan lebih lanjut dari beberapa aspek berikut:
Menambahkan penilaian tambahan pada model pembelajaran mesin. Model harga kuantitatif dan karakteristik fluktuasi dapat dilatih, membantu parameter yang ditetapkan secara manual, dan memungkinkan dinamika parameter.
Tingkatkan kematangan strategi stop loss. Misalnya, Anda dapat mengatur floating stop loss, batch stop loss, tracking stop loss, dan lain-lain. Dengan demikian, Anda dapat meningkatkan pendapatan per unit Anda dengan lebih lanjut sambil mencegah jatuh tempo.
Evaluasi data yang diperkenalkan. Selain data harga K-line, data yang digabungkan dengan deep buy and sell juga dapat menilai distribusi posisi yang dipegang, yang dapat memberikan sinyal referensi tambahan.
Strategi ini menggunakan indikator RSI, ATR, dan SMA untuk integrasi, tetapi juga dapat mencoba untuk memperkenalkan kombinasi indikator lain, seperti Brinline, dan KDJ, untuk memperkaya dan mengoptimalkan sumber sinyal perdagangan.
Strategi ini secara komprehensif menggunakan RSI, ATR, SMA dan penilaian kondisi harga kustom untuk mengidentifikasi peluang potensial untuk melakukan lebih banyak waktu. Ini juga memiliki keuntungan seperti penilaian indikator harga kuantitas kerangka waktu, mekanisme konfirmasi sinyal tiga, dan risiko kontrol stop loss. Tentu saja, Anda juga perlu memperhatikan masalah seperti 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