
이 전략은 마이크 스포트 (MACD) 지표와 다중 시간 프레임 평균선을 활용하여 트렌드 및 트렌드 역전 신호를 종합적으로 활용하는 장기 및 양방향 거래 전략을 형성합니다. 이 전략은 트렌드 상황에서 추가 수익을 얻을 수 있으며, 역전 기회를 잡을 수도 있습니다.
서로 다른 주기의 두 개의 EMA 평균선 그룹이 협력하여 다중 시간 프레임 필터로 장구 방향을 판단합니다: 15 분 빠른 EMA는 1 시간 느린 EMA보다 낮은 필터입니다. 15 분 빠른 EMA는 1 시간 느린 EMA보다 낮은 필터입니다.
마이크 가락이 오차를 형성하는 것을 관찰할 때 (柱状線與價格偏離), 판단은 뒤집을 수 있다.
보잉 필터 개시시에는 황소시장이 이탈한 것을 발견하면 ((가격이 신고고 MACD가 혁신하지 않은 높은), MACD 0축에 파장을 기다리는 동안, 더 많은 것을하십시오. 보잉 필터 개시시에는 곰시장이 이탈한 것을 발견하면 ((가격이 신하고 MACD가 혁신하지 않은 낮은), MACD 0축 아래로 파장을 기다리는 동안, 공백을하십시오.
스톱 손실 방식은 지속적으로 추적하는 유형의 스톱이며, 최고 가격과 최저 가격의 변동 범위에 따라 계산된다. 스톱 손실은 스톱 손실의 일정한 배수이다.
MACD 기둥선이 0축 방향으로 통과할 때 평행한다.
다중 시간 프레임 EMA 포트폴리오는 대주기 경향에 대한 판단을 할 수 있으며, 역동적인 거래를 피할 수 있다.
MACD는 역전 기회를 잡을 수 있는 역전 전략에 적합하다.
동적 추적 중지 (Dynamic Tracking Stop Loss) 는 수익을 고정하고 손실을 방지합니다.
스톱 손실 계산에 따라 스톱 거리가 예상 수익을 얻을 수 있다.
EMA 일률 그룹은 필터로 협력하여 회수 기간 동안 방향 판단 오류가 발생할 수 있습니다.
MACD가 부진한 반발을 보였기 때문에 수익성이 떨어질 수 있습니다.
스탠드 거리 설정이 잘못되어 너무 느슨하거나 너무 꽉 잡혀있을 수 있습니다.
“이런 일이 벌어진다면, 우리는 더 나은 삶을 살 수 있을 것이다.
하지만, 이 모든 것은, 이 모든 것은, 이 모든 것은, 이 모든 것은, 이 모든 것은, 이 모든 것은, 이 모든 것은, 이 모든 것은, 이 모든 것은.
더 정확한 추세 판단을 위해 다양한 기량 조합의 EMA를 테스트 할 수 있습니다.
MACD 변수를 좀 더 민감한 변수 조합으로 조정할 수 있습니다.
다양한 스톱 비율 설정을 테스트할 수 있다.
추가적인 필터링 조건을 추가하여 가짜 반동에 빠지지 않도록 할 수 있습니다. 예를 들어, 더 높은 시간 프레임에 EMA가 전체 경향을 판단하는 것을 추가합니다.
역전 시점 확인 조건을 최적화하여 역전 추세가 충분히 성숙되도록 할 수 있다.
이 전략은 종합적으로 트렌드 필터링, 트렌드 반전 신호, 동적 스로프스 관리 등의 수단을 적용하여 순차적으로 작동할 수 있으며 반전을 잡을 수 있다. 매개 변수를 조정하고 필터링 조건을 최적화함으로써 보다 광범위한 시장 환경에 적응할 수 있으며, 위험을 통제하는 조건에서 안정적인 수익을 얻을 수 있다. 이 전략은 어느 정도 보편적성과 실용적 가치를 가지고 있으며, 다시간 프레임워크와 지표 통합 사용의 전형적인 대표자이다.
/*backtest
start: 2023-01-01 00:00:00
end: 2023-06-16 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © maxits
//@version=4
// MACD Divergence + Multi Time Frame EMA
// This Strategy uses 3 indicators: the Macd and two emas in different time frames
// The configuration of the strategy is:
// Macd standar configuration (12, 26, 9) in 1H resolution
// 10 periods ema, in 1H resolution
// 5 periods ema, in 15 minutes resolution
// We use the two emas to filter for long and short positions.
// If 15 minutes ema is above 1H ema, we look for long positions
// If 15 minutes ema is below 1H ema, we look for short positions
// We can use an aditional filter using a 100 days ema, so when the 15' and 1H emas are above the daily ema we take long positions
// Using this filter improves the strategy
// We wait for Macd indicator to form a divergence between histogram and price
// If we have a bullish divergence, and 15 minutes ema is above 1H ema, we wait for macd line to cross above signal line and we open a long position
// If we have a bearish divergence, and 15 minutes ema is below 1H ema, we wait for macd line to cross below signal line and we open a short position
// We close both position after a cross in the oposite direction of macd line and signal line
// Also we can configure a Take profit parameter and a trailing stop loss
// strategy("Macd + MTF EMA",
// overlay=true,
// initial_capital=1000,
// default_qty_value=20,
// default_qty_type=strategy.percent_of_equity,
// commission_value=0.1,
// pyramiding=0)
// User Inputs
i_time = input(defval = timestamp("01 Apr 2018 13:30 +0000"), title = "Start Time", type = input.time) // Starting time for backtest
f_time = input(defval = timestamp("30 Sep 2021 13:30 +0000"), title = "Finish Time", type = input.time) // Finishing time for backtest
long_pos = input(title="Show Long Positions", defval=true, type=input.bool) // Enable Long Positions
short_pos = input(title="Show Short Positions", defval=true, type=input.bool) // Enable Short Positions
src = input(close, title="Source") // Price value to calculate indicators
emas_properties = input(title="============ EMAS Properties ============", defval=false, type=input.bool) // Properties
mtf_15 = input(title="Fast EMA", type=input.resolution, defval="15") // Resolucion para MTF EMA 15 minutes
ma_15_length = input(5, title = "Fast EMA Period") // MTF EMA 15 minutes Length
mtf_60 = input(title="Slow EMA", type=input.resolution, defval="60") // Resolucion para MTF EMA 60 minutes
ma_60_length = input(10, title = "Slow EMA Period") // MTF EMA 60 minutes Length
e_new_filter = input(title="Enable a Third Ema filter?", defval=true, type=input.bool)
slowest_ema_len = input(100, title = "Fast EMA Period")
slowest_ema_res = input(title="Slowest EMA", type=input.resolution, defval="D")
macd_res = input(title="MACD TimeFrame", type=input.resolution, defval="") // MACD Time Frame
macd_properties = input(title="============ MACD Properties ============", defval="") // Properties
fast_len = input(title="Fast Length", type=input.integer, defval=12) // Fast MA Length
slow_len = input(title="Sign Length", type=input.integer, defval=26) // Sign MA Length
sign_len = input(title="Sign Length", type=input.integer, defval=9)
syst_properties = input(title="============ System Properties ============", defval="") // Properties
lookback = input(title="Lookback period", type=input.integer, defval=14, minval=1) // Candles to lookback for swing high or low
multiplier = input(title="Profit Multiplier based on Stop Loss", type=input.float, defval=6.0, minval=0.1) // Profit multiplier based on stop loss
shortStopPer = input(title="Short Stop Loss Percentage", type=input.float, defval=1.0, minval=0.0)/100
longStopPer = input(title="Long Stop Loss Percentage", type=input.float, defval=2.0, minval=0.0)/100
// Indicators
[macd, signal, hist] = security(syminfo.tickerid, macd_res, macd(src, fast_len, slow_len, sign_len))
ma_15 = security(syminfo.tickerid, mtf_15, ema(src, ma_15_length))
ma_60 = security(syminfo.tickerid, mtf_60, ema(src, ma_60_length))
ma_slo = security(syminfo.tickerid, slowest_ema_res, ema(src, slowest_ema_len))
// Macd Plot
col_grow_above = #26A69A
col_grow_below = #FFCDD2
col_fall_above = #B2DFDB
col_fall_below = #EF5350
plot(macd, color=color.new(color.blue, 0)) // Solo para visualizar que se plotea correctamente
plot(signal, color=color.new(color.orange, 0))
plot(hist, style=plot.style_columns,
color=(hist >= 0 ? (hist[1] < hist ? col_grow_above : col_fall_above) :
(hist[1] < hist ? col_grow_below : col_fall_below)))
// MTF EMA Plot
bullish_filter = e_new_filter ? ma_15 > ma_60 and ma_60 > ma_slo : ma_15 > ma_60
bearish_filter = e_new_filter ? ma_15 < ma_60 and ma_60 < ma_slo : ma_15 < ma_60
plot(ma_15, color=color.new(color.blue, 0))
plot(ma_60, color=color.new(color.yellow, 0))
plot(e_new_filter ? ma_slo : na, color = ma_60 > ma_slo ? color.new(color.green, 0) : color.new(color.red, 0))
////////////////////////////////////////////// Logic For Divergence
zero_cross = false
zero_cross := crossover(hist,0) or crossunder(hist,0) //Cruce del Histograma a la linea 0
// plot(zero_cross ? 1 : na)
// MACD DIVERGENCE TOPS (Bearish Divergence)
highest_top = 0.0
highest_top := (zero_cross == true ? 0.0 : (hist > 0 and hist > highest_top[1] ? hist : highest_top[1]))
prior_top = 0.0
prior_top := (crossunder(hist,0) ? highest_top[1] : prior_top[1]) // Búsqueda del Maximo en MACD
// plot(highest_top)
// plot(prior_top)
highest_top_close = 0.0
highest_top_close := (zero_cross == true ? 0.0 : (hist > 0 and hist > highest_top[1] ? close : highest_top_close[1]))
prior_top_close = 0.0
prior_top_close := (crossunder(hist,0) ? highest_top_close[1] : prior_top_close[1]) // Búsqueda del Maximo en pRECIO
// plot(highest_top_close)
// plot(prior_top_close)
top = false
top := highest_top[1] < prior_top[1]
and highest_top_close[1] > prior_top_close[1]
and hist < hist[1]
and crossunder(hist,0) // Bearish Divergence: top == true
// MACD DIVERGENCE BOTTOMS (Bullish Divergence)
lowest_bottom = 0.0
lowest_bottom := (zero_cross == true ? 0.0 : (hist < 0 and hist < lowest_bottom[1] ? hist : lowest_bottom[1]))
prior_bottom = 0.0
prior_bottom := (crossover(hist,0) ? lowest_bottom[1] : prior_bottom[1])
lowest_bottom_close = 0.0
lowest_bottom_close := (zero_cross == true ? 0.0 : (hist < 0 and hist < lowest_bottom[1] ? close : lowest_bottom_close[1]))
prior_bottom_close = 0.0
prior_bottom_close := (crossover(hist,0) ? lowest_bottom_close[1] : prior_bottom_close[1])
bottom = false
bottom := lowest_bottom[1] > prior_bottom[1]
and lowest_bottom_close[1] < prior_bottom_close[1]
and hist > hist[1]
and crossover(hist,0) // Bullish Divergence: bottom == true
////////////////////////////////////////////// System Conditions //////////////////////////////////////////////
inTrade = strategy.position_size != 0 // In Trade
longTrade = strategy.position_size > 0 // Long position
shortTrade = strategy.position_size < 0 // Short position
notInTrade = strategy.position_size == 0 // No trade
entryPrice = strategy.position_avg_price // Position Entry Price
////////////////////////////////////////////// Long Conditions //////////////////////////////////////////////
sl = lowest(low, lookback) // Swing Low for Long Entry
longStopLoss = 0.0 // Trailing Stop Loss calculation
longStopLoss := if (longTrade)
astopValue = sl * (1 - longStopPer)
max(longStopLoss[1], astopValue)
else
0
longTakeProf = 0.0 // Profit calculation based on stop loss
longTakeProf := if (longTrade)
profitValue = entryPrice + (entryPrice - longStopLoss) * multiplier
max(longTakeProf[1], profitValue)
else
0
// Long Entry Conditions
if bottom and notInTrade and bullish_filter and long_pos
strategy.entry(id="Go Long", long=strategy.long, comment="Long Position")
// strategy.close(id="Go Long", when=zero_cross)
if longTrade
strategy.exit("Exit Long", "Go Long", limit = longTakeProf, stop = longStopLoss)
plot(longTrade and longStopLoss ? longStopLoss : na, title="Long Stop Loss", color=color.new(color.red, 0), style=plot.style_linebr)
plot(longTrade and longTakeProf ? longTakeProf : na, title="Long Take Prof", color=color.new(color.green, 0), style=plot.style_linebr)
////////////////////////////////////////////// Short Conditions //////////////////////////////////////////////
sh = highest(high, lookback) // Swing High for Short Entry
shortStopLoss = 0.0
shortStopLoss := if (shortTrade)
bstopValue = sh * (1 + shortStopPer)
min(shortStopLoss[1], bstopValue)
else
999999
shortTakeProf = 0.0
shortTakeProf := if (shortTrade)
SprofitValue = entryPrice - (shortStopLoss - entryPrice) * multiplier
min(SprofitValue, shortTakeProf[1])
else
999999
// Short Entry
if top and notInTrade and bearish_filter and short_pos
strategy.entry(id="Go Short", long=strategy.short, comment="Short Position")
// strategy.close(id="Go Short", when=zero_cross)
if shortTrade
strategy.exit("Exit Short", "Go Short", limit = shortTakeProf, stop = shortStopLoss)
plot(shortTrade and shortStopLoss ? shortStopLoss : na, title="Short Stop Loss", color=color.new(color.red, 0), style=plot.style_linebr)
plot(shortTrade and shortTakeProf ? shortTakeProf : na, title="Short Take Prof", color=color.new(color.green, 0), style=plot.style_linebr)