MACD 지표를 기반으로 한 추세 추종 거래 전략


생성 날짜: 2023-09-27 16:46:38 마지막으로 수정됨: 2023-09-27 16:46:38
복사: 1 클릭수: 651
avatar of ChaoZhang ChaoZhang
1
집중하다
1617
수행원

개요

이 전략은 MACD 지표에 기초하여 트렌드 방향을 판단하고, 스토흐 지표와 결합하여 구체적인 구매 판매 작업을 수행한다. 이 전략은 더 긴 주기 MACD를 사용하여 큰 트렌드를 판단하고, 더 짧은 주기 스토흐를 시장에 출시한다.

전략 원칙

  1. MACD 지표로 큰 트렌드 방향을 판단하는 방법

    • 긴 주기 EMA 빠른 선, 느린 선, MACD 기둥 선을 계산

    • 다른 기간 MACD의 변화를 비교하여 트렌드 방향을 판단합니다.

  2. 스토흐 지표를 사용하여 특정 매매 지점을 결정합니다.

    • %K선과 %D선 계산

    • 스톡은 초고매 초고매 지역 근처에서 이탈하여 다시 상승하여 구매/판매 신호로 나타납니다.

  3. 트렌드 방향과 Stoch 신호를 결합하여 구매 및 판매 작업을 수행합니다.

    • 대주기 MACD가 상승할 때, 스토흐는 구매 신호가 발생하여 더 많은 것을합니다.

    • 대주기 MACD가 하락했을 때, Stoch은 판매 신호가 발생하고, 코스닥이 하락했다.

  4. Stop Loss Stop Setup, 자금 관리를 최적화

우위 분석

  • 이 전략은 트렌드 추적과 오버 바이 오버 셀 지표가 결합되어 중·장선 트렌드를 효과적으로 포착할 수 있습니다.

  • MACD는 큰 방향을 판단하고, 스토흐는 거래 세부 사항을 처리하여 위험을 효과적으로 제어합니다.

  • 지표의 조합을 활용하여 지표 전략을 수립합니다.

  • 거래 위험을 관리하기 위한 상쇄장치를 설정

  • 다양한 시장 환경에 맞게 최적화 가능한 전략 매개 변수

위험 분석

  • 중장선 트렌드 판단에 오류가 있을 수 있으며, 역동적인 거래 손실로 이어질 수 있다.

  • Stoch 지표는 잘못된 신호를 만들어 수익이 적거나 손실을 초래합니다.

  • 동향이 바뀌면, 스톱로스 포인트가 뚫려 손실을 확대할 수 있습니다.

  • 수익 목표가 너무 크거나 너무 작으면 전략의 효과에 영향을 미칠 수 있습니다.

  • 잘못된 매개 변수 및 시장 환경 변화에 대한 적응 부족으로 인해 전략이 실패할 수 있습니다.

  • 트렌드 판단 방법을 최적화하고, 스토크 신호를 검증하고, 스톱 포지션을 조정하여 위험을 줄일 수 있습니다.

최적화 방향

  • 트렌드 판단의 정확성을 높이기 위해 MACD 변수 모음을 최적화합니다.

  • 거짓 신호를 피하기 위해 여러 시간 주기의 스토흐 지표를 고려하십시오.

  • 동적으로 시장 변동에 대응하기 위해 스톱 스톱 비율을 조정합니다.

  • 다른 지표 신호와 함께 verifies를 수행하여 신호의 효과를 향상시킵니다.

  • 다양한 품종 특성과 거래 시점에 따라 최적화 된 파라미터

  • 트렌드 방향을 판단하는 데 도움이 되는 기계 학습 알고리즘을 추가합니다.

  • 부적절하거나 과도한 추락을 방지하기 위한 결합량 지표

요약하다

이 전략은 MACD와 Stoch 두 지표의 장점을 통합하고, 위험을 통제하는 전제하에 중장선 추세를 포착하여 거래한다. 매개 변수 최적화, 손해 차단 설정, 신호 검증 등의 방법으로 전략 효과를 강화하고, 여러 가지 시장 환경에 적응할 수 있으며 실제 거래 가치를 가지고 있다. 최적화 공간이 남아 있으며, 매개 변수 설정을 계속 최적화하고, 신호 정확도를 높이고, 보조 기계 학습 등의 수단을 통해 전략을 더 포괄적이고 지능적으로 만들 수 있다.

전략 소스 코드
/*backtest
start: 2023-09-19 00:00:00
end: 2023-09-26 00:00:00
period: 10m
basePeriod: 1m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4

// strategy(title="自用策略v0.2",calc_on_order_fills=false,calc_on_every_tick =false, initial_capital=10000,commission_type=strategy.commission.percent, commission_value=0.00,overlay = true,default_qty_type = strategy.cash, default_qty_value = 10000)



//STOCH
periodD = input(3, title="%D Smoothing", minval=1)
periodK = input(14, title="%K Length", minval=1)
periodK2 = input(42, title="%K2 Length", minval=1)
periodK3 = input(126, title="%K3 Length", minval=1)
periodK4 = input(378, title="%K4 Length", minval=1)
periodK5 = input(14, title="%K5 Length", minval=1)
periodK6 = input(30, title="%K6 Length", minval=1)
smoothK = input(1, title="%K Smoothing", minval=1)
k = sma(stoch(close, high, low, periodK), smoothK)
k2 = sma(stoch(close, high, low, periodK2), smoothK*3)
k3 = sma(stoch(close, high, low, periodK3), smoothK*3*3)
k4 = sma(stoch(close, high, low, periodK4), smoothK*3*3*3)
d = sma(k, periodD)
all = (k+k2*3+k3*9+k4*18)/31
allp = sma(all, periodK6)



buffer = input(title="buffer", type=input.float, defval=0.3, minval = 0, step = 0.1)
b1 = close[1]* (1+buffer/100)
b2 = close[1]* (1-buffer/100)

//MACD
fast_length = input(title="Fast Length", defval=144)
slow_length = input(title="Slow Length", defval=312)

src = input(title="Source", defval=close)
signal_length = input(title="Signal Smoothing",  minval = 1, maxval = 200, defval = 108)
sma_source = input(title="Oscillator MA Type",  defval="EMA", options=["SMA", "EMA"])
sma_signal = input(title="Signal Line MA Type", defval="EMA", options=["SMA", "EMA"])

// Calculating
fast_ma = sma_source == "SMA" ? sma(src, fast_length) : ema(src, fast_length)
slow_ma = sma_source == "SMA" ? sma(src, slow_length) : ema(src, slow_length)
macd = fast_ma - slow_ma
signal = sma_signal == "SMA" ? sma(macd, signal_length) : ema(macd, signal_length)
hist = macd - signal
MACDCHA = input(title="MACDCHA步长", defval=30)
MACDCHA2 = input(title="MACDCHA步长2", defval=20)
MACDCHA3 = input(title="MACDCHA步长3", defval=10)
MACDCHA4 = input(title="MACDCHA步长4", defval=5)
MACDCHA5 = input(title="MACDCHA步长5", defval=3)
MACDCHA6 = input(title="MACDCHA步长6", defval=1)
HISTCHA = input(title="hist步长", defval=50)
macdcha = hist - hist[MACDCHA]
macdcha2 = hist - hist[MACDCHA2]
macdcha3 = hist - hist[MACDCHA3]
macdcha4 = hist - hist[MACDCHA4]
macdcha5 = hist - hist[MACDCHA5]
macdcha6 = hist - hist[MACDCHA6]
histcha = hist[HISTCHA]
var true2 = 0
var true2_1 = 0
var true2_2 = 0
var true2_3 = 0
var true2_4 = 0//延伸
var fangxiang =0
//确认方向
if(macdcha>=0 and macdcha2>=0 and macdcha3>=0 and macdcha4>=0 and macdcha5>=0 and macdcha6>=0)
    fangxiang := 1
    true2_2 := 0
if(macdcha<=0 and macdcha2<=0 and macdcha3<=0 and macdcha4<=0 and macdcha5<=0 and macdcha6<=0)
    fangxiang :=-1
    true2_1 := 1
//k3min = min(k3,k3[1],k3[2],k3[3],k3[4],k3[5],k3[6],k3[7],k3[8],k3[9],k3[10],k3[11],k3[12],k3[13],k3[14],k3[15],k3[16],k3[17],k3[18],k3[19],k3[20],k3[21],k3[22],k3[23],k3[24],k3[25],k3[26],k3[27],k3[28],k3[29],k3[30],k3[31],k3[32],k3[33],k3[34],k3[35],k3[36],k3[37],k3[38],k3[39],k3[40],k3[41],k3[42],k3[43],k3[44],k3[45],k3[46],k3[47],k3[48],k3[49],k3[50])
//k3max = max(k3,k3[1],k3[2],k3[3],k3[4],k3[5],k3[6],k3[7],k3[8],k3[9],k3[10],k3[11],k3[12],k3[13],k3[14],k3[15],k3[16],k3[17],k3[18],k3[19],k3[20],k3[21],k3[22],k3[23],k3[24],k3[25],k3[26],k3[27],k3[28],k3[29],k3[30],k3[31],k3[32],k3[33],k3[34],k3[35],k3[36],k3[37],k3[38],k3[39],k3[40],k3[41],k3[42],k3[43],k3[44],k3[45],k3[46],k3[47],k3[48],k3[49],k3[50])
allpmax = max(allp[1],allp[2],allp[3],allp[4],allp[5],allp[6])
allpmin = min(allp[1],allp[2],allp[3],allp[4],allp[5],allp[6])
if(histcha < 0 and macdcha>=0 and macdcha2>=0 and macdcha3>=0 and macdcha4>=0 and macdcha5>=0 and macdcha6>=0 and d < 20 and volume > volume[1] and true2_1 == 1 and allp>allp[1] and allp <80)//and k3max < 80  //and k3min < 30 and k3 >20 and k2<50
    strategy.entry("开多", true, comment = "开多") // and close > close[1] and cci1> MEA1
    true2_1 :=0
if(d >80)
    strategy.close( "开多", comment = "平多")
    true2_1 :=1

stop_loss=input(4, "做多止损 %", minval = 1, step = 1)
sl = strategy.position_avg_price * (1-stop_loss/100)
close_Stop = close < sl
if(close_Stop or(allp<20 and allp[1]>20))
    strategy.close( "开多", comment = "做多止损")
    true2_1 :=1
Target_profit=input(10, "做多止盈 %", minval = 1, step = 1)
tp = strategy.position_avg_price * (1+Target_profit/100)
close_Target = close > tp
strategy.close("开多", when = close_Target, comment ="做多盈利")


//空
if(histcha > 0 and macdcha<=0 and macdcha2<=0 and macdcha3<=0 and macdcha4<=0 and macdcha5<=0 and macdcha6<=0 and d > 80 and volume > volume[1] and true2_2 == 1 and allp<allp[1] and allp >20) // and k3max>70 and k3<80
    //strategy.entry("开空", comment = "开空") 
    strategy.entry("开空", strategy.short,comment ="开空")
    true2_2 := 0
if( d <20)
   // strategy.close(  comment = "平空")
    strategy.close("开空",  comment = "平空")
    true2_2 := 1

stop_loss2=input(4, "做空止损 %", minval = 1, step = 1)
sl2 = strategy.position_avg_price * (1+stop_loss2/100)
close_Stop2 = close > sl2
if(close_Stop2 or(allp>80 and allp[1]<80))
    strategy.close( "开空", comment = "做空止损")
    true2_2 == 1
Target_profit2=input(10, "做空止盈 %", minval = 1, step = 1)
tp2 = strategy.position_avg_price * (1-Target_profit2/100)
close_Target2 = close < tp2
strategy.close("开空", when = close_Target2, comment ="做空盈利")