Indikator Harga Volume Strategi Dagangan Seimbang

Penulis:ChaoZhang, Tarikh: 2023-11-24 14:35:13
Tag:

img

Ringkasan

Strategi ini adalah strategi perdagangan penunjuk harga jumlah pelbagai jangka masa. Ia menggunakan indeks kekuatan relatif (RSI), Julat Benar Purata (ATR), Purata Bergerak Sederhana (SMA) dan keadaan harga jumlah tersuai untuk mengenal pasti isyarat panjang yang berpotensi. Apabila beberapa isyarat jual berlebihan, persilangan harga jumlah, harga pecah dan syarat kemasukan yang lain dipenuhi, strategi ini akan menubuhkan kedudukan panjang. Ia juga menetapkan stop loss dan mengambil tahap keuntungan untuk mengawal nisbah risiko-balasan setiap perdagangan.

Logika Strategi

Titik-titik utama strategi ini ialah:

  1. Apabila RSI berada di bawah tahap oversold dan kekal oversold untuk 10 bar terakhir, ia dianggap sebagai isyarat oversold
  2. Pelbagai set syarat harga jumlah ditakrifkan, dan semua syarat ini perlu dipenuhi pada masa yang sama untuk mencetuskan isyarat panjang penunjuk harga jumlah
  3. Apabila harga penutupan melanggar SMA 13 tempoh, ia dianggap sebagai isyarat harga
  4. Tempoh kecil ATR yang lebih rendah daripada tempoh besar ATR juga menyumbang isyarat panjang
  5. Strategi menggabungkan semua isyarat di atas untuk membuat keputusan masuk panjang akhir

Secara khusus, strategi ini menetapkan parameter panjang dan oversold untuk penunjuk RSI dan mengira nilai RSI berdasarkan parameter ini.

Di samping itu, strategi menentukan 3 ambang jumlah dan menetapkan pelbagai set syarat harga jumlah berdasarkan data dari jangka masa yang berbeza. Sebagai contoh, nilai jumlah 90 tempoh lebih besar daripada 1.5 kali daripada tempoh 49. Apabila semua syarat harga jumlah ini dipenuhi pada masa yang sama, penunjuk harga jumlah menghasilkan isyarat panjang.

Dari segi harga, strategi ini mengira SMA 13 tempoh dan mengira bilangan bar sejak harga memecahkan di atas SMA. Apabila harga memecahkan di atas SMA dan bilangan bar selepas pecah kurang dari 5, ia dianggap sebagai isyarat harga pecah.

Untuk parameter tempoh ATR, strategi ini menentukan tempoh kecil 5 dan tempoh besar 14 untuk ATR. Apabila tempoh kecil ATR lebih rendah daripada tempoh besar ATR, ia menandakan bahawa turun naik pasaran semakin pesat dan menyumbang kepada isyarat panjang.

Akhirnya, strategi itu mengambil kira semua kriteria kemasukan di atas, termasuk penunjuk oversold, harga jumlah, harga pecah dan ATR. Apabila semua syarat ini dipenuhi pada masa yang sama, isyarat panjang akhir dicetuskan dan kedudukan panjang ditubuhkan.

Kelebihan

Strategi ini mempunyai kelebihan berikut:

  1. Penghakiman keadaan harga jumlah pelbagai jangka masa meningkatkan ketepatan. Dengan menilai pelbagai set data harga jumlah dalam jangka masa yang berbeza dan bukannya hanya satu jangka masa, strategi dapat menilai kepekatan jumlah dagangan dengan lebih tepat.

  2. Mekanisme pengesahan tiga kali lipat oversold + harga jumlah + harga pecah memastikan isyarat kemasukan yang boleh dipercayai. Keadaan oversold menyediakan masa asas untuk kemasukan, manakala pengesahan tambahan dari harga jumlah dan penunjuk harga lebih memastikan kebolehpercayaan isyarat panjang.

  3. Mekanisme stop loss and take profit mengawal risiko setiap perdagangan dengan ketat. Parameter stop loss dan take profit boleh diselaraskan berdasarkan selera risiko peribadi untuk memaksimumkan keuntungan sambil mengawal risiko setiap perdagangan dengan munasabah.

  4. Mengintegrasikan beberapa penunjuk meningkatkan ketahanan. walaupun sesetengah penunjuk gagal atau tidak berfungsi dengan baik, strategi masih boleh bergantung pada penunjuk lain untuk penilaian dan memastikan tahap ketahanan tertentu.

Risiko dan Tindakan Balas

Terdapat juga beberapa risiko dengan strategi ini:

  1. Risiko konfigurasi parameter. Tetapan parameter penunjuk secara langsung memberi kesan kepada penilaian, dan parameter yang tidak betul boleh menyebabkan bias dalam isyarat perdagangan. Nilai parameter yang munasabah perlu disahkan dengan teliti.

  2. Potensi keuntungan yang terhad. Sebagai strategi yang mengintegrasikan beberapa penunjuk untuk penilaian kolektif, isyaratnya cenderung lebih konservatif dengan perdagangan yang agak sedikit setiap unit masa, oleh itu potensi keuntungan mempunyai beberapa batasan.

  3. Risiko perbezaan antara penunjuk: Apabila beberapa penunjuk memberikan isyarat panjang sementara yang lain memberikan isyarat pendek, strategi tidak dapat menentukan keputusan yang optimum.

Arahan pengoptimuman

Strategi ini boleh dioptimumkan lagi dalam aspek berikut:

  1. Menggabungkan model pembelajaran mesin untuk membantu penilaian. Model boleh dilatih pada ciri harga dan volatiliti jumlah untuk menyesuaikan parameter yang ditakrifkan secara dinamik.

  2. Meningkatkan kecanggihan strategi mengambil keuntungan, seperti mengambil keuntungan berhenti, mengambil keuntungan separa, dan lain-lain untuk meningkatkan keuntungan setiap perdagangan sambil mengelakkan kerugian keuntungan.

  3. Mengkaji memasukkan data buku pesanan. Sebagai tambahan kepada data carta harga & jumlah, data buku pesanan juga mendedahkan maklumat pembahagian kecairan mendalam untuk memberikan isyarat rujukan tambahan.

  4. Kombinasi ujian dengan penunjuk lain. Strategi ini terutamanya menggunakan penunjuk seperti RSI, ATR dan SMA. Penunjuk lain seperti Bollinger Bands dan KDJ juga boleh digabungkan untuk mempelbagaikan dan mengoptimumkan sumber isyarat perdagangan.

Kesimpulan

Strategi ini menggunakan gabungan penunjuk termasuk RSI, ATR, SMA dan keadaan harga jumlah tersuai untuk mengenal pasti peluang masuk panjang yang berpotensi. Ia mempunyai kelebihan seperti penilaian harga jumlah jangka masa berbilang, mekanisme pengesahan tiga kali dan kawalan risiko stop loss / mengambil keuntungan. Walau bagaimanapun, risiko seperti konfigurasi parameter, potensi keuntungan yang terhad juga perlu diperhatikan. Pada masa akan datang, strategi ini boleh ditingkatkan lagi melalui peningkatan pembelajaran mesin, reka bentuk keuntungan yang lebih canggih, penggabungan data buku pesanan serta kombinasi penunjuk yang diperluaskan.


/*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




Lebih lanjut