추세추종 이동평균선과 캔들스틱 패턴의 조합 전략


생성 날짜: 2024-02-02 17:53:43 마지막으로 수정됨: 2024-02-02 17:53:43
복사: 0 클릭수: 717
avatar of ChaoZhang ChaoZhang
1
집중하다
1617
수행원

추세추종 이동평균선과 캔들스틱 패턴의 조합 전략

개요

이 전략은 이동 평균을 사용하여 트렌드 방향을 판단하고 K 선형 모양을 판단하여 전환점을 판단하는 방법을 결합하여 트렌드 추적 거래를 구현합니다. 전략은 먼저 이동 평균을 사용하여 전체적인 트렌드 방향을 판단하고, 다음에는 트렌드 방향에서 잠재적인 반전 K 선형 모양을 입력 신호로 찾아 트렌드 동작을 추적합니다.

전략 원칙

전략은 10일 길이의 간단한 이동 평균을 사용하여 가격 경향의 방향을 판단한다. 가격이 이동 평균보다 높으면 상승 추세에 있다고 간주하고, 가격이 이동 평균보다 낮으면 하락 추세에 있다고 간주한다.

트렌드 방향을 판단한 후, 전략은 K 선형 K 선형과 K 선형 K 선형 K 선형에 따라 잠재적인 트렌드 역점을 판단합니다. 일반적인 K 선형 형태는 밝아지는 별, 아침의 별, 세 명의 백병 등이 포함됩니다. 일반적인 마이너스 형태는 Twilight의 별, 세 명의 까마귀 등이 포함됩니다. 상승 추세에서 태양 선 신호를 인식하면 전략은 구매 작업을 수행합니다. 하향 추세에서 마이너스 신호를 인식하면 전략은 판매 작업을 수행합니다.

또한, 전략은 주요 지원 저항 지점과 결합하여 진입의 구체적인 가격을 결정한다. 상승 추세에서 구매하는 경우, 첫 번째 지지를 뚫을 때 구매한다.

전략적 이점

이 전략의 가장 큰 장점은 트렌드 판단과 반전 신호를 동시에 결합하여 트렌드 전환점을 적시에 포착하여 트렌드 추적 작업을 수행 할 수 있다는 것입니다. 이 전략은 간단한 이동 평균 전략에 비해 수익률을 크게 높일 수 있습니다.

또한, K선형 판단을 포함시키는 전략은 돌발적 사건에 대한 처리 능력을 향상시킵니다. 시장에서 낮은 확률의 사건이 가짜 돌파구로 이어질 때 K선형은 필터링 기능을 수행하여 잘못된 거래를 방지 할 수 있습니다.

전략적 위험

이 전략의 주요 위험은 이동 평균 파라미터 설정과 K 선형 판단의 정확성에 있다. 이동 평균 주기 설정이 부적절하면 트렌드 판단 오류가 발생할 수 있으며, K 선형 판단에 오류가 발생하면 거래 결정 오류가 발생할 수 있다.

또한, 반전 K선 형태는 100%의 트렌드 반전을 보장하지 못하기 때문에 전략에도 약간의 위험이 있습니다. 시장이 더 넓은 범위의 반전이 발생하면 전략에 큰 손실을 초래할 수 있습니다.

최적화 방향

이 전략의 최적화 공간은 여전히 상대적으로 크다. 예를 들어, 이동 평균의 변수를 동적으로 조정할 수 있으며, 다른 시장 단계에서 다른 이동 평균 주기를 적용할 수 있다. 또한 기계 학습 방법을 추가할 수 있으며, 역사적 데이터를 사용하여 K선 형태 판단 모델을 훈련하여 판단 정확도를 높일 수 있다.

또한, 트렌드 및 하트 영역을 판단하는 더 많은 요소를 추가하는 것도 고려할 수 있습니다. 거래량 변화, 변동성 지표 등이 전략에 더 포괄적이고 안정적으로 적용될 수 있습니다.

요약하다

이 전략은 전체적으로 주식 시장의 중기 경향을 추적하는 데 매우 적합하며 높은 안정적인 수익을 얻을 수 있습니다. 추가적으로 최적화되면 잘 작동하는 양적 전략이 될 가능성이 있습니다. 투자자는 이 전략의 사용법을 숙지하면 장기간 보유한 포트폴리오를 구축하여 개별 주식 위험을 제어하면서 더 나은 초과 수익을 얻을 수 있습니다.

전략 소스 코드
/*backtest
start: 2024-01-01 00:00:00
end: 2024-01-31 23:59:59
period: 3h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
strategy("Trend Following Strategy with Candlestick Patterns", overlay=true)

// Moving Average
ma_period = input(10, title="Moving Average Period")
moving_average = ta.sma(close, ma_period)

// Candlestick Patterns
// Custom Function
abs(x) => x >= 0 ? x : -x

// Candlestick Patterns
isDoji() =>
    (close - open) <= (high - low) * 0.1

isMarubozuWhite() =>
    close == high and open == low and close > open

isHammer() =>
    (high - low) >= 3 * abs(open - close) and (close - low) / (0.001 + high - low) > 0.6 and (open - low) / (0.001 + high - low) > 0.6

isInvertedHammer() =>
    (high - low) >= 3 * abs(open - close) and (high - close) / (0.001 + high - low) > 0.6 and (high - open) / (0.001 + high - low) > 0.6

isLongLowerShadow() =>
    (low - close) > 2 * abs(open - close) and (low - open) / (0.001 + high - low) > 0.6

isUpsideTasukiGap() =>
    close[1] < open[1] and open > close and open > close[1] and close < open[1]

isRisingWindow() =>
    high[1] < low and close > open

isPiercing() =>
    close[1] < open[1] and close > open and close > ((open + low) / 2) and close < open[1] and open < close[1]

isBullishEngulfing() =>
    close[1] < open[1] and close > open and high > high[1] and low < low[1]

isTweezerBottom() =>
    low == ta.valuewhen(low == ta.lowest(low, 10), low, 0) and low == ta.valuewhen(low == ta.lowest(low, 20), low, 0)

isBullishAbandonedBaby() =>
    close[2] < open[2] and close[1] > open[1] and low[1] > ta.valuewhen(high == ta.highest(high, 2), high, 0) and open > close and close > ta.valuewhen(high == ta.highest(high, 2), high, 0)

isMorningStar() =>
    close[2] < open[2] and close[1] < open[1] and close > open[1] and open < close[2] and open > close[1]

isMorningDojiStar() =>
    close[2] < open[2] and close[1] < open[1] and isDoji() and close > open[1] and open < close[2] and open > close[1]

isDragonflyDoji() =>
    isDoji() and (high - close) / (0.001 + high - low) < 0.1 and (open - low) / (0.001 + high - low) > 0.6

isThreeWhiteSoldiers() =>
    close[2] < open[2] and close[1] < open[1] and close > open and open < close[2] and open < close[1] and close > open[1]

isRisingThreeMethods() =>
    close[4] < open[4] and close[1] < open[1] and close > open and open < close[4] and open < close[1] and close > open[1]

isMarubozuBlack() =>
    close == low and open == high and open > close

isGravestoneDoji() =>
    isDoji() and (close - low) / (0.001 + high - low) < 0.1 and (high - open) / (0.001 + high - low) > 0.6

isHangingMan() =>
    (high - low) >= 4 * abs(open - close) and (open - close) / (0.001 + high - low) > 0.6 and (high - open) / (0.001 + high - low) > 0.6

isLongUpperShadow() =>
    (high - open) > 2 * abs(open - close) and (high - close) / (0.001 + high - low) > 0.6

isDownsideTasukiGap() =>
    close[1] > open[1] and open < close and open < close[1] and close > open[1]

isFallingWindow() =>
    low[1] > high and close < open

isDarkCloudCover() =>
    close[1] > open[1] and close < open and close < ((open + high) / 2) and close > open[1] and open > close[1]

isBearishEngulfing() =>
    close[1] > open[1] and close < open and high > high[1] and low < low[1]

isTweezerTop() =>
    high == ta.valuewhen(high == ta.highest(high, 10), high, 0) and high == ta.valuewhen(high == ta.highest(high, 20), high, 0)

isAbandonedBaby() =>
    close[2] > open[2] and close[1] < open[1] and high[1] < ta.valuewhen(low == ta.lowest(low, 2), low, 0) and open < close and close < ta.valuewhen(low == ta.lowest(low, 2), low, 0)

isEveningDojiStar() =>
    close[2] > open[2] and close[1] > open[1] and isDoji() and close < open[1] and open > close[2] and open < close[1]

isEveningStar() =>
    close[2] > open[2] and close[1] > open[1] and close < open[1] and open > close[2] and open < close[1]

isThreeBlackCrows() =>
    close[2] > open[2] and close[1] > open[1] and close < open and open > close[2] and open > close[1] and close < open[1]

isFallingThreeMethods() =>
    close[4] > open[4] and close[1] > open

isShootingStar() =>
    (high - low) >= 3 * abs(open - close) and (high - close) / (0.001 + high - low) > 0.6 and (high - open) / (0.001 + high - low) > 0.6

doji = isDoji()
marubozuWhite = isMarubozuWhite()
hammer = isHammer()
invertedHammer = isInvertedHammer()
longLowerShadow = isLongLowerShadow()
upsideTasukiGap = isUpsideTasukiGap()
risingWindow = isRisingWindow()
piercing = isPiercing()
bullishEngulfing = isBullishEngulfing()
tweezerBottom = isTweezerBottom()
bullishAbandonedBaby = isBullishAbandonedBaby()
morningStar = isMorningStar()
morningDojiStar = isMorningDojiStar()
dragonflyDoji = isDragonflyDoji()
threeWhiteSoldiers = isThreeWhiteSoldiers()
risingThreeMethods = isRisingThreeMethods()
marubozuBlack = isMarubozuBlack()
gravestoneDoji = isGravestoneDoji()
hangingMan = isHangingMan()
longUpperShadow = isLongUpperShadow()
downsideTasukiGap = isDownsideTasukiGap()
fallingWindow = isFallingWindow()
darkCloudCover = isDarkCloudCover()
bearishEngulfing = isBearishEngulfing()
tweezerTop = isTweezerTop()
abandonedBaby = isAbandonedBaby()
eveningDojiStar = isEveningDojiStar()
eveningStar = isEveningStar()
threeBlackCrows = isThreeBlackCrows()
fallingThreeMethods = isFallingThreeMethods()
shootingStar = isShootingStar()
isBullishPattern() =>
    (isMarubozuWhite() or isHammer() or isInvertedHammer() or isDoji() or isMorningStar() or isBullishEngulfing() or isThreeWhiteSoldiers() or isMarubozuBlack() or isHangingMan() or isDownsideTasukiGap() or isDarkCloudCover())

isBearishPattern() =>
    (isMarubozuBlack() or isInvertedHammer() or isLongUpperShadow() or isTweezerTop() or isGravestoneDoji() or isEveningStar() or isBearishEngulfing() or isThreeBlackCrows() or isShootingStar())

isBullishCandle = isBullishPattern()
isBearishCandle = isBearishPattern()

// Calculate Pivot Points
pivotPoint(high, low, close) =>
    (high + low + close) / 3

r1 = pivotPoint(high[1], low[1], close[1]) * 2 - low[1]
s1 = pivotPoint(high[1], low[1], close[1]) * 2 - high[1]

r2 = pivotPoint(high[1], low[1], close[1]) + (high[1] - low[1])
s2 = pivotPoint(high[1], low[1], close[1]) - (high[1] - low[1])

r3 = high[1] + 2 * (pivotPoint(high[1], low[1], close[1]) - low[1])
s3 = low[1] - 2 * (high[1] - pivotPoint(high[1], low[1], close[1]))
// Trend Identification
is_uptrend = close > moving_average
is_downtrend = close < moving_average
// Entry and Exit Conditions with Trend Identification
enterLong = is_uptrend and isBullishCandle and close > r1
exitLong = is_uptrend and (bearishEngulfing or doji or close < s1)

enterShort = is_downtrend and isBearishCandle and close < s1
exitShort = is_downtrend and (bullishEngulfing or doji or close > r1)



// Strategy Execution
if enterLong and strategy.position_size == 0 and strategy.position_size[1] == 0 and close > r1
    strategy.entry("Buy", strategy.long, qty=1)

if exitLong and strategy.position_size > 0
    strategy.close("Buy")

if enterShort and strategy.position_size == 0 and close < s1
    strategy.entry("Sell", strategy.short, qty=1)

if exitShort and strategy.position_size < 0
    strategy.close("Sell")


// Stop-Loss and Trailing Stop-Loss
stop_loss_pct = input(2.0, title="Stop Loss Percentage")
trailing_stop_loss_pct = input(1.0, title="Trailing Stop Loss Percentage")
trailing_stop_loss_active = input(true, title="Trailing Stop Loss Active")

// Stop-Loss
stop_loss_level = strategy.position_avg_price * (1 - stop_loss_pct / 100)
strategy.exit("Stop Loss", "Buy", loss=stop_loss_level)

// Trailing Stop-Loss


// Plotting Moving Average
plot(moving_average, color=color.blue, title="Moving Average", linewidth=2)

// Plotting Candlestick Patterns
plotshape(isBullishCandle, title="Bullish Candle", location=location.belowbar, color=color.green, style=shape.labelup)
plotshape(isBearishCandle, title="Bearish Candle", location=location.abovebar, color=color.red, style=shape.labeldown)

// Plotting Support and Resistance Levels
//hline(r1, "Resistance Level 1", color=color.red, linestyle=hline.style_dotted)
//hline(s1, "Support Level 1", color=color.green, linestyle=hline.style_dotted)