이동평균 범위 Engulfing 전략


생성 날짜: 2024-01-18 14:56:24 마지막으로 수정됨: 2024-01-18 14:56:24
복사: 0 클릭수: 330
1
집중하다
1212
수행원

이동평균 범위 Engulfing 전략

개요

이동 평균 간격 삼키는 전략은 이동 평균을 기반으로 한 트렌드 추적 전략이다. 그것은 두 개의 이동 평균의 교차점을 계산하여 가격 트렌드를 판단하고, 간격 관리와 결합하여 트렌드를 추적하여 수익을 창출한다.

전략 원칙

이 전략은 두 개의 이동 평균을 사용합니다: 빠른 선과 느린 선. 빠른 선의 변수가 작으면 가격 변화에 더 민감하게 반응합니다. 느린 선의 변수가 커지면 추세 판단이 더 신뢰할 수 있습니다. 빠른 선이 아래에서 느린 선을 통과하면 더 많이하고 빠른 선이 위에서 느린 선을 통과하면 공백을 만듭니다.

또한, 이 전략은 주요 트렌드 방향을 판단하는 데 사용되는 여러 보조 이동 평균을 도입하여 잘못된 조화를 방지합니다. 또한, HIGHEST 및 LOWEST 함수를 ATR과 결합하여 동적 스톱을 계산하여 수익을 잠금합니다.

각 거래에 대해, 이 전략은 고정된 수의 주문을 선택할 수 있으며, 또는 매개 변수에 따라 설정된 최대 손실 비율에 따라 동적으로 포지션을 계산할 수 있다. 후자는 각 거래의 위험을 일정 범위 내에서 제어할 수 있다.

우위 분석

  • 이중 이동 평균 시스템을 사용하여 가격 동향을 효과적으로 추적할 수 있습니다.
  • introduced 여러 보조 일선 및 방향 필터링 조건, 소음 거래를 줄일 수
  • 동적으로 스톱로스를 계산하고 포지션을 조정하여 거래당 최대 손실을 제한합니다.
  • 포지션 관리 시스템은 수익을 지수적으로 증가시킬 수 있으며 최대 인출은 일정 범위 내에서 제어됩니다.

위험 분석

  • 이중 이동 평균 전략은 재정기 동안 중매가 될 수 있습니다.
  • 보조 평행선과 필터 조건은 일부 거래 기회를 놓칠 수 있습니다.
  • 시장이 급격하게 변동할 때, 정지 손실이 뚫려 큰 손실을 초래할 수 있습니다.
  • 극한상황이 발생하면 큰 손실이 발생할 수 있습니다.

이동 평균의 매개 변수를 최적화하고, 보조 평균의 무게를 조정하고, 중지 손실 범위를 수정하는 방법을 사용하여 이러한 위험을 줄일 수 있습니다. 동시에 포지션 관리 규칙을 엄격하게 제어하여 단독 손실의 영향을 줄일 수 있습니다.

최적화 방향

이 전략은 다음과 같은 방향으로 최적화될 수 있습니다.

  1. 더 많은 종류의 이동 평균 조합을 테스트하여 최적의 변수를 찾습니다.
  2. 트렌드 강도 지표를 추가하여 트렌드 반전의 손실을 방지합니다.
  3. 더 똑똑한 손해제도를 위한 적응형 손해제도 연구
  4. 수익과 위험 사이의 균형을 맞추는 포지션 관리 프로그램을 최적화하십시오.

요약하다

이동 평균 간격 포식 전략은 전반적으로 매우 실용적인 수량 거래 전략이다. 그것은 동시 동시 트렌드 추적과 위험 통제의 장점을 겸비하고, 긴 라인 지점을 보유하기에 적합하다. 매개 변수 조정과 기능 확장의 최적화를 통해 이 전략은 더 안정적이고 지능화되어 더 지속적인 수익성을 얻을 수 있다.

전략 소스 코드
/*backtest
start: 2024-01-10 00:00:00
end: 2024-01-17 00:00:00
period: 45m
basePeriod: 5m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4

// This is a simple crossover Moving Average strategy, good for long term crypto trades. 
// It buys when the MA "X" crosses up the MA "Y", viceversa for shorts. 
// Both MAs are selectable from the Inputs section in the front panel. 
// There is also a Position Management option thats 
// sizes positions to have the same USD risk (using leverage) on each trade,
// based on the percentage distance to the stop loss level.
// If you turn this option on you will see how the profit 
// grows exponentially while the drawdown percentage almost remains the same.

strategy("4 MA Strat", overlay=true, pyramiding=1, 
     default_qty_type=strategy.percent_of_equity, 
     default_qty_value=100, 
     commission_value = 0.04, 
     initial_capital=100, 
     process_orders_on_close=false)

direction = input(0, title = "Strategy Direction", type=input.integer, minval=-1, maxval=1)
strategy.risk.allow_entry_in(direction == 0 ? strategy.direction.all : (direction < 0 ? strategy.direction.short : strategy.direction.long))

//Inputs
PSMGMT=input(defval=false, title="Position Management")
risk_per_trade=input(defval=5, title="Risk Per Trade % (for PSMGMT)", step=0.5)*.01

//SL & TP Inputs
i_SL=input(true, title="Use Swing Lo/Hi Stop Loss & Take Profit")
i_SwingLookback=input(10, title="Swing Lo/Hi Lookback")
i_SLExpander=input(defval=0, step=1, title="SL Expander")

i_MAFilter=input(false, title="Use MA4 as Bull / Bear filter")

//MA Type Selector
MAtype = input(false, title="----------------MA Selector-----------------")
MA1Period = input(9, title="MA1 Period")
MA1Type = input(title="MA1 Type", defval="EMA", options=["RMA", "SMA", "EMA", "WMA", "HMA", "ALMA"])
MA2Period = input(21, title="MA2 Period")
MA2Type = input(title="MA2 Type", defval="EMA", options=["RMA", "SMA", "EMA", "WMA", "HMA", "ALMA"])
MA3Period = input(50, title="MA3 Period")
MA3Type = input(title="MA3 Type", defval="SMA", options=["RMA", "SMA", "EMA", "WMA", "HMA", "ALMA"])
MA4Period = input(100, title="MA4 Period")
MA4Type = input(title="MA4 Type", defval="SMA", options=["RMA", "SMA", "EMA", "WMA", "HMA", "ALMA"])

//MA Selector 
MA1 = if MA1Type == "SMA"
    sma(close, MA1Period)
else
    if MA1Type == "EMA"
        ema(close, MA1Period)
    else
        if MA1Type == "WMA"
            wma(close, MA1Period)
        else
            if MA1Type == "RMA"
                rma(close, MA1Period)
            else
                if MA1Type == "HMA"
                    hma(close, MA1Period)
                else
                    if MA1Type == "ALMA"
                        alma(close, MA1Period, 0.85, 6)
                    
MA2 = if MA2Type == "SMA"
    sma(close, MA2Period)
else
    if MA2Type == "EMA"
        ema(close, MA2Period)
    else
        if MA2Type == "WMA"
            wma(close, MA2Period)
        else
            if MA2Type == "RMA"
                rma(close, MA2Period)
            else
                if MA2Type == "HMA"
                    hma(close, MA2Period)
                else
                    if MA2Type == "ALMA"
                        alma(close, MA2Period, 0.85, 6)
                            
MA3 = if MA3Type == "SMA"
    sma(close, MA3Period)
else
    if MA3Type == "EMA"
        ema(close, MA3Period)
    else
        if MA3Type == "WMA"
            wma(close, MA3Period)
        else
            if MA3Type == "RMA"
                rma(close, MA3Period)
            else
                if MA3Type == "HMA"
                    hma(close, MA3Period)
                else
                    if MA3Type == "ALMA"
                        alma(close, MA3Period, 0.85, 6)
                    
MA4 = if MA4Type == "SMA"
    sma(close, MA4Period)
else
    if MA4Type == "EMA"
        ema(close, MA4Period)
    else
        if MA4Type == "WMA"
            wma(close, MA4Period)
        else
            if MA4Type == "RMA"
                rma(close, MA4Period)
            else
                if MA4Type == "HMA"
                    hma(close, MA4Period)
                else
                    if MA4Type == "ALMA"
                        alma(close, MA4Period, 0.85, 6)
                    
// X Y Logic
x=input(title="x", defval="close", options=["MA1", "MA2", "MA3", "MA4", "close"])
y=input(title="y", defval="MA1", options=["MA1", "MA2", "MA3", "MA4", "close"])

X = if x == "MA1"
    MA1
else
    if x == "MA2"
        MA2
    else
        if x == "MA3"
            MA3
        else
            if x == "MA4"
                MA4
            else
                if x == "close"
                    close
                    
Y = if y == "MA1"
    MA1
else
    if y == "MA2"
        MA2
    else
        if y == "MA3"
            MA3
        else
            if y == "MA4"
                MA4
            else
                if y == "close"
                    close

//SL & TP Calculations
SwingLow=lowest(i_SwingLookback)
SwingHigh=highest(i_SwingLookback)
bought=strategy.position_size != strategy.position_size[1]
LSL=valuewhen(bought, SwingLow, 0)-((valuewhen(bought, atr(14), 0)/5)*i_SLExpander)
SSL=valuewhen(bought, SwingHigh, 0)+((valuewhen(bought, atr(14), 0)/5)*i_SLExpander)
islong=strategy.position_size > 0
isshort=strategy.position_size < 0
SL= islong ? LSL : isshort ? SSL : na

//Position Management Calculations
capital=strategy.equity
distance_to_long_stop_loss=1-(LSL/strategy.position_avg_price)
distance_to_short_stop_loss=(SSL/strategy.position_avg_price)-1
PS=(capital*risk_per_trade)/distance_to_long_stop_loss
SPS=(capital*risk_per_trade)/distance_to_short_stop_loss
PSqty=PS/close
SPSqty=SPS/close

//Strategy Calculations
MAFilter=close > MA4
BUY = crossover(X , Y) 
SELL = crossunder(X , Y) 
BUY2 = crossover(X , Y) and MAFilter
SELL2 = crossunder(X , Y) and not MAFilter

//Entries
strategy.entry("long", true, qty=PSMGMT ? PSqty : na, when=not i_MAFilter ? BUY : BUY2)
strategy.entry("short", false, qty=PSMGMT ? SPSqty : na, when=not i_MAFilter ? SELL : SELL2)

//Exits
if i_SL //and SL != na
    strategy.exit("longexit", "long", stop=LSL)
    strategy.exit("shortexit", "short", stop=SSL)
if i_MAFilter
    strategy.close("long", when=SELL)
    strategy.close("short", when=BUY)


//Plots
plot(i_SL ? SL : na, color=color.red, style=plot.style_cross, title="SL")
plot(MA1, color=color.green, linewidth=1, title="MA1")
plot(MA2, color=color.yellow, linewidth=2, title="MA2")
plot(MA3, color=color.red, linewidth=3, title="MA3")
plot(MA4, color=color.white, linewidth=3, title="MA4")
plotshape(BUY ? 1 : na, style=shape.triangleup, location=location.belowbar, color=color.green, title="Bullish Setup")
plotshape(SELL ? 1 : na, style=shape.triangledown, location=location.abovebar, color=color.red, title="Bearish Setup")


//Debugging Plots
plot(LSL, transp=100, title="SwingLow")
plot(bought ? 1:0, transp=100, title="bought")
plot(PSqty, title="PSqty", transp=100)
plot(SPSqty, title="SPSqty", transp=100)
plot(PS, title="PS", transp=100)
plot(SPS, title="SPS", transp=100)
plot(distance_to_long_stop_loss, title="distance to LSL", transp=100)
plot(distance_to_short_stop_loss, title="distance to SSL", transp=100)
plot(capital, title="equity", transp=100)