Strategi Stop Loss Pelacakan Adaptif Multi-Timeframe

Penulis:ChaoZhang, Tanggal: 2023-11-21 11:07:44
Tag:

img

Gambaran umum

Strategi ini menghitung sinyal komprehensif dari beberapa indikator teknis untuk menentukan arah tren dalam kerangka waktu saat ini. Ketika dinilai sebagai tren naik, garis stop loss pelacakan ditetapkan pada titik yang relatif tinggi; ketika dinilai sebagai tren menurun, garis stop loss pelacakan ditetapkan pada titik yang relatif rendah. Strategi dapat menyesuaikan garis stop loss secara adaptif untuk mencapai kontrol risiko.

Prinsip

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

  1. Sinyal arah rata-rata bergerak
  2. Indikator KD sinyal overboughtoversold
  3. Sinyal perbedaan harga-volume
  4. Sinyal penembusan saluran
  5. Sinyal uji coba dan kesalahan gabungan multi-frame
  6. Sinyal R persen
  7. Sinyal regresi rata-rata bergerak
  8. Sinyal tembus saluran ATR

Setiap sub-sinyal dihaluskan dan ambang batas yang berbeda ditetapkan untuk menilai beli / jual. Kemudian berat sub-sinyal untuk menghitung sinyal keseluruhan dalam kerangka waktu saat ini. Jika sinyal lebih besar dari 0, itu dinilai sebagai uptrend. Jika sinyal kurang dari 0, itu dinilai sebagai downtrend.

Ketika dinilai sebagai uptrend, strategi menetapkan garis stop loss pelacakan di dekat titik tinggi sebelumnya; ketika dinilai sebagai downtrend, ia menetapkan garis stop loss pelacakan di dekat titik bawah sebelumnya. Ini dapat secara dinamis menyesuaikan tingkat stop loss sesuai dengan pergerakan harga yang sebenarnya untuk mencapai tujuan pengendalian risiko.

Keuntungan

Strategi ini mengintegrasikan beberapa indikator untuk menilai arah tren saat ini, yang meningkatkan akurasi penilaian. Pada saat yang sama, strategi dapat beradaptasi dengan berbagai varietas dan kerangka waktu dengan daya adaptasi yang kuat.

Yang paling penting, strategi dapat secara dinamis menyesuaikan garis stop loss dan menyesuaikan tingkat kontrol risiko sesuai dengan tren aktual untuk lindung nilai risiko sistemik.

Risiko

Kualitas penilaian sinyal tren secara langsung mempengaruhi pengaturan garis stop loss. Jika penilaian itu salah, hal itu dapat menyebabkan tingkat stop loss ditetapkan terlalu longgar atau terlalu ketat. Selain itu, garis stop loss tidak dapat sepenuhnya menghindari risiko mutasi pasar.

Strategi ini juga perlu menyeimbangkan tingkat keuntungan dan jarak stop loss. Jika jarak stop loss terlalu dekat, hal ini dapat menyebabkan frekuensi stop loss yang berlebihan; jika jarak stop loss terlalu jauh, hal ini tidak dapat secara efektif mengendalikan risiko. Hal ini membutuhkan optimasi parameter untuk berbagai varietas dan siklus.

Arahan Optimasi

Pertimbangkan untuk memperkenalkan algoritma pembelajaran mesin untuk melatih model untuk menilai arah tren menggunakan data historis untuk meningkatkan akurasi penilaian.

Uji kombinasi parameter yang berbeda untuk mengoptimalkan jarak stop loss. Misalnya, menyesuaikan parameter siklus ATR secara dinamis untuk beradaptasi dengan perubahan volatilitas pasar.

Indikator volume energi juga dapat dikombinasikan untuk menentukan tren yang sebenarnya dan mencegah kesalahan sinyal yang disebabkan oleh perbedaan harga-volume.

Ringkasan

Strategi ini menilai arah tren saat ini dengan mengintegrasikan beberapa indikator teknis, dan dengan demikian secara dinamis menyesuaikan jalur stop loss pelacakan. Ini bertujuan untuk meningkatkan efektivitas stop loss dan mengendalikan risiko perdagangan. Ide strategi ini maju dan layak dioptimalkan dan diverifikasi lebih lanjut. Ini adalah strategi kontrol risiko adaptif multi-frame yang dapat dirujuk.


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



Lebih banyak