Strategi trailing stop adaptif multi-kerangka waktu


Tanggal Pembuatan: 2023-11-21 11:07:44 Akhirnya memodifikasi: 2023-11-21 11:07:44
menyalin: 0 Jumlah klik: 638
1
fokus pada
1617
Pengikut

Strategi trailing stop adaptif multi-kerangka waktu

Ringkasan

Strategi ini menilai arah tren dalam kerangka waktu saat ini dengan menghitung sinyal komposit dari beberapa indikator teknis. Jika ditentukan sebagai tren naik, atur jalur stop loss pada titik yang lebih tinggi; Jika ditentukan sebagai tren turun, atur jalur stop loss pada titik yang lebih rendah. Strategi ini dapat beradaptasi dengan berbagai varietas dan kerangka waktu yang berbeda, dan secara dinamis menyesuaikan jalur stop loss, untuk mencapai kontrol risiko.

Prinsip

Strategi ini menggabungkan beberapa indikator, seperti garis rata-rata, ATR, KD, dan tingkat perubahan, untuk menentukan arah tren keseluruhan dalam kerangka waktu saat ini. Secara khusus, strategi ini menghitung nilai gabungan dari beberapa sub-sinyal berikut:

  1. Sinyal arah
  2. Indeks KD sinyal oversold
  3. Harga yang tidak sesuai dengan sinyal
  4. sinyal terobosan saluran
  5. Sinyal uji coba dan kesalahan komprehensif multi-frame
  6. Persentase sinyal R
  7. Sinyal Regression Linear
  8. Sinyal penembusan saluran ATR

Setiap sub-sinyal di atas telah diproses secara halus dan menetapkan penilaian harga yang berbeda untuk membeli/menjual. Setiap sub-sinyal kemudian diberi bobot untuk menghitung sinyal keseluruhan dalam kerangka waktu saat ini. Jika sinyal lebih besar dari 0, maka ditentukan sebagai tren naik, dan jika sinyal lebih kecil dari 0, maka ditentukan sebagai tren turun.

Ketika menilai sebagai tren naik, strategi akan menetapkan jalur tracking stop loss di dekat titik yang lebih tinggi sebelumnya; Ketika menilai sebagai tren turun, strategi akan menetapkan jalur tracking stop loss di dekat titik yang lebih rendah sebelumnya. Dengan demikian, stop loss dapat disesuaikan secara dinamis sesuai dengan pergerakan harga aktual, untuk mencapai tujuan pengendalian risiko.

Keunggulan

Strategi ini mengintegrasikan beberapa indikator untuk menilai arah tren saat ini, meningkatkan akurasi penilaian. Selain itu, strategi ini dapat beradaptasi dengan berbagai varietas dan kerangka waktu, dengan kemampuan adaptasi yang lebih kuat.

Yang terpenting, strategi ini mampu secara dinamis menyesuaikan stop loss line, mampu menyesuaikan tingkat kontrol risiko sesuai dengan tren aktual, sehingga melindungi risiko sistemik, yang merupakan keunggulan terbesarnya.

Risiko

Strategi ini menilai kualitas sinyal tren yang secara langsung mempengaruhi pengaturan garis stop loss, dan jika penilaian yang salah, dapat menyebabkan posisi stop loss yang terlalu longgar atau terlalu ketat. Selain itu, garis stop loss tidak dapat sepenuhnya menghindari risiko perubahan tren.

Strategi ini juga perlu mempertimbangkan tingkat keuntungan dan jarak stop loss, jika jarak stop loss terlalu dekat, mungkin menyebabkan stop loss terlalu sering; jika jarak stop loss terlalu jauh, risiko tidak dapat dikendalikan secara efektif. Ini memerlukan pengoptimalan parameter berdasarkan siklus yang berbeda dari berbagai varietas.

Arah optimasi

Pertimbangkan untuk memperkenalkan algoritma pembelajaran mesin, model yang menggunakan pelatihan data historis untuk menentukan arah tren, sehingga meningkatkan akurasi penilaian.

Kombinasi parameter yang berbeda dapat diuji untuk mengoptimalkan jarak dari stop loss line. Misalnya, secara dinamis menyesuaikan parameter siklus ATR untuk menyesuaikan dengan perubahan volatilitas pasar.

Ini juga dapat dikombinasikan dengan indikator energi volume transaksi untuk mengetahui tren yang sebenarnya, mencegah kesalahan sinyal yang disebabkan oleh deviasi harga.

Meringkaskan

Strategi ini mengintegrasikan beberapa indikator teknis untuk menilai arah tren saat ini, dan secara dinamis menyesuaikan untuk melacak garis stop loss, yang bertujuan untuk meningkatkan efektivitas stop loss dan mengendalikan risiko perdagangan. Konsep strategi ini canggih, layak untuk dioptimalkan dan diverifikasi lebih lanjut, dan merupakan kerangka waktu multi-kerangka yang dapat digunakan sebagai referensi strategi pengendalian risiko yang beradaptasi.

Kode Sumber Strategi
/*backtest
start: 2022-11-14 00:00:00
end: 2023-11-20 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/
// © jigneshjc

//@version=5
strategy("Jigga - Survival Level", shorttitle='Jigga - Survival Level', overlay=true)

doBackTesting = input(true, 'Run Back Testing')

entryCondition = false
exitCondition = false


ab21 =  14,  gh41 = ab21
gh42 = ab21, ju51 = 14
ki61 = ju51
lkolkp = true ,ab22 = 58
cd31 = 5 , ab23 = 42
aa12 = 29, cd32 = 26
op71 = 5,  aa11 = 12
aa13 = 9, op72 = 2.0
movnwx = false


kahachale(byju, h, l) =>
    mika = ta.change(h)
    awer = -ta.change(l)
    uikmhDM = na(mika) ? na : mika > awer and mika > 0 ? mika : 0
    wrtdfcDM = na(awer) ? na : awer > mika and awer > 0 ? awer : 0
    bbct = ta.rma(ta.tr, byju)
    uikmh = fixnan(100 * ta.rma(uikmhDM, byju) / bbct)
    wrtdfc = fixnan(100 * ta.rma(wrtdfcDM, byju) / bbct)
    [uikmh, wrtdfc]

trial(gh42, gh41, h, l) =>
    [uikmh, wrtdfc] = kahachale(gh42, h, l)
    uuolop = uikmh + wrtdfc
    trial = 100 * ta.rma(math.abs(uikmh - wrtdfc) / (uuolop == 0 ? 1 : uuolop), gh41)
    trial

_pr(src, byjugth) =>
    max = ta.highest(byjugth)
    min = ta.lowest(byjugth)
    100 * (src - max) / (max - min)


kyukarna(khulmkhula, mikaarwala, nichewala, bandhwala, partiwala) =>

    sig = trial(gh42, gh41, mikaarwala, nichewala)
    trialIncreasing = sig > ta.ema(sig, 5) ? lkolkp : movnwx

    rolkmn = ta.ema(bandhwala, aa11)
    psolkmn = ta.ema(bandhwala, aa12)
    ujghd = rolkmn - psolkmn
    wrtycv = ta.ema(ujghd, aa13)
    kimnjg = ujghd - wrtycv


    mikalilo = ta.rma(math.max(ta.change(bandhwala), 0), ab21)
    awerlilo = ta.rma(-math.min(ta.change(bandhwala), 0), ab21)
    lilo = awerlilo == 0 ? 100 : mikalilo == 0 ? 0 : 100 - 100 / (1 + mikalilo / awerlilo)
    juylknlilo = ta.ema(lilo, 3)


    rjuylkn = ta.ema(bandhwala, cd31)
    psjuylkn = ta.ema(bandhwala, cd32)

    percentR = _pr(bandhwala, ju51)
    juylknpercentR = ta.ema(percentR, 3)


    ad = bandhwala == mikaarwala and bandhwala == nichewala or mikaarwala == nichewala ? 0 : (2 * bandhwala - nichewala - mikaarwala) / (mikaarwala - nichewala) * partiwala
    kiloValue = math.sum(ad, ki61) / math.sum(partiwala, ki61)



    liiopn = ta.atr(op71)
    mikaliiopn = (mikaarwala + nichewala) / 2 - op72 * liiopn
    mika1liiopn = nz(mikaliiopn[1], mikaliiopn)
    mikaliiopn := bandhwala[1] > mika1liiopn ? math.max(mikaliiopn, mika1liiopn) : mikaliiopn
    dnliiopn = (mikaarwala + nichewala) / 2 + op72 * liiopn
    dn1liiopn = nz(dnliiopn[1], dnliiopn)
    dnliiopn := bandhwala[1] < dn1liiopn ? math.min(dnliiopn, dn1liiopn) : dnliiopn
    omnerliiopn = 1
    omnerliiopn := nz(omnerliiopn[1], omnerliiopn)
    omnerliiopn := omnerliiopn == -1 and bandhwala > dn1liiopn ? 1 : omnerliiopn == 1 and bandhwala < mika1liiopn ? -1 : omnerliiopn

    fitur = ujghd > 0 ? ujghd > wrtycv ? 1 : 0 : ujghd > wrtycv ? 0 : -1
    mitur = kimnjg >= 0 ? kimnjg > kimnjg[1] ? 1 : 0 : kimnjg > kimnjg[1] ? 0 : -1
    ritur = juylknlilo > ab22 ? 1 : juylknlilo < ab23 ? -1 : 0
    circuits = rjuylkn > psjuylkn ? 1 : -1
    trialPoints = trialIncreasing ? close > ta.ema(close, 3) ? 1 : -1 : 0
    virar = juylknpercentR > -ab23 ? 1 : juylknpercentR < -ab22 ? -1 : 0
    chikar = kiloValue > 0.1 ? 1 : kiloValue < -0.1 ? -1 : 0
    sitar = omnerliiopn


    p = fitur + mitur + ritur + circuits + trialPoints + virar + chikar + sitar

    p

currentP = kyukarna(open, high, low, close, volume)
currentPNew = currentP >= 0 and currentP[1] <= 0 ? 0 : currentP <= 0 and currentP[1] >= 0 ? 0 : currentP
colorPNew = currentPNew == 0 ? color.black : currentPNew >= 0 ? color.green : color.red
//plot(currentPNew, color=colorPNew, title='CurrentTimeFrame')

LTN = 0.0
LTN := nz(LTN) ? 0.0 : (currentPNew[1] < 0 and currentPNew >= 0) ? high * 1.005 : (currentPNew[1] > 0 and currentPNew <= 0) ? low * 0.995 : LTN[1]

LClr = color.green
LClr :=  (currentPNew[1] < 0 and currentPNew >= 0) ? color.green : (currentPNew[1] > 0 and currentPNew <= 0) ? color.red : LClr[1]

plot(LTN,color=LClr,title="Level", style=plot.style_circles)


entryCondition:= high > LTN and LClr == color.green ? lkolkp : movnwx
exitCondition:= low < LTN and LClr == color.red ? lkolkp : movnwx

tradeRunning = movnwx
tradeRunning := nz(tradeRunning) ? movnwx :  (not tradeRunning[1]) and entryCondition ? lkolkp : tradeRunning[1] and exitCondition ? movnwx : tradeRunning[1]


plotshape(tradeRunning and (not tradeRunning[1]) and (not doBackTesting), style=shape.labelup, location=location.belowbar, color=color.new(#00FF00, 50), size=size.tiny, title='Buy wrtycv', text='➹', textcolor=color.new(color.black,0))
plotshape((not tradeRunning) and tradeRunning[1] and (not doBackTesting), style=shape.labeldown, location=location.abovebar, color=color.new(#FF0000, 50), size=size.tiny, title='Sell wrtycv', text='➷', textcolor=color.new(color.white, 0))


if  entryCondition  and doBackTesting
    strategy.entry(id="Buy",direction=strategy.long)

if exitCondition and doBackTesting
    strategy.close(id="Buy")