이 글은 트렌드 동력을 판단하여 양적 거래를하는 전략에 대해 자세히 설명합니다. 이 전략은 평균선, MACD, RSI와 같은 지표를 사용하여 가격 동력을 판단하여 중장선 트렌드 기회를 잡습니다.
1 전략
이 전략의 주요 판단 지표는 다음과 같습니다.
EMA 평균은 다른 주기의 가격 동향을 판단합니다.
MACD는 단기 동력이 변하는지를 판단합니다.
RSI: 과매매 중인지 아닌지 판단하기 위해
ATR, 스톱 손실과 스톱 위치를 계산한다.
이 지표들을 종합하여, 가격에 지속적인, 강력한 돌파구가 있을 때, 트렌드가 시작되는 것을 확인하고, 거래 신호를 형성한다.
단기 EMA 평균선이 여러 번 역전되면, 종합으로 판단하고, 장기 EMA를 뚫을 때까지는 진입하지 않는다.
MACDImplement momentum change 판단력, RSI 회피 상위에서 바닥에 닿기 . ATR 설정 스톱 손실 스톱 제어 단위 위험 .
2 전략적 장점
이 전략의 가장 큰 장점은 중장선 트렌드의 시작을 효과적으로 판단할 수 있는 지표가 상호 보완된다는 것입니다.
또 다른 장점으로는 Stop Loss Stop Setup이 있는데, 이는 트렌드를 고정시켜 수익을 창출하고, 위험을 통제할 수 있게 해준다.
마지막으로, EMA 주기는 계층화되어, 순차적으로 다른 강도의 추세로 들어갈 수 있다.
그러나 이 전략에는 다음과 같은 위험도 있습니다.
우선, 추세를 판단하는 데 지연이 있을 수 있고, 공백이 있을 수 있다.
두 번째, 너무 급진적이어서 을 당할 위험이 있습니다.
마지막으로, 스트레스를 풀기 위해서는 심리적 준비가 필요합니다.
네 가지 내용
이 글은 트렌드 동력 판단에 기반한 양적 전략에 대해 상세히 소개한다. 이는 평균선, MACD, RSI 등의 지표를 종합적으로 사용하여 트렌드 방향을 판단한다. 변수를 최적화하여 위험을 제어하고 안정적인 수익을 얻을 수 있다. 그러나 지표 지연 등의 문제가 발생할 경우 주의가 필요하다.
/*backtest
start: 2023-08-14 00:00:00
end: 2023-08-30 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=3
strategy("QuantCat Mom Finder Strateg (1H)", overlay=true)
//Series to sum the amount of crosses in EMA for sideways trend/noise filtering
//can change EMA lengths, can change to SMA's/WMA's e.t.c
lookback_value = 60
minMA = 20
midMA = 40
maxMA = 60
ema25_crossover = (crossover(close, ema(close, minMA))) == true ? 1 : 0
ema25_crossover_sum = sum(ema25_crossover, lookback_value) ///potentially change lookback value to alter results
ema50_crossover = (crossover(close, ema(close, midMA))) == true ? 1 : 0
ema50_crossover_sum = sum(ema50_crossover, lookback_value) ///potentially change lookback value to alter results
ema75_crossover = (crossover(close, ema(close, maxMA))) == true ? 1 : 0
ema75_crossover_sum = sum(ema75_crossover, lookback_value) ///potentially change lookback value to alter results
ema25_crossunder = (crossunder(close, ema(close, minMA))) == true ? 1 : 0
ema25_crossunder_sum = sum(ema25_crossunder, lookback_value) ///potentially change lookback value to alter results
ema50_crossunder = (crossunder(close, ema(close, midMA))) == true ? 1 : 0
ema50_crossunder_sum = sum(ema50_crossunder, lookback_value) ///potentially change lookback value to alter results
ema75_crossunder = (crossunder(close, ema(close, maxMA))) == true ? 1 : 0
ema75_crossunder_sum = sum(ema75_crossunder, lookback_value) ///potentially change lookback value to alter results4
//Boolean series declaration
//can change amount of times crossed over the EMA verification to stop sideways trend filtering (3)
maxNoCross=2
macdmidlinebull=-0.5
macdmidlinebear=0.5
[macdLine, signalLine, histLine] = macd(close, 12, 26, 9)
//---------------
//Series Creation
bullishMacd = (macdLine > signalLine) and (macdLine > macdmidlinebull) ? true : false
bearishMacd = (macdLine < signalLine) and (macdLine < macdmidlinebear) ? true : false
bullRsiMin = 50 //53 initial values
bullRsiMax = 60 //61
bearRsiMin = 40 //39
bearRsiMax = 50 //47
basicBullCross25bool = ((ema25_crossover_sum < ema50_crossover_sum)
and (ema25_crossover_sum < ema75_crossover_sum)
and (ema25_crossover_sum < maxNoCross)
and crossover(close, ema(close, minMA)) and (rsi(close, 14) > bullRsiMin)
and (rsi(close, 14) < bullRsiMax) and (bullishMacd == true)) ? true : false
basicBullCross50bool = ((ema50_crossover_sum < ema25_crossover_sum)
and (ema50_crossover_sum < ema75_crossover_sum)
and (ema50_crossover_sum < maxNoCross)
and crossover(close, ema(close, midMA)) and (rsi(close, 14) > bullRsiMin)
and (basicBullCross25bool == false)
and (rsi(close, 14) < bullRsiMax) and (bullishMacd == true)) ? true : false
basicBullCross75bool = ((ema75_crossover_sum < ema25_crossover_sum)
and (ema75_crossover_sum < ema50_crossover_sum)
and (ema75_crossover_sum < maxNoCross)
and crossover(close, ema(close, maxMA)) and (rsi(close, 14) > bullRsiMin)
and (basicBullCross25bool == false) and (basicBullCross50bool == false)
and (rsi(close, 14) < bullRsiMax) and (bullishMacd == true)) ? true : false
basicBearCross25bool = ((ema25_crossunder_sum < ema50_crossunder_sum)
and (ema25_crossunder_sum < ema75_crossunder_sum)
and (ema25_crossunder_sum < maxNoCross)
and crossunder(close, ema(close, minMA)) and (rsi(close, 14) <bearRsiMax)
and (rsi(close, 14) > bearRsiMin) and (bearishMacd == true)) ? true : false
basicBearCross50bool = ((ema50_crossunder_sum < ema25_crossunder_sum)
and (ema50_crossunder_sum < ema75_crossover_sum)
and (ema50_crossunder_sum < maxNoCross)
and crossunder(close, ema(close, midMA)) and (rsi(close, 14) < bearRsiMax)
and (basicBearCross25bool == false)
and (rsi(close, 14) > bearRsiMin) and (bearishMacd == true)) ? true : false
basicBearCross75bool = ((ema75_crossunder_sum < ema25_crossunder_sum)
and (ema75_crossunder_sum < ema50_crossunder_sum)
and (ema75_crossunder_sum < maxNoCross)
and crossunder(close, ema(close, maxMA)) and (rsi(close, 14) < bearRsiMax)
and (basicBearCross25bool == false) and (basicBearCross50bool == false)
and (rsi(close, 14) > bearRsiMin) and (bearishMacd == true)) ? true : false
//STRATEGY
//can change lookback input on ATR
atrLkb = input(14, minval=1, title='ATR Stop Period')
atrRes = input("D", title='ATR Resolution')
atr = security(syminfo.tickerid, atrRes, atr(atrLkb))
longCondition = (basicBullCross25bool or basicBullCross50bool or basicBullCross75bool) == true
if (longCondition)
strategy.entry("Long", strategy.long)
shortCondition = (basicBearCross25bool or basicBearCross50bool or basicBearCross75bool) == true
if (shortCondition)
strategy.entry("Short", strategy.short)
// Calc ATR Stops
// can change atr multiplier to affect stop distance/tp distance, and change "close" to ema values- could try ema 50
stopMult = 0.6 //0.6 is optimal
longStop = na
longStop := shortCondition ? na : longCondition and strategy.position_size <=0 ? close - (atr * stopMult) : longStop[1]
shortStop = na
shortStop := longCondition ? na : shortCondition and strategy.position_size >=0 ? close + (atr * stopMult) : shortStop[1]
//Calc ATR Target
targetMult = 2.2 //2.2 is optimal for crypto x/btc pairs
longTarget = na
longTarget := shortCondition ? na : longCondition and strategy.position_size <=0 ? close + (atr*targetMult) : longTarget[1]
shortTarget = na
shortTarget := longCondition ? na : shortCondition and strategy.position_size >=0 ? close - (atr*targetMult) : shortTarget[1]
// Place the exits
strategy.exit("Long ATR Stop", "Long", stop=longStop, limit=longTarget)
strategy.exit("Short ATR Stop", "Short", stop=shortStop, limit=shortTarget)
//Bar color series
longColour = longCondition ? lime : na
shortColour = shortCondition ? red : na
// Plot the stoplosses and targets
plot(longStop, style=linebr, color=red, linewidth=2, title='Long ATR Stop')
plot(shortStop, style=linebr, color=red, linewidth=2, title='Short ATR Stop')
plot(longTarget, style=linebr, linewidth=2, color=lime, title='Long ATR Target')
plot(shortTarget, linewidth=2, style=linebr, color=lime, title='Long ATR Target')
barcolor(color=longColour)
barcolor(color=shortColour)
alertcondition(((basicBullCross25bool or basicBullCross50bool or basicBullCross75bool)==true), title='Long Entry', message='Bullish Momentum Change!')
alertcondition(((basicBearCross25bool or basicBearCross50bool or basicBearCross75bool)==true), title='Short Entry', message='Bearish Momentum Change!')