Strategi perdagangan kuantitatif K-line berosilasi


Tanggal Pembuatan: 2023-09-26 20:05:55 Akhirnya memodifikasi: 2023-09-26 20:05:55
menyalin: 0 Jumlah klik: 727
1
fokus pada
1621
Pengikut

Ringkasan

Strategi ini adalah strategi dinamis berbasis indikator, menggunakan indikator oscillator seperti RSI, Stoch, MACD untuk membangun sinyal perdagangan strategi. Gagasan utama strategi ini adalah menggunakan indikator untuk mengidentifikasi arah tren ketika harga bergoyang, dan masuk berdasarkan sinyal indikator.

Prinsip Strategi

Strategi ini pertama-tama memanggil fungsi khusus f_getOscilatorValues untuk mendapatkan nilai dari berbagai indikator oscillators, termasuk RSI, Stoch, MACD, dll. Kemudian, dengan fungsi f_getSupertrend untuk menghitung nilai dari indikator overtrend yang tertunda, digunakan untuk melacak stop loss.

Setelah menghitung indikator, strategi akan memanggil fungsi f_getBuySellStops, yang akan menghitung entry stop loss dan stop loss berdasarkan nilai indikator. Secara khusus, ia akan menghitung indikator ATR, dan menggunakan ATR dikalikan dengan koefisien stop loss sebagai entry stop loss, dengan ATR dikalikan dengan koefisien stop loss sebagai stop loss.

Strategi kemudian menilai arah entitas dari garis K. Jika garis K naik, garis K digambar dengan warna hijau, dan garis K turun digambar dengan warna merah. Setelah garis K dan indikator digambar, strategi menilai apakah memenuhi persyaratan masuk.

Setelah masuk, stop loss akan dilacak, dan stop loss yang dilacak adalah uptrend atau downtrend, whichever is closer. Ketika stop loss dipicu, maka posisi akan dipadamkan.

Analisis Keunggulan Strategi

Strategi ini memiliki keuntungan sebagai berikut:

  1. Menggunakan indikator osilator untuk mengidentifikasi arah tren, dapat menangkap peluang pembalikan garis pendek pasar tepat waktu.

  2. Menggunakan strategi penundaan overtrend stop loss, Anda dapat menghentikan kerugian sebelum kerugian berkembang, membatasi kerugian tunggal.

  3. Stop loss dan stop loss dapat disesuaikan secara dinamis dengan ukuran posisi berdasarkan ATR yang dihitung untuk mengukur risiko.

  4. Filter dengan garis rata-rata siklus tinggi, untuk menghindari kebocoran.

  5. Strategi untuk menghentikan sebagian dari keuntungan, untuk terus berjalan dan mengunci sebagian dari keuntungan.

  6. Strategi yang sederhana dan mudah dipahami, cocok untuk pemula dalam trading kuantitatif.

Analisis Risiko Strategi

Strategi ini juga memiliki beberapa risiko:

  1. Indikator oscillators memiliki masalah lag, yang dapat menyebabkan keterlambatan sinyal masuk, sinyal keluar lebih awal. Dapat dioptimalkan dengan menyesuaikan parameter indikator, atau menambahkan penilaian tambahan indikator trend following.

  2. Stop loss mendekati titik, dan mungkin akan dihentikan dengan penembusan. Anda dapat melebarkan jangkauan stop loss dengan tepat, atau menggunakan strategi stop loss dinamis seperti Chandelier Stop.

  3. Setelah berhenti parsial, posisi yang tersisa mungkin akan dihentikan. Anda dapat mengurangi rasio berhenti parsial, meninggalkan ruang.

  4. Risiko pencocokan data retrospektif. Harus diverifikasi berkali-kali di berbagai pasar, untuk menghindari overcocokan.

  5. Garis rata-rata siklus tinggi juga dapat gagal sebagai kondisi penyaringan. Metode seperti klasifikasi tren harus digunakan untuk membantu menentukan pergerakan siklus besar.

Arah optimasi strategi

Strategi ini dapat dioptimalkan dalam beberapa hal:

  1. Uji kombinasi parameter dari indikator oscillator yang berbeda, pilih kombinasi yang dapat memberikan sinyal kualitas yang lebih baik, seperti indikator Sttoch dari garis K cepat.

  2. Cobalah mengubah sebagian stop menjadi stop bergerak, dengan posisi stop berdasarkan ATR atau moving average.

  3. Algoritma pembelajaran mesin ditambahkan untuk menilai tren siklus besar, menggantikan filter linier rata-rata siklus tinggi, meningkatkan akurasi penilaian.

  4. Meningkatkan indikator energi sebagai syarat penyaringan masuk untuk menghindari perdagangan yang tidak perlu.

  5. Untuk mengintegrasikan dan mengoptimalkan bobot indikator, pilih kombinasi indikator yang paling sesuai dengan varietas saat ini.

  6. Menambahkan modul kontrol angin pembelajaran mesin, dan mengoptimalkan posisi stop loss, stop loss, posisi, dan lainnya secara dinamis.

  7. Menambahkan trigger atau futures trading signal untuk mengambil keuntungan dari perbedaan harga antara futures dan spot.

Meringkaskan

Strategi ini secara keseluruhan adalah strategi yang sangat cocok untuk belajar pemula dalam perdagangan kuantitatif, dengan pemikiran yang jelas, dan poin-poin kunci yang didasarkan pada analisis indikator dan pengendalian risiko. Namun, masih perlu untuk melakukan optimasi parameter dan penghindaran risiko untuk real-time, agar dapat memperoleh keuntungan yang stabil. Selain itu, dapat meningkatkan strategi dari aspek penilaian tren, pengoptimalan stop loss, dan pembelajaran terintegrasi, yang membuat strategi lebih kasar. Secara keseluruhan, strategi ini sangat berharga sebagai model strategi yang dapat dijalankan dengan optimasi.

Kode Sumber Strategi
/*backtest
start: 2023-08-26 00:00:00
end: 2023-09-25 00:00:00
period: 1h
basePeriod: 15m
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/
// © HeWhoMustNotBeNamed

//@version=4
strategy("Oscilator candles - strategy", overlay=false, initial_capital = 1000, default_qty_type = strategy.percent_of_equity, default_qty_value = 100, commission_type = strategy.commission.percent, pyramiding = 1, commission_value = 0.01, calc_on_order_fills = true)

oscilatorType = input(title="Oscliator Type", defval="stoch", options=["rsi", "stoch", "cog", "macd", "tsi", "cci", "cmo", "mfi"])
length = input(3)
shortlength = input(3)
longlength = input(9)

showSupertrend = input(true)
AtrMAType = input(title="Moving Average Type", defval="rma", options=["ema", "sma", "hma", "rma", "vwma", "wma"])
AtrLength = input(30, step=10)
stopMultiplier  = input(4)
targetMultiplier  = input(3)
wicks = input(true)
considerWicksForDelayByStep = input(false)
colorByPreviousClose = input(true)

useHTFPivot = input(false)
resolution = input("12M", type=input.resolution)
HTFMultiplier = input(4, title="Higher Timeframe multiplier (Used when resolution is set to Same as Symbol)", minval=2, step=1)
PivotLength = input(2, step=1)

tradeDirection = input(title="Trade Direction", defval=strategy.direction.long, options=[strategy.direction.all, strategy.direction.long, strategy.direction.short])
i_startTime = input(defval = timestamp("01 Jan 2010 00:00 +0000"), title = "Backtest Start Time", type = input.time)
i_endTime = input(defval = timestamp("01 Jan 2099 00:00 +0000"), title = "Backtest End Time", type = input.time)
inDateRange = true

f_getOscilatorValues(oscilatorType, length, shortlength, longlength)=>
    oOpen = rsi(open, length)
    oClose = rsi(close, length)
    oHigh = rsi(high, length)
    oLow = rsi(low, length)
    if(oscilatorType == "tsi")
        oOpen := tsi(open, shortlength, longlength)
        oClose := tsi(close, shortlength, longlength)
        oHigh := tsi(high, shortlength, longlength)
        oLow := tsi(low, shortlength, longlength)
    if(oscilatorType == "stoch")
        oOpen := stoch(open, longlength, shortlength, length)
        oClose := stoch(close, longlength, shortlength, length)
        oHigh := stoch(high, longlength, shortlength, length)
        oLow := stoch(low, longlength, shortlength, length)
    if(oscilatorType == "cci")
        oOpen := cci(open, length)
        oClose := cci(close, length)
        oHigh := cci(high, length)
        oLow := cci(low, length)
    if(oscilatorType == "cog")
        oOpen := cog(open, length)
        oClose := cog(close, length)
        oHigh := cog(high, length)
        oLow := cog(low, length)
    if(oscilatorType == "cmo")
        oOpen := cmo(open, length)
        oClose := cmo(close, length)
        oHigh := cmo(high, length)
        oLow := cmo(low, length)
    if(oscilatorType == "mfi")
        oOpen := mfi(open, length)
        oClose := mfi(close, length)
        oHigh := mfi(high, length)
        oLow := mfi(low, length)
    if(oscilatorType == "macd")
        [macdLineOpen, signalLineOpen, histLineOpen] = macd(open, shortlength, longlength, length)
        [macdLineClose, signalLineClose, histLineClose] = macd(close, shortlength, longlength, length)
        [macdLineHigh, signalLineHigh, histLineHigh] = macd(high, shortlength, longlength, length)
        [macdLineLow, signalLineLow, histLineLow] = macd(low, shortlength, longlength, length)
        oOpen := macdLineOpen
        oClose := macdLineClose
        oHigh := macdLineHigh
        oLow := macdLineLow
    [oOpen, oClose, oHigh, oLow]

f_getMovingAverage(source, MAType, length)=>
    ma = sma(source, length)
    if(MAType == "ema")
        ma := ema(source,length)
    if(MAType == "hma")
        ma := hma(source,length)
    if(MAType == "rma")
        ma := rma(source,length)
    if(MAType == "vwma")
        ma := vwma(source,length)
    if(MAType == "wma")
        ma := wma(source,length)
    ma

f_getSupertrend(oOpen, oClose, oHigh, oLow, AtrMAType, AtrLength, stopMultiplier, wicks)=>
    truerange = max(oHigh, oClose[1]) - min(oLow, oClose[1])
    
    averagetruerange = f_getMovingAverage(truerange, AtrMAType, AtrLength)
    atr = averagetruerange * stopMultiplier

    longStop = oClose - atr
    longStopPrev = nz(longStop[1], longStop)
    longStop := (wicks ? oLow[1] : oClose[1]) > longStopPrev ? max(longStop, longStopPrev) : longStop
    
    shortStop = oClose + atr
    shortStopPrev = nz(shortStop[1], shortStop)
    shortStop := (wicks ? oHigh[1] : oClose[1]) < shortStopPrev ? min(shortStop, shortStopPrev) : shortStop
    
    dir = 1
    dir := nz(dir[1], dir)
    dir := dir == -1 and (wicks ? oHigh : oClose) > shortStopPrev ? 1 : dir == 1 and (wicks ? oLow : oClose) < longStopPrev ? -1 : dir
    
    trailingStop = dir == 1? longStop : shortStop
    
    [dir, trailingStop]


f_getBuySellStops(oOpen, oClose, oHigh, oLow, AtrMAType, AtrLength, considerWicks, considerWicksForDelayByStep, stopMultiplier, targetMultiplier)=>
    barState = 0
    source = oClose
    
    truerange = max(oHigh, oClose[1]) - min(oLow, oClose[1])
    
    atr = f_getMovingAverage(truerange, AtrMAType, AtrLength)

    buyStop = source - atr * stopMultiplier
    sellStop = source + atr * stopMultiplier
    buyStopDerived = buyStop
    sellStopDerived = sellStop
    highTarget = considerWicks ? oHigh : source
    lowTarget = considerWicks ? oLow : source
    
    highTargetDelayByStep = considerWicksForDelayByStep ? oHigh : source
    lowTargetDelayByStep = considerWicksForDelayByStep ? oLow : source
    
    barState := highTarget > sellStopDerived[1] ? 1 : lowTarget < buyStopDerived[1] ? -1 : nz(barState[1],0)
    
    buyMultiplier = (barState == 1)? stopMultiplier : targetMultiplier
    sellMultiplier = (barState == -1)? stopMultiplier : targetMultiplier
    buyStop := source - atr * buyMultiplier
    sellStop := source + atr * sellMultiplier
    buyStop := barState == 1? max(buyStop, buyStop[1]) : barState == -1? min(buyStop, buyStop[1]) : buyStop
    sellStop := barState == 1? max(sellStop, sellStop[1]) : barState == -1? min(sellStop, sellStop[1]) : sellStop
    
    buyStopDerived := buyStop
    sellStopDerived := sellStop
    
    buyStopDerived := highTargetDelayByStep < sellStopDerived[1] and lowTargetDelayByStep > buyStopDerived[1] ? buyStopDerived[1] : buyStopDerived
    sellStopDerived := highTargetDelayByStep < sellStopDerived[1] and lowTargetDelayByStep > buyStopDerived[1] ? sellStopDerived[1] : sellStopDerived

    [buyStopDerived, sellStopDerived, barState]


f_secureSecurity(_symbol, _res, _src) => security(_symbol, _res, _src[1], lookahead = barmerge.lookahead_on, gaps=barmerge.gaps_off)

f_multiple_resolution(HTFMultiplier) => 
    target_Res_In_Min = timeframe.multiplier * HTFMultiplier * (
      timeframe.isseconds   ? 1. / 60. :
      timeframe.isminutes   ? 1. :
      timeframe.isdaily     ? 1440. :
      timeframe.isweekly    ? 7. * 24. * 60. :
      timeframe.ismonthly   ? 30.417 * 24. * 60. : na)

    target_Res_In_Min     <= 0.0417       ? "1S"  :
      target_Res_In_Min   <= 0.167        ? "5S"  :
      target_Res_In_Min   <= 0.376        ? "15S" :
      target_Res_In_Min   <= 0.751        ? "30S" :
      target_Res_In_Min   <= 1440         ? tostring(round(target_Res_In_Min)) :
      tostring(round(min(target_Res_In_Min / 1440, 365))) + "D"
    
f_getPivotHighLow(oOpen, oClose, oHigh, oLow, HTFMultiplier, resolution, PivotLength)=>
    derivedResolution = resolution == ""? f_multiple_resolution(HTFMultiplier) : resolution
    HTFHigh = f_secureSecurity(syminfo.tickerid, derivedResolution, oHigh)
    HTFLow = f_secureSecurity(syminfo.tickerid, derivedResolution, oLow)
    CLOSEprev = f_secureSecurity(syminfo.tickerid, derivedResolution, oClose)
    pivothi = pivothigh(HTFHigh, PivotLength, PivotLength)
    pivotlo = pivotlow(HTFLow, PivotLength, PivotLength)
    pivothi := na(pivothi)? nz(pivothi[1]) : pivothi
    pivotlo := na(pivotlo)? nz(pivotlo[1]) : pivotlo
    [pivothi, pivotlo]
    
[oOpen, oClose, oHigh, oLow] = f_getOscilatorValues(oscilatorType, length, shortlength, longlength)
[dir, trailingStop] = f_getSupertrend(oOpen, oClose, oHigh, oLow, AtrMAType, AtrLength, stopMultiplier, wicks)

candleColor = colorByPreviousClose ?
                 (oClose[1] < oClose ? color.green : oClose[1] > oClose ? color.red : color.silver) : 
                 (oOpen < oClose ? color.green : oOpen > oClose ? color.red : color.silver)
plotcandle(oOpen, oHigh, oLow, oClose, 'Oscilator Candles', color = candleColor)

[buyStopDerived, sellStopDerived, barState] = f_getBuySellStops(oOpen, oClose, oHigh, oLow, AtrMAType, AtrLength, wicks, considerWicksForDelayByStep, stopMultiplier, targetMultiplier)

trailingStopDerived = barState == 1? buyStopDerived : sellStopDerived

plot(showSupertrend?trailingStopDerived:na, title="TrailingStop", style=plot.style_linebr, linewidth=1, color= barState == 1 ? color.green : color.red)

[pivotHigh, pivotLow] = f_getPivotHighLow(open, close, high, low, HTFMultiplier, resolution, PivotLength)

buyCondition = (barState == 1) and (close > pivotHigh or not useHTFPivot)
exitBuyConditin = (barState == -1)
sellCondition = (barState == -1) and (close < pivotLow or not useHTFPivot)
exitSellCondition = (barState == 1)

// strategy.risk.allow_entry_in(tradeDirection)
strategy.entry("Buy", strategy.long, when=buyCondition and inDateRange, oca_name="oca")
strategy.entry("Sell", strategy.short, when=sellCondition and inDateRange, oca_name="oca")
strategy.close("Buy", when = exitBuyConditin)
strategy.close( "Sell", when = exitSellCondition)