Chiến lược dừng lỗ thích ứng đa khung thời gian


Ngày tạo: 2023-11-21 11:07:44 sửa đổi lần cuối: 2023-11-21 11:07:44
sao chép: 0 Số nhấp chuột: 638
1
tập trung vào
1617
Người theo dõi

Chiến lược dừng lỗ thích ứng đa khung thời gian

Tổng quan

Chiến lược này đánh giá hướng xu hướng trong khung thời gian hiện tại bằng cách tính toán các tín hiệu tổng hợp của nhiều chỉ số kỹ thuật. Khi đánh giá xu hướng tăng, hãy đặt đường dừng theo dõi ở điểm cao hơn; Khi đánh giá xu hướng giảm, hãy đặt đường dừng theo dõi ở điểm thấp hơn. Chiến lược có thể thích ứng với các giống khác nhau và các khung thời gian khác nhau, bằng cách điều chỉnh động đường dừng, để kiểm soát rủi ro.

Nguyên tắc

Chiến lược này kết hợp nhiều chỉ số như đường trung bình, ATR, KD, và tỷ lệ biến đổi để xác định hướng xu hướng tổng thể trong khung thời gian hiện tại. Cụ thể, nó tính toán các giá trị tổng hợp của một số tín hiệu con sau:

  1. Tín hiệu hướng đồng tuyến
  2. Chỉ số KD quá mua quá bán
  3. Giá lệch khỏi tín hiệu
  4. Có tín hiệu đột phá.
  5. Tín hiệu thử và lỗi tổng hợp nhiều khung thời gian
  6. Tín hiệu %R
  7. Tín hiệu quay trở lại
  8. ATR đã phá vỡ đường dẫn.

Mỗi tín hiệu con trên được xử lý trơn tru và đặt các ngưỡng khác nhau để đánh giá mua / bán. Mỗi tín hiệu con sau đó được cân nhắc để tính tổng số tín hiệu trong khung thời gian hiện tại. Nếu tín hiệu lớn hơn 0, thì được đánh giá là xu hướng tăng, nếu tín hiệu nhỏ hơn 0, thì được đánh giá là xu hướng giảm.

Khi đánh giá là xu hướng tăng, chiến lược sẽ thiết lập đường dừng theo dõi gần điểm cao hơn trước đó; khi đánh giá là xu hướng giảm, chiến lược sẽ thiết lập đường dừng theo dõi gần điểm thấp hơn trước đó. Như vậy, có thể điều chỉnh động vị trí dừng lỗ theo phong trào giá thực tế, để đạt được mục đích kiểm soát rủi ro.

Ưu điểm

Chiến lược này tích hợp nhiều chỉ số để đánh giá xu hướng hiện tại, tăng độ chính xác của phán đoán. Đồng thời, chiến lược có thể thích ứng với các giống và khung thời gian khác nhau, có khả năng thích ứng mạnh mẽ hơn.

Điều quan trọng nhất là chiến lược này có thể điều chỉnh động các đường dừng lỗ, có thể điều chỉnh mức độ kiểm soát rủi ro theo xu hướng thực tế, do đó bảo hiểm rủi ro hệ thống, đây là ưu điểm lớn nhất của nó.

Rủi ro

Chiến lược này đánh giá chất lượng của tín hiệu xu hướng trực tiếp ảnh hưởng đến việc thiết lập đường dừng, và nếu đánh giá sai, có thể dẫn đến việc thiết lập vị trí dừng quá thoải mái hoặc quá nghiêm ngặt. Ngoài ra, đường dừng không thể hoàn toàn tránh được rủi ro biến động của thị trường.

Chiến lược này cũng cần cân bằng mức lợi nhuận và khoảng cách dừng lỗ, nếu dừng lỗ quá gần, có thể dẫn đến dừng lỗ quá thường xuyên; nếu dừng lỗ quá xa, rủi ro không thể được kiểm soát hiệu quả. Điều này cần tối ưu hóa tham số theo chu kỳ khác nhau của các giống khác nhau.

Hướng tối ưu hóa

Có thể xem xét việc giới thiệu các thuật toán học máy để sử dụng các mô hình được đào tạo bằng dữ liệu lịch sử để đánh giá xu hướng, do đó cải thiện độ chính xác của phán đoán.

Có thể thử nghiệm các kết hợp tham số khác nhau để tối ưu hóa khoảng cách giữa các đường dừng. Ví dụ: điều chỉnh động tham số chu kỳ ATR để phù hợp với sự thay đổi của biến động thị trường.

Nó cũng có thể kết hợp với chỉ số năng lượng khối lượng giao dịch để xác định xu hướng thực sự, ngăn chặn các sai sót tín hiệu do giá cả lệch.

Tóm tắt

Chiến lược này nhằm mục đích nâng cao hiệu quả của việc ngăn chặn thiệt hại và kiểm soát rủi ro giao dịch bằng cách kết hợp nhiều chỉ số kỹ thuật để đánh giá xu hướng hiện tại và theo đó điều chỉnh động theo dõi đường dừng lỗ. Ý tưởng của chiến lược này tiên tiến, đáng để tối ưu hóa và xác minh hơn nữa, là một khung thời gian đa dạng có thể được tham khảo để điều chỉnh chiến lược kiểm soát rủi ro.

Mã nguồn chiến lược
/*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")