다중 시간 프레임 적응 추적 중지 손실 전략

저자:차오장, 날짜: 2023-11-21 11:07:44
태그:

img

전반적인 설명

이 전략은 현재 시간 프레임에서 트렌드 방향을 결정하기 위해 여러 기술적 지표의 포괄적 신호를 계산합니다. 상승 추세로 판단되면 추적 스톱 손실 라인은 상대적으로 높은 지점에 설정됩니다. 하락 추세로 판단되면 추적 스톱 손실 라인은 상대적으로 낮은 지점에 설정됩니다. 전략은 위험 통제를 달성하기 위해 스톱 손실 라인을 적응적으로 조정 할 수 있습니다.

원칙

이 전략은 이동 평균, ATR, KD 및 변동률과 같은 여러 지표를 결합하여 현재 시간 프레임에서 전체 트렌드 방향을 결정합니다. 구체적으로 다음 하위 신호의 복합 값을 계산합니다.

  1. 이동 평균 방향 신호
  2. KD 지표 과잉 구매 과잉 판매 신호
  3. 가격과 부피의 오차 신호
  4. 채널 통과 신호
  5. 복수 시간 프레임 결합된 시행착오 신호
  6. % R 신호
  7. 이동 평균 회귀 신호
  8. ATR 채널 횡단 신호

각 하위 신호는 평평화되고 구매/판매를 판단하기 위해 다른 임계값이 설정됩니다. 다음 하위 신호를 가중화하여 현재 시간 프레임에서 전체 신호를 계산합니다. 신호가 0보다 크면 상승 추세로 판단됩니다. 신호가 0보다 작으면 하향 추세로 판단됩니다.

상승 추세로 판단되면 전략은 이전 높은 지점 근처에 추적 스톱 로스 라인을 설정합니다. 하락 추세로 판단되면 이전 하위 지점 근처에 추적 스톱 로스 라인을 설정합니다. 이것은 위험 통제의 목적을 달성하기 위해 실제 가격 움직임에 따라 스톱 로스 수준을 동적으로 조정 할 수 있습니다.

장점

이 전략은 현재 트렌드 방향을 판단하기 위해 여러 지표를 통합하여 판단의 정확성을 향상시킵니다. 동시에 전략은 다양한 품종과 시간 프레임에 적응 할 수 있습니다.

가장 중요한 것은 이 전략이 시스템 리스크를 헤지하기 위해 실제 추세에 따라 스톱 로스 라인을 동적으로 조정하고 리스크 제어 수준을 조정할 수 있다는 것입니다. 이것이 가장 큰 장점입니다.

위험성

트렌드 신호 판단의 품질은 스톱 로스 라인의 설정에 직접적으로 영향을 미칩니다. 판단이 잘못되면 스톱 로스 레벨이 너무 느슨하거나 너무 엄격하게 설정 될 수 있습니다. 또한, 스톱 로스 라인은 시장 변동의 위험을 완전히 피할 수 없습니다.

전략은 또한 이익 수준과 스톱 로스 거리를 균형 잡아야 한다. 스톱 로스 거리가 너무 가깝다면, 그것은 과도한 스톱 로스 빈도를 유발할 수 있다. 스톱 로스 거리가 너무 멀다면, 위험을 효과적으로 제어할 수 없다. 이것은 다른 품종과 주기에 대한 매개 변수 최적화를 필요로 한다.

최적화 방향

기계 학습 알고리즘을 도입하여 추세 방향을 판단하는 모델을 훈련시키는 것을 고려하십시오. 판단 정확성을 향상시키기 위해 역사적 데이터를 사용하여.

다른 매개 변수 조합을 테스트하여 스톱 로스 거리를 최적화하십시오. 예를 들어 시장 변동성의 변화에 적응하기 위해 ATR 사이클 매개 변수를 동적으로 조정하십시오.

또한 양 에너지 지표는 실제 추세를 파악하고 가격과 양의 오차로 인한 신호 오류를 방지하기 위해 결합될 수 있습니다.

요약

이 전략은 여러 기술적 지표를 통합하여 현재 트렌드 방향을 판단하고 그에 따라 추적 스톱 로스 라인을 동적으로 조정합니다. 스톱 로스의 효과를 향상시키고 거래 위험을 제어하는 것을 목표로합니다. 전략 아이디어는 진보되어 있으며 추가 최적화 및 검증을 가치가 있습니다. 그것은 참조 할 수있는 멀티 타임프레임 적응 위험 제어 전략입니다.


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



더 많은