이동 평균 크로스 오버 및 상부 철도 돌파구 추진 전략

저자:차오장, 날짜: 2023-11-13 11:52:22
태그:

img

전반적인 설명

이 전략은 MACD 빠른 라인과 느린 라인의 크로스오버 신호를 다른 여러 지표에 기반한 판단과 결합하여 이동 평균 지표 라인의 돌파 신호를 적시에 파악하고 구매 또는 판매 결정을 내립니다. 단기 거래 전략에 속합니다.

전략 논리

  1. MACD 빠른 라인과 느린 라인의 교차를 주요 거래 신호로 사용하십시오. 빠른 라인이 느린 라인을 넘을 때 긴 지위를 취하십시오. 빠른 라인이 느린 라인을 넘을 때 짧은 지위를 취하십시오.

  2. 과잉 구매 및 과잉 판매 조건을 결정하기 위해 RSI 지표를 포함합니다. 중앙선 아래는 긴 것을 제안하고 위는 짧은 것을 제안합니다.

  3. 현재 폐쇄 가격을 특정 기간의 SMA 라인과 비교합니다. SMA 이하의 폐쇄 가격은 긴 것을 제안하고, 위의 것은 짧은 것을 제안합니다.

  4. 특정 기간의 가장 높은 값의 0.5 피보나치 레벨을 긴 저항으로 계산합니다. 특정 기간의 가장 낮은 값의 0.5 피보나치 레벨을 짧은 지원으로 계산합니다.

  5. 빠른 라인이 위로 넘어가고 가격이 지원 아래에 있을 때 긴 라인을 취하고 빠른 라인이 아래로 넘어가고 가격이 저항 위에 있을 때 짧은 라인을 취합니다.

  6. 트레일링 스톱 로스 메커니즘을 채택하십시오. 스톱 로스는 초기 엔트리 가격의 특정 비율로 고정됩니다. 손실이 특정 수준에 도달하면 점진적인 트레일링 스톱 로스로 전환합니다.

장점

  1. 이 전략은 클래식하고 효과적인 기술 지표 거래 신호인 MACD 크로스오버 신호를 완전히 활용합니다.

  2. RSI와 SMA와 같은 여러 지표에서 확인을 통합하면 잘못된 신호를 필터하고 신뢰성을 향상시킬 수 있습니다.

  3. 브레이크오웃 거래의 동적 지지 및 저항 수준을 계산하면 더 큰 추세를 파악할 수 있습니다.

  4. 트레일링 스톱 로스는 대부분의 수익을 확보하면서 위험을 조절할 수 있습니다.

  5. 전략 논리는 간단하고 명확하며 초보자도 쉽게 이해하고 마스터할 수 있습니다.

위험성

  1. MACD 지표는 문제점이 뒤쳐지고 최적의 입문 및 출구 지점을 놓칠 수 있습니다.

  2. 여러 가지 지표를 결합하면 복잡성과 충돌 신호의 위험이 증가합니다.

  3. 동적으로 지원과 저항을 계산할 때 잘못된 파열의 위험이 있습니다.

  4. 트래일링 스톱 로스는 강한 트렌드에서 조기에 종료될 수 있으며, 트렌드를 타는 데 실패합니다.

  5. 매개 변수는 반복적인 테스트와 최적화를 필요로 하고, 부적절한 매개 변수는 성능에 부정적인 영향을 미칩니다.

최적화 방향

  1. MACD 기간을 최적화하기 위해 다른 매개 변수 조합을 테스트합니다.

  2. 다차원 분석을 위해 볼링거 밴드, KDJ와 같은 더 많은 지표를 도입해야 합니다.

  3. 지원과 저항의 합리성을 판단하기 위해 더 많은 요소를 포함합니다.

  4. 시간 기반 또는 변동성 기반의 스톱 같은 더 고급 스톱 손실 메커니즘을 연구합니다.

  5. 자동 매개 변수 최적화를 위한 자동 최적화 모듈을 추가합니다.

요약

이 전략은 이동 평균 돌파 신호를 기회적으로 포착하기 위해 MACD, RSI, SMA 및 기타 지표를 결합합니다. 그것은 전형적인 단기 브레이크아웃 거래 전략에 속합니다. 신호 생성에는 약간의 지연이 있지만 매개 변수 최적화를 통해 정확도가 향상 될 수 있습니다. 전반적으로 이것은 간단하고 명확한 논리를 가진 전략이며 대부분의 사람들에게 이해하기 쉽고 추가 테스트 및 최적화에 가치가 있습니다.


/*backtest
start: 2023-11-05 00:00:00
end: 2023-11-09 23:00:00
period: 1m
basePeriod: 1m
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/
// © onurenginogutcu

//@version=4
strategy("R19 STRATEGY", overlay=true, calc_on_every_tick=true , margin_long=100, margin_short=100 ,  process_orders_on_close=true )



sym = input(title="Symbol", type=input.symbol, defval="BINANCE:BTCUSDT" , group = "SYMBOL") 
timeFrame = input(title="Strategy Decision Time Frame", type = input.resolution ,  defval="60")

adxlen = input(14, title="ADX Smoothing" , group = "ADX")
dilen = input(14, title="ADX DI Length", group = "ADX")
adxemalenght = input(30, title="ADX EMA", group = "ADX")
adxconstant = input(19, title="ADX CONSTANT", group = "ADX")

fibvar = input (title = "Fibo Look Back Canles" , defval = 50 , minval = 0 , group = "FIBO MACD SMA")
smaLookback = input (title = "SMA Look Back Candles" , defval = 30 , minval = 0 , group = "FIBO MACD SMA")
MACDFast = input (title = "MACD Fast Lenght" , defval = 15 , minval = 0 , group = "FIBO MACD SMA")
MACDSlow = input (title = "MACD Slow Lenght" , defval = 30 , minval = 0 , group = "FIBO MACD SMA")
MACDSmooth = input (title = "MACD Signal Smoothing" , defval = 9 , minval = 0 , group = "FIBO MACD SMA")
MACDLookback = input (title = "MACD Look Back Candles" , defval = 100 , minval = 0 , group = "FIBO MACD SMA")

trailingStopLong = input (title = "Trailing Long Stop %" , defval = 2.0 , step = 0.1, group = "TP & SL") * 0.01
trailingStopShort = input (title = "Trailing Short Stop %" , defval = 2.0 , step = 0.1 , group = "TP & SL") * 0.01
LongTrailingProfitStart = input (title = "Long Profit Start %" , defval = 2.0 , step = 0.1 , group = "TP & SL") * 0.01
ShortTrailingProfitStart = input (title = "Short Profit Start %" , defval = 2.0 , step = 0.1, group = "TP & SL") * 0.01

lsl = input(title="Max Long Stop Loss (%)",
     minval=0.0, step=0.1, defval=3.0, group = "TP & SL") * 0.01
     
ssl = input(title="Max Short Stop Loss (%)",
     minval=0.0, step=0.1, defval=2.5, group = "TP & SL") * 0.01
     
longtp = input(title="Long Take Profit (%)",
     minval=0.0, step=0.1, defval=100, group = "TP & SL") * 0.01
     
shorttp = input(title="Short Take Profit (%)",
     minval=0.0, step=0.1, defval=100, group = "TP & SL") * 0.01
     
capperc = input(title="Capital Percentage to Invest (%)",
     minval=0.0, maxval=100, step=0.1, defval=95, group = "CAPITAL TO INVEST") * 0.01
     

symClose = security(sym, timeFrame, close)
symHigh = security(sym, timeFrame, high)
symLow = security(sym, timeFrame, low)

atr = atr (14) 

/////////adx code

dirmov(len) =>
	up = change(symHigh)
	down = -change(symLow)
	plusDM = na(up) ? na : (up > down and up > 0 ? up : 0)
	minusDM = na(down) ? na : (down > up and down > 0 ? down : 0)
	truerange = rma(tr, len)
	plus = fixnan(100 * rma(plusDM, len) / truerange)
	minus = fixnan(100 * rma(minusDM, len) / truerange)
	[plus, minus]
adx(dilen, adxlen) =>
	[plus, minus] = dirmov(dilen)
	sum = plus + minus
	adx = 100 * rma(abs(plus - minus) / (sum == 0 ? 1 : sum), adxlen)
sig = adx(dilen, adxlen)
emasig = ema (sig , adxemalenght )


////////adx code over



i = ema (symClose , MACDFast) - ema (symClose , MACDSlow) 
r = ema (i , MACDSmooth)

sapust = highest (i , MACDLookback) * 0.729 
sapalt = lowest (i , MACDLookback) * 0.729  


simRSI = rsi (symClose , 50 ) 




fibtop = lowest (symLow , fibvar) + ((highest (symHigh , fibvar) - lowest (symLow , fibvar)) * 0.50)
fibbottom = lowest (symLow , fibvar) + ((highest (symHigh , fibvar) - lowest (symLow , fibvar)) * 0.50)





cond1 = 0
cond2 = 0
cond3 = 0
cond4 = 0


longCondition = crossover(i, r) and i < sapalt and sig > adxconstant and symClose < sma (symClose , smaLookback) and simRSI < sma (simRSI , 50) and symClose < fibbottom 
shortCondition = crossunder(i, r) and i > sapust and sig > adxconstant and  symClose > sma (symClose , smaLookback) and simRSI > sma (simRSI , 50) and symClose > fibtop 


//////////////////////probability long/short
if (crossover(i, r) and i < sapalt)
    cond1 := 35
else if (crossunder(i, r) and i > sapust)
    cond1 := -35
else
    cond1 := 0
    
if (symClose < sma (symClose , smaLookback))
    cond2 := 30
else if (symClose > sma (symClose , smaLookback))
    cond2 := -30
else
    cond2 := 0
    
if (simRSI < sma (simRSI , 50))
    cond3 := 25
else if (simRSI > sma (simRSI , 50))
    cond3 := -25
else
    cond3 := 0
    
if (symClose < fibbottom)
    cond4 := 10
else if (symClose > fibbottom)
    cond4 := -10
else
    cond4 := 0
    
probab = cond1 + cond2 + cond3 + cond4
////////////////////////////////////////////////////////////////

///////////////////////////////////////////STRATEGY ENTRIES AND STOP LOSSES /////
var startTrail = 0
var trailingLongPrice = 0.0
var trailingShortPrice = 0.0

if (longCondition and strategy.position_size == 0)
    strategy.entry("Long", strategy.long , qty = capperc * strategy.equity / close )

if (shortCondition and strategy.position_size == 0)
    strategy.entry("Short" , strategy.short , qty = capperc * strategy.equity / close )
    
    
if (strategy.position_size == 0)    
    trailingShortPrice := 0.0
    trailingLongPrice := 0.0  
    startTrail := 0
/////////////////////////////////strategy exit

if (strategy.position_size > 0 and close >= strategy.position_avg_price * (1 + LongTrailingProfitStart))
    startTrail := 1

if (strategy.position_size < 0 and close <= strategy.position_avg_price * (1 - ShortTrailingProfitStart))
    startTrail := -1
    



trailingLongPrice := if strategy.position_size > 0 and startTrail == 1
    stopMeasure = close * (1 - trailingStopLong)
    max (stopMeasure , trailingLongPrice [1])
else if strategy.position_size > 0 and startTrail == 0
    strategy.position_avg_price * (1 - lsl)


trailingShortPrice := if strategy.position_size < 0 and startTrail == -1
    stopMeasure = close * (1 + trailingStopShort)
    min (stopMeasure , trailingShortPrice [1])
else if strategy.position_size < 0 and startTrail == 0
    strategy.position_avg_price * (1 + ssl)




if (strategy.position_size > 0)
    strategy.exit("Exit Long", "Long", stop = trailingLongPrice , limit=strategy.position_avg_price*(1 + longtp))
 

if (strategy.position_size < 0)
    strategy.exit("Exit Short", "Short", stop = trailingShortPrice , limit=strategy.position_avg_price*(1 - shorttp))


////////////////////////vertical colouring signals
bgcolor(color=longCondition ? color.new (color.green , 70) : na)
bgcolor(color=shortCondition ? color.new (color.red , 70) : na)

plot (trailingLongPrice , color = color.green) ///long price trailing stop
plot (trailingShortPrice , color = color.red) /// short price trailing stop
plot (startTrail , color = color.yellow)
plot (probab , color = color.white) ////probability


더 많은