이 전략은 MACD 지표에 기초하여 트렌드 방향을 파악하고 Stoch 지표를 사용하여 특정 구매 및 판매 결정을합니다. 입출입 및 출출에 대한 주요 트렌드와 짧은 주기의 Stoch를 결정하기 위해 장기 주기의 MACD를 채택합니다.
MACD 지표를 이용한 주요 트렌드 방향 판단
빠른 EMA, 느린 EMA 및 MACD 히스토그램 계산
추세를 결정하기 위해 다른 주기에 MACD 움직임을 비교
스톡 지표를 사용하여 특정 구매 및 판매 지점을 식별
직선 %K와 직선 %D를 계산합니다
거래 신호로 스톡이 다시 반등하면서 과잉 구매 또는 과잉 판매 구역 근처의 격차
트렌드 방향과 스톡 신호를 기반으로 구매 및 판매 결정을 내리는 것
주요 주기 MACD가 상승하고 Stoch 구매 신호가 나타나면 긴 거리를 가십시오.
주요 주기 MACD가 떨어지고 주식 판매 신호가 나타나면 단축합니다.
위험 관리 최적화를 위해 손해를 멈추고 이익을 취하는 설정
추세 추종 및 과잉 매수 과잉 매매 지표를 결합하면 중장기 추세를 효과적으로 파악 할 수 있습니다.
MACD는 주요 방향을 결정하고 Stoch는 거래 세부 사항을 처리하여 위험을 줄입니다.
체계적인 전략을 수립하기 위해 지표 조합을 최대한 활용
스톱 로스 및 영업 리스크를 설정하여 거래 리스크를 제어합니다.
최적화 가능한 매개 변수
중장기 트렌드 판단이 정확하지 않은 경우 상반된 거래 손실이 발생할 수 있습니다.
스톡의 잘못된 신호는 적당한 이익이나 손실을 초래합니다.
트렌드 변경, 손실을 확장 시 Stop Loss 포인트가 깨질 수 있습니다.
부적절한 수익 목표 수준은 전략 성과에 영향을 미칩니다.
비효율적인 매개 변과 변화하는 환경에 적응하지 못하는 것은 전략을 무효화시킬 수 있습니다.
트렌드 판단을 최적화하고, 스톡 신호를 확인하고, 스톱 로스를 조정하고, 이윤을 취함으로써 위험을 줄일 수 있습니다.
트렌드 판단 정확성을 향상시키기 위해 MACD 매개 변수 혼합을 최적화하십시오.
잘못된 신호를 피하기 위해 다중 주기를 고려
시장 변동성을 조정하기 위해 스톱 로스 및 영업률을 동적으로 조정합니다.
타당성을 확인하고 향상시키기 위해 다른 표시 신호를 추가합니다.
다양한 제품과 거래 세션의 특성에 따라 매개 변수를 최적화합니다.
트렌드 방향 판단을 돕기 위해 기계 학습 모델을 도입
부적절한 추격 또는 과도한 추종을 피하기 위해 부피 표시기를 포함합니다.
이 전략은 중장기 트렌드를 파악하고 위험을 제어하는 동안 MACD 및 스톡 지표의 강점을 통합합니다. 매개 변수를 최적화하고 스톱 로스 및 영리 설정, 신호 검증 등을 통해 다양한 시장 조건에서 효과적 일 수 있습니다. 추가 매개 변수 조정, 신호 정확성 향상 및 기계 학습을 통합하여 개선 할 여지가 있습니다. 전략은 더 포괄적이고 지능적 일 수 있습니다.
/*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 ="做空盈利")