Indikator Harga Volume Strategi Perdagangan Seimbang

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

img

Gambaran umum

Strategi ini adalah strategi perdagangan indikator harga volume multi-frame. Strategi ini secara komprehensif memanfaatkan Indeks Kekuatan Relatif (RSI), Rata-rata Rentang Benar (ATR), Rata-rata Bergerak Sederhana (SMA) dan kondisi harga volume kustom untuk mengidentifikasi sinyal panjang potensial. Ketika oversold tertentu, crossover harga volume, price breakout dan kondisi masuk lainnya terpenuhi, strategi ini akan menetapkan posisi panjang.

Logika Strategi

Poin-poin utama dari strategi ini adalah:

  1. Ketika RSI berada di bawah tingkat oversold dan tetap oversold selama 10 bar terakhir, itu dianggap sebagai sinyal oversold
  2. Beberapa set kondisi harga volume didefinisikan, dan semua kondisi ini harus terpenuhi pada saat yang sama untuk memicu sinyal panjang indikator harga volume
  3. Ketika harga penutupan menembus SMA 13 periode, ini dianggap sebagai sinyal price breakout
  4. Periode kecil ATR yang lebih rendah dari periode besar ATR juga merupakan sinyal panjang yang berkontribusi
  5. Strategi menggabungkan semua sinyal di atas untuk membuat keputusan entri panjang akhir

Secara khusus, strategi ini menetapkan parameter panjang dan oversold untuk indikator RSI dan menghitung nilai RSI berdasarkan parameter ini.

Selain itu, strategi mendefinisikan 3 ambang volume dan menetapkan beberapa set kondisi harga volume berdasarkan data dari kerangka waktu yang berbeda. Misalnya, nilai volume periode 90 lebih besar dari 1,5 kali periode 49. Ketika semua kondisi harga volume ini terpenuhi pada saat yang sama, indikator harga volume menghasilkan sinyal panjang.

Pada aspek harga, strategi ini menghitung SMA 13 periode dan menghitung jumlah bar sejak harga pecah di atas SMA. Ketika harga pecah di atas SMA dan jumlah bar setelah pecah kurang dari 5, itu dianggap sebagai sinyal harga pecah.

Untuk parameter periode ATR, strategi ini menentukan periode kecil 5 dan periode besar 14 untuk ATR. Ketika periode kecil ATR lebih rendah dari periode besar ATR, itu menandakan bahwa volatilitas pasar meningkat ke bawah dan berkontribusi pada sinyal panjang.

Akhirnya, strategi memperhitungkan semua kriteria masuk di atas, termasuk indikator oversold, harga volume, price breakout dan ATR. Ketika semua kondisi ini terpenuhi pada saat yang sama, sinyal panjang akhir dipicu dan posisi panjang ditetapkan.

Keuntungan

Strategi ini memiliki keuntungan berikut:

  1. Dengan mengevaluasi beberapa set data harga volume dalam jangka waktu yang berbeda daripada hanya satu jangka waktu, strategi dapat menilai konsentrasi volume perdagangan dengan lebih tepat.

  2. Mekanisme konfirmasi tiga kali lipat oversold + volume price + price breakout memastikan sinyal masuk yang dapat diandalkan. Kondisi oversold menyediakan waktu dasar untuk entri, sementara konfirmasi tambahan dari indikator harga volume dan harga lebih lanjut memastikan keandalan sinyal panjang.

  3. Mekanisme stop loss and take profit secara ketat mengontrol risiko per perdagangan. Parameter stop loss dan take profit dapat disesuaikan berdasarkan selera risiko pribadi untuk memaksimalkan keuntungan sambil secara wajar mengendalikan risiko per perdagangan.

  4. Mengintegrasikan beberapa indikator meningkatkan ketahanan. Bahkan jika beberapa indikator gagal atau tidak berfungsi dengan baik, strategi masih dapat mengandalkan indikator lain untuk penilaian dan memastikan tingkat ketahanan tertentu.

Risiko dan Tindakan Balap

Ada juga beberapa risiko dengan strategi ini:

  1. Risiko konfigurasi parameter. Pengaturan parameter indikator secara langsung mempengaruhi penilaian, dan parameter yang tidak tepat dapat menyebabkan bias dalam sinyal perdagangan. Nilai parameter yang wajar perlu divalidasi dengan hati-hati.

  2. Potensi keuntungan terbatas. Sebagai strategi yang mengintegrasikan beberapa indikator untuk penilaian kolektif, sinyalnya cenderung lebih konservatif dengan perdagangan yang relatif lebih sedikit per satuan waktu, sehingga potensi keuntungan memiliki beberapa batasan.

  3. Risiko divergensi indikator. Ketika beberapa indikator memberikan sinyal panjang sementara yang lain memberikan sinyal pendek, strategi tidak dapat menentukan keputusan yang optimal. Potensi divergensi tersebut antara indikator perlu diidentifikasi dan diselesaikan sebelumnya.

Arahan Optimasi

Strategi ini dapat dioptimalkan lebih lanjut dalam aspek berikut:

  1. Mengintegrasikan model pembelajaran mesin untuk membantu penilaian. Model dapat dilatih pada volume harga dan volatilitas fitur untuk secara dinamis menyesuaikan parameter yang didefinisikan secara manual.

  2. Meningkatkan kecanggihan strategi mengambil keuntungan, seperti trailing stop take profit, partial take profit, dll untuk meningkatkan keuntungan per perdagangan sambil mencegah kerugian keuntungan.

  3. Evaluasi menggabungkan data buku pesanan. Selain data grafik harga & volume, data buku pesanan juga mengungkapkan informasi distribusi likuiditas yang mendalam untuk memberikan sinyal referensi tambahan.

  4. Kombinasi tes dengan indikator lain. Strategi ini terutama memanfaatkan indikator seperti RSI, ATR dan SMA. Indikator lain seperti Bollinger Bands dan KDJ juga dapat dikombinasikan untuk mendiversifikasi dan mengoptimalkan sumber sinyal perdagangan.

Kesimpulan

Strategi ini memanfaatkan kombinasi indikator termasuk RSI, ATR, SMA dan kondisi harga volume kustom untuk mengidentifikasi peluang masuk panjang potensial. Ini memiliki keuntungan seperti evaluasi harga volume multi-frame timeframe, mekanisme konfirmasi tiga kali dan kontrol risiko stop loss / take profit. Namun, risiko seperti konfigurasi parameter, potensi keuntungan terbatas juga perlu dicatat. Di masa depan, strategi ini dapat ditingkatkan lebih lanjut melalui peningkatan pembelajaran mesin, desain profit take yang lebih canggih, penggabungan data buku pesanan serta kombinasi indikator yang diperluas.


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