이 전략은 MACD 지표에 기초하여 트렌드 방향을 판단하고, 스토흐 지표와 결합하여 구체적인 구매 판매 작업을 수행한다. 이 전략은 더 긴 주기 MACD를 사용하여 큰 트렌드를 판단하고, 더 짧은 주기 스토흐를 시장에 출시한다.
MACD 지표로 큰 트렌드 방향을 판단하는 방법
긴 주기 EMA 빠른 선, 느린 선, MACD 기둥 선을 계산
다른 기간 MACD의 변화를 비교하여 트렌드 방향을 판단합니다.
스토흐 지표를 사용하여 특정 매매 지점을 결정합니다.
%K선과 %D선 계산
스톡은 초고매 초고매 지역 근처에서 이탈하여 다시 상승하여 구매/판매 신호로 나타납니다.
트렌드 방향과 Stoch 신호를 결합하여 구매 및 판매 작업을 수행합니다.
대주기 MACD가 상승할 때, 스토흐는 구매 신호가 발생하여 더 많은 것을합니다.
대주기 MACD가 하락했을 때, Stoch은 판매 신호가 발생하고, 코스닥이 하락했다.
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 ="做空盈利")