Strategi Dagangan Kuantitatif Berbilang Jangka Masa Berdasarkan PSAR, MACD dan RSI

Penulis:ChaoZhang, Tarikh: 2023-12-27 16:12:57
Tag:

img

Ringkasan

Strategi ini menggabungkan indikator Parabolic SAR, MACD dan RSI untuk melaksanakan perdagangan panjang dan pendek automatik di pelbagai jangka masa.

Prinsip Strategi

  1. Indikator PSAR digunakan untuk menentukan arah harga dan titik pembalikan trend. Titik jatuh adalah isyarat bullish manakala titik naik adalah isyarat bearish.

  2. Indikator MACD menilai momentum harga. Garis MACD yang melintasi di atas garis SIGNAL ke atas adalah isyarat bullish manakala melintasi ke bawah adalah bearish.

  3. Indikator RSI menilai keadaan overbought dan oversold. RSI di atas ambang adalah bullish manakala di bawahnya adalah bearish.

  4. Gabungkan isyarat dari tiga penunjuk di atas untuk membentuk keputusan akhir panjang/pendek.

  5. Adaptif menggunakan indikator Indeks Chop untuk menapis pasaran yang mengumpul untuk mengelakkan whipsaws.

  6. Gunakan saiz kedudukan piramida terbalik untuk menguruskan sasaran risiko dan keuntungan secara dinamik.

Kelebihan

  1. Gabungan pelbagai penunjuk menilai trend, momentum dan osilator meningkatkan ketepatan.

  2. Sesuaikan dengan keadaan pasaran dengan menapis pasaran konsolidasi untuk mengelakkan terperangkap dalam perangkap.

  3. Pengurusan risiko dan keuntungan yang dinamik melalui pengukuran kedudukan piramida terbalik dengan hentian dan had adaptif.

  4. Sangat boleh disesuaikan dengan parameter yang boleh disesuaikan untuk produk dan persekitaran pasaran yang berbeza.

  5. Sokong pelbagai jangka masa, fleksibel untuk perdagangan posisi intraday jangka pendek atau jangka menengah / panjang.

Analisis Risiko

  1. Keputusan panjang / pendek bergantung kepada tetapan parameter yang boleh menyebabkan kesilapan jika tidak sesuai.

  2. Kemungkinan isyarat palsu yang membawa kepada keputusan terhadap trend.

  3. Tetapan stop loss dan mengambil keuntungan yang tidak sesuai boleh meningkatkan kerugian atau mengurangkan keuntungan.

  4. Menghendaki pemantauan yang kerap dan penyesuaian parameter yang mengakibatkan kos intervensi manusia yang tinggi.

Arahan pengoptimuman

  1. Tambah modul pengesahan model untuk menilai tetapan parameter dan keberkesanan isyarat.

  2. Meningkatkan modul pembelajaran mesin untuk parameter automatik dan pengoptimuman model.

  3. Mengonsumsi lebih banyak sumber data untuk memperkaya ruang ciri dan meningkatkan keputusan.

  4. Membangunkan sistem pemantauan dan penyelenggaraan automatik untuk mengurangkan campur tangan manusia.

  5. Tambah penilaian backtesting dan simulasi untuk mengesahkan prestasi strategi.

Kesimpulan

Strategi ini merealisasikan perdagangan kuantitatif automatik dengan menggabungkan beberapa penunjuk teknikal sistem berasaskan peraturan. Dengan ruang pengoptimuman yang besar dan fleksibiliti, ia sesuai untuk penyesuaian parameter, pengembangan ciri dan peningkatan pembelajaran mesin untuk lebih baik melayani perdagangan langsung.


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

// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © vikris

//@version=4
strategy("[VJ]Phoenix Force of PSAR +MACD +RSI", overlay=true, calc_on_every_tick = false,pyramiding=0)

// ********** Strategy inputs - Start **********

// Used for intraday handling
// Session value should be from market start to the time you want to square-off 
// your intraday strategy
// Important: The end time should be at least 2 minutes before the intraday
// square-off time set by your broker
var i_marketSession = input(title="Market session", type=input.session, 
     defval="0915-1455", confirm=true)

// Make inputs that set the take profit % (optional)
longProfitPerc = input(title="Long Take Profit (%)",
     type=input.float, minval=0.0, step=0.1, defval=3) * 0.01

shortProfitPerc = input(title="Short Take Profit (%)",
     type=input.float, minval=0.0, step=0.1, defval=3) * 0.01
     
// Set stop loss level with input options (optional)
longLossPerc = input(title="Long Stop Loss (%)",
     type=input.float, minval=0.0, step=0.1, defval=3) * 0.01

shortLossPerc = input(title="Short Stop Loss (%)",
     type=input.float, minval=0.0, step=0.1, defval=3) * 0.01    


// ********** Strategy inputs - End **********


// ********** Supporting functions - Start **********

// A function to check whether the bar or period is in intraday session
barInSession(sess) => time(timeframe.period, sess) != 0



// Figure out take profit price
longExitPrice  = strategy.position_avg_price * (1 + longProfitPerc)
shortExitPrice = strategy.position_avg_price * (1 - shortProfitPerc)

// Determine stop loss price
longStopPrice  = strategy.position_avg_price * (1 - longLossPerc)
shortStopPrice = strategy.position_avg_price * (1 + shortLossPerc)


// ********** Supporting functions - End **********


// ********** Strategy - Start **********
// See if intraday session is active
bool intradaySession = barInSession(i_marketSession)

// Trade only if intraday session is active

//=================Strategy logic goes in here===========================
 
psar = sar(0.02,0.02,0.2)
c1a = close > psar
c1v = close < psar

malen = input(50, title="MA Length")
mm200 = sma(close, malen)
c2a = close > mm200
c2v = close < mm200

fast = input(12, title="MACD Fast EMA Length")
slow = input(26, title="MACD Slow EMA Length")
[macd,signal,hist] = macd(close, fast,slow, 9)
c3a = macd >= 0
c3v = macd <= 0

rsilen = input(7, title="RSI Length")
th = input(50, title="RSI Threshold")
rsi14 = rsi(close, rsilen)
c4a = rsi14 >= th
c4v = rsi14 <= th

chopi = input(7, title="Chop Index lenght")
ci = 100 * log10(sum(atr(1), chopi) / (highest(chopi) - lowest(chopi))) / log10(chopi)

buy = c1a and c2a and c3a and c4a ? 1 : 0
sell = c1v and c2v and c3v and c4v ? -1 : 0


//Final Long/Short Condition
longCondition = buy==1 and ci <50
shortCondition = sell==-1 and ci <50 
 
//Long Strategy - buy condition and exits with Take profit and SL
if (longCondition and intradaySession)
    stop_level = longStopPrice
    profit_level = longExitPrice
    strategy.entry("My Long Entry Id", strategy.long)
    strategy.exit("TP/SL", "My Long Entry Id", stop=stop_level, limit=profit_level)


//Short Strategy - sell condition and exits with Take profit and SL
if (shortCondition and intradaySession)
    stop_level = shortStopPrice
    profit_level = shortExitPrice
    strategy.entry("My Short Entry Id", strategy.short)
    strategy.exit("TP/SL", "My Short Entry Id", stop=stop_level, limit=profit_level)
 
 
// Square-off position (when session is over and position is open)
squareOff = (not intradaySession) and (strategy.position_size != 0)
strategy.close_all(when = squareOff, comment = "Square-off")

// ********** Strategy - End **********

Lebih lanjut