진동하는 K-라인 양적 거래 전략


생성 날짜: 2023-09-26 20:05:55 마지막으로 수정됨: 2023-09-26 20:05:55
복사: 0 클릭수: 727
avatar of ChaoZhang ChaoZhang
1
집중하다
1621
수행원

개요

이 전략은 지표 기반의 동력 전략으로, RSI, Stoch, MACD 등의 오실레이터 지표를 사용하여 전략 거래 신호를 구성한다. 전략의 주요 아이디어는 가격이 흔들릴 때 지표를 사용하여 트렌드 방향을 식별하고, 지표 신호에 따라 입문한다. 동시에, 전략은 지연 오버 트렌드 지표를 사용하여 중지한다.

전략 원칙

이 전략은 먼저 사용자 정의 함수 f_getOscilatorValues를 호출하여 RSI, Stoch, MACD 등과 같은 다양한 진동 지표의 값을 얻습니다. 그리고 f_getSupertrend 함수를 사용하여 지연 오버트렌드 지표의 값을 계산하여 스톱로드를 추적합니다.

지표를 계산한 후, 전략은 f_getBuySellStops 함수를 호출하여 지표 값에 따라 입구 중지 및 중지 지점을 계산한다. 구체적으로, 그것은 ATR 지표를 계산하고, ATR을 입구 중지 인수와 ATR을 스톱 인수와 스톱 인수와 스톱 인수와 스톱 인수를 계산한다. 트렌드 반전이 발생할 때, 스톱 및 스톱 지점은 조정된다.

그 후, 전략은 K 선의 실체 방향을 판단합니다. 상승하는 K 선이라면, 녹색으로 그리고 하락하는 K 선은 빨간색으로 그려집니다. K 선과 지표를 그리고 나면, 전략은 입시 조건을 충족하는지 판단합니다. 입시 조건은 지표가 오버 바이를 표시할 때, 가격이 경로를 돌파 할 때 더 많이; 지표가 오버 세일 때, 가격이 경로를 돌파 할 때 비어 있습니다.

진입 후, 정지는 추적, 추적 정지는 상반 또는 하반, whichever is closer. 정지는 촉발 후 평지. 가격 정지 지점에 도달하면 부분적으로 정지.

전략적 강점 분석

이 전략은 다음과 같은 장점을 가지고 있습니다.

  1. 오실레이터 지표를 사용하여 트렌드의 방향성을 파악하여 시장의 단선 반전의 기회를 적시에 잡을 수 있습니다.

  2. 적용 지연 초향 손해 중지 전략, 손해가 확대되기 전에 손해 출전을 중지하여 단독 손해를 제한할 수 있다.

  3. ATR이 계산한 리스크 메이저에 따라 스톱로스 및 스톱 포스트를 동적으로 조정할 수 있다.

  4. 고주기 평균선과 결합하여 필터링하여, 을 피한다.

  5. 이 전략은 수익을 유지하면서도 수익의 일부를 잠금하는 것입니다.

  6. 전략은 간단하고 명확하며, 이해하기 쉬운 구현이며, 양자 거래 초보자에게 적합합니다.

전략적 위험 분석

이 전략에는 몇 가지 위험도 있습니다.

  1. oscillators 지표에는 지연 문제가 있으며, 입구 신호 지연, 출구 신호 조기 등으로 이어질 수 있다. 지표 파라미터를 조정하여 최적화하거나, 트렌드 다음 지표 보조 판단을 추가할 수 있다.

  2. 스톱포드가 가까워지면 브레이크 스톱포드가 발생할 수 있다. 스톱포드 범위를 적절히 넓히거나, 델리어 스톱과 같은 동적 스톱포드 전략을 사용할 수 있다.

  3. 부분 정지 후, 남은 포지션은 포스트스트로드 될 수 있다. 부분 정지 비율을 줄일 수 있고, 여유를 남길 수 있다.

  4. 데이터 재조합 위험. 여러 시장에서 여러 번 검증하여 재조합을 피해야 한다.

  5. 고주기평균선은 필터 조건으로도 무효가 될 수 있다. 경향 분류와 같은 방법이 대주기 움직임을 판단하는 데 보조되어야 한다.

전략 최적화 방향

이 전략은 다음과 같은 부분에서 최적화될 수 있습니다.

  1. 다른 오실레이터 지표의 파라미터 조합을 테스트하고, 빠른 K 선의 스토흐 지표와 같은 더 좋은 품질의 신호를 제공할 수 있는 조합을 선택한다.

  2. 부분 스톱을 이동 스톱으로 바꾸어 ATR 또는 이동 평균에 따라 스톱 위치를 설정하십시오.

  3. 대주기 트렌드를 판단하는 데 기계 학습 알고리즘을 추가하여 고주기 평균선 필터링 방식을 대체하여 판단 정확도를 향상시킵니다.

  4. 에너지 증가가 필요없는 역거래를 방지하기 위해 입시 필터링 조건으로 사용된다.

  5. 지표의 통합 및 무게 최적화를 통해 현재 품종에 가장 적합한 지표 조합을 선택하십시오.

  6. 기계 학습 풍력 제어 모듈을 추가하고, 스피드, 스피드, 포지션 등을 동적으로 최적화한다.

  7. 삼각대리 또는 시중대리 거래 신호를 추가하여 선물과 현금 사이의 가격 차이를 활용하십시오.

요약하다

이 전략은 전체적으로 수량 거래 초보자 학습에 매우 적합한 전략이며, 아이디어는 명확하며, 중요한 점은 지표 분석과 위험 제어에 기반하고 있습니다. 그러나 안정적인 수익을 얻기 위해 여전히 실장에 대해 변수 최적화 및 위험 회피가 필요합니다. 또한, 추세를 판단, 손해 최적화, 통합 학습 등의 측면에서 전략 증진을 할 수 있습니다.

전략 소스 코드
/*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)