피타고라스 캔들스틱 MACD 지표 발산 추세 추종 전략


생성 날짜: 2024-02-04 15:06:58 마지막으로 수정됨: 2024-02-04 15:06:58
복사: 0 클릭수: 745
avatar of ChaoZhang ChaoZhang
1
집중하다
1617
수행원

피타고라스 캔들스틱 MACD 지표 발산 추세 추종 전략

개요

이 전략은 MACD 지표와 MACD 기둥선을 계산하여 MACD 기둥선과 가격 움직임 사이의 오차 신호를 감지하고 거래 신호를 생성합니다. 가격이 높았지만 MACD 기둥선이 새로운 높이를 만들지 않았을 때, 상반기 오차 신호를 생성합니다. 가격이 낮았지만 MACD 기둥선이 새로운 낮은 것을 감지했을 때, 상반기 오차 신호를 생성합니다.

전략 원칙

이 전략의 핵심 원칙은 MACD 지표와 MACD 기둥이 가격 추세 변화를 반영하는 특성을 사용하여 MACD 기둥과 가격 사이의 이탈 신호를 감지하여 거래 신호의 촉발 조건으로 사용하는 것입니다.

구체적으로, 전략은 먼저 MACD 라인, 신호 라인 및 MACD 기둥 라인을 계산한다. 그리고 프랙탈 함수를 정의하여 MACD 기둥 라인의 피크와 밸리를 검출하고, 지역 극대값과 극소값을 추출한다. 그리고 가격의 최고 가격과 최저 가격을 결합하여 MACD 기둥 라인과 가격 사이에 거리가 있는지 판단한다.

가격이 새로운 고를 만들지만 MACD 기둥이 새로운 고를 만들지 않을 때, regulark_bearish_div 하락 신호를 생성합니다. 가격이 새로운 낮은 것을 만들지만 MACD 기둥이 새로운 낮은 것을 만들지 않을 때, regulark_bullish_div 하락 신호를 생성합니다.

마지막으로, 전략은 하락의 외향과 보드의 외향 신호가 발생했을 때, 각각 하락과 더 많은 명령을 내리고 ATR 중지, 중단으로 포지션을 종료합니다.

우위 분석

이 전략에는 다음과 같은 장점이 있습니다.

  1. MACD 기둥선과 가격 사이의 거리를 이용하면 가격 추세의 전환을 사전에 잡을 수 있다.

  2. ATR 중지 손실 차단 설정은 합리적이고, 단일 거래의 최대 손실을 효과적으로 제어한다.

  3. 트렌드 추적을 통해 수익을 최대한 확보할 수 있습니다.

  4. 변수 설정은 합리적이며, 일부 노이즈 트레이딩 신호를 필터링 할 수 있다.

  5. 전략적 논리는 명확하고 이해하기 쉽고 실무에서 검증하기 쉽습니다.

위험 분석

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

  1. MACD의 이탈은 반드시 가격의 반전을 가져오지 않으며, 잘못된 신호의 위험이 있다.

  2. Stop Loss Stop setting은 부적절하게 설정되어 너무 큰 손실이나 너무 작은 수익을 초래할 수 있습니다.

  3. 신호주기가 너무 짧고, 노이즈로 인한 것일 수 있으며, 적절한 필터링을 해야 한다.

  4. 거래 종류와 매개 변수 설정이 일치하지 않아 전략 효과에도 영향을 미칩니다.

대응방법:

  1. 적절한 크기를 늘리고, 잘못된 신호를 필터링한다.

  2. ATR을 스톱로스 스톱 지표로 사용하며, ATR 곱수를 조정하여 단일 거래 위험을 제어한다.

  3. 다른 거래 품종에 대해 다른 매개 변수를 선택하십시오. 매개 변수를 최적화하여 최적의 매개 변수 조합을 찾으십시오.

최적화 방향

이 전략은 다음과 같은 방향으로 최적화될 수 있습니다.

  1. 더 복잡한 역확인, 예를 들어 Volume 역확인.

  2. MACD 변수를 최적화하여 최적의 변수 조합을 찾습니다.

  3. ATR 중지 손해 차단의 배수를 최적화하십시오.

  4. 기계 학습 알고리즘을 추가하여 신호의 신뢰성을 판단하는 데 도움을 줍니다.

  5. 모델 예측을 증가시켜 가격 반전의 가능성을 판단한다.

  6. 시장 환경 변화에 따라 전략 변수를 동적으로 조정합니다.

요약하다

전체적으로, 이 피다코 트 MACD 지표는 트렌드 추적 전략에서 벗어나, MACD 기둥선과 가격 사이의 이탈 특성을 활용하여 트렌드를 포착한다. ATR 스톱 로드 설정은 합리적이며, 단일 거래 위험을 제어할 수 있다. 이 전략의 논리는 명확하고 이해하기 쉽고 실장 검사를 할 가치가 있다. 이후 여러 측면에서 전략을 최적화하여 더 나은 효과를 얻을 수 있다.

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

// This Pine Script™ code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © bigwin_sun
// copyright: Tradingvue Limited    

//@version = 5
strategy(title = "Demigod : CDMA histogram Divergence strategy", shorttitle = "Demigod strategy", overlay = false, pyramiding = 100)

//macd input
fastMA = input.int(13, title = "fast Length", minval = 1,     group = "CDMA")
slowMA = input.int(34, title = "slow Length", minval = 1,     group = "CDMA")
src          = input.source(title = "source", defval = close, group = "CDMA")
signalSmooth = input.int(9, title="ma Length", minval = 1,    group = "CDMA")
//Divergenc
divLength    = input.int(title = "Divergenc Length",   defval = 5, minval = 1,   maxval = 50,  inline = "ATRLength",  group = "Divergence")
divStren     = input.float(title="Divergenc Strength", defval = 2, minval = 1.0, maxval = 5.0, inline = "ATRLength",  group = "Divergence")

//atr input
atrLength = input.int(13, title = "ATR Length", minval = 1,   inline = "ATRLength", group = "ATR")
m         = input.float(1.0,  "ATR multyple",   minval = 0.5, inline = "ATRLength", group = "ATR", step = 0.5)
collong   = input.color(color.teal, title = "upper color",  inline = "ATR显示", group = "ATR")
colshort  = input.color(color.red,  title = "under color",  inline = "ATR显示", group = "ATR")

// MACD---------------------------------------------------------------------------------------------------------------------------------
DivOffset = -2
macdLine   = ta.ema(src, fastMA) - ta.ema(src, slowMA)    
signalLine = ta.ema(macdLine, signalSmooth)
histogram  = macdLine - signalLine

histogramColor = if histogram > 0
    histogram > histogram[1] ? color.lime : color.green
else 
    histogram < histogram[1] ? color.maroon : color.red

// cdma histogram
plot(histogram, title = "MACD histogram", linewidth = 2, style = plot.style_histogram, color = histogramColor)
plot(0,         title = "zero line",      linewidth = 1,                               color = color.gray)

// Divergenc calculation-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
//peak / valley fundation
f_top_fractal(_src)=>_src[4] < _src[2] and _src[3] < _src[2] and _src[2] > _src[1] and _src[2] > _src[0] and _src > 0
f_bot_fractal(_src)=>_src[4] > _src[2] and _src[3] > _src[2] and _src[2] < _src[1] and _src[2] < _src[0] and _src < 0
f_fractalize(_src)=>f_top_fractal(_src) ? 1 : f_bot_fractal(_src) ? -1 : 0

//peak / valley value
fractal_top1 = f_fractalize(histogram) > 0 ? true : false //histogram[2] : na
fractal_bot1 = f_fractalize(histogram) < 0 ? true : false //histogram[2] : na

//previouse peak or valley
high_prev1  = ta.valuewhen(fractal_top1, histogram[2], 0)[2]
high_price1 = ta.valuewhen(fractal_top1, high[2], 0)[2]
low_prev1   = ta.valuewhen(fractal_bot1, histogram[2], 0)[2]
low_price1  = ta.valuewhen(fractal_bot1, low[2], 0)[2]

//Divergenc : cdma histogram against candle value
regular_bearish_div1 = high[2] > high_price1 + divStren and histogram[2] < high_prev1 / divStren and ta.barssince(fractal_top1[1]) > divLength
regular_bullish_div1 = low[2]  < low_price1 - divStren  and histogram[2] > low_prev1 / divStren  and ta.barssince(fractal_bot1[1]) > divLength

//-------------------------cdma Divergenc range------------------------------------------------
//histogramColor
col1 = regular_bearish_div1 ? color.red : na
col2 = regular_bullish_div1 ? #00FF00EB : na
//plot
plot(title='看跌背离', series= fractal_top1 ? histogram[2] : na, color=col1, linewidth=3, offset=DivOffset)
plot(title='看涨背离', series= fractal_bot1 ? histogram[2] : na, color=col2, linewidth=3, offset=DivOffset)

// calculate ATR				--------------------------------------------------------------------------------------------------------------------------------------------------
atr = ta.ema(ta.tr(true), atrLength) * m
up = atr + high
dw = low - atr

//stratety : enrty and exit---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
if regular_bearish_div1 and fractal_top1
//if regular_bullish_div1 and fractal_bot1
    //label.new(bar_index, histogram[2], text = "Short", textcolor = color.white, color = color.gray,  style = label.style_label_lower_left)
    strategy.entry("Short", strategy.short, qty = 1)
    strategy.exit("exitShort", "Short", stop = up, limit = dw - atr)
if regular_bullish_div1 and fractal_bot1
//if regular_bearish_div1 and fractal_top1   
    //label.new(bar_index, histogram[2], text = "Long", textcolor = color.white, color = color.fuchsia, style = label.style_label_upper_left)
	strategy.entry("Long", strategy.long, qty = 1)
    strategy.exit("exitLong", "Long", stop = dw, limit = up + atr)