모멘텀 트렌드 팔로잉 전략


생성 날짜: 2023-11-07 16:49:49 마지막으로 수정됨: 2023-11-07 16:49:49
복사: 0 클릭수: 650
avatar of ChaoZhang ChaoZhang
1
집중하다
1617
수행원

모멘텀 트렌드 팔로잉 전략

개요

이 전략은 이동 평균과 거래량에 대한 트렌드 분석을 기반으로 동적 지표를 설정하고 트렌드를 추적하는 방식으로 거래합니다.

전략 원칙

  1. 클로즈 가격의 EMA 평균선과 거래량의 누적 EMA 평균선을 계산합니다.
  2. 클로즈가 EMA를 입었을 때 상승 추세로 판단하여 다중 수로 조작합니다.
  3. 계속 상승할 때, 클로즈 상위에서 2배의 EMA의 평균선을 통과할 때, 추가 포지션을 추가합니다.
  4. RSI를 설정하여 RSI가 90을 넘으면 1/3을 평행하여 수익을 얻습니다.
  5. 클로즈가 EMA를 통과하면 추락 추세로 판단하여 모든 상위 포지션을 평행합니다.
  6. 클로즈가 EMA를 통과했을 때 하향으로 판단하여 하위 작업을 수행합니다.
  7. 스톱 라인을 설정하고, 스톱 라인은 입수 가격의 고정된 비율입니다.
  8. 빈 머리는 여러 머리와 같은 방식으로 수익을 얻습니다.

우위 분석

이 전략의 주요 장점은 다음과 같습니다.

  1. EMA 평균선을 사용하여 트렌드를 판단하여 트렌드를 효과적으로 추적할 수 있습니다.
  2. 거래량의 누적 EMA를 사용하여 실제 트렌드 변화를 판단합니다.
  3. 동력 지수 RSI를 추적하여 수익을 얻습니다.
  4. 리스크가 통제되고, 손해배상 경계가 있습니다.
  5. 다른 상황에 적응할 수 있고, 융통성 있게 조정할 수 있는 파라미터

위험 분석

이 전략의 주요 위험은 다음과 같습니다.

  1. EMA 평균이 지연되어 전환점을 놓칠 수 있습니다.
  2. 거래액이 실제 트렌드를 반영하지 않을 수도 있습니다.
  3. 고정 비율 상쇄는 너무 기계화 될 수 있습니다.
  4. PARAMETERS 너무 많아서 조회하기가 어렵습니다.
  5. 거래 빈도, 거래 비용

위험 해결 방법:

  1. EMA 파라미터를 최적화하고 지연을 줄입니다.
  2. 다른 지표와 함께 거래량을 확인하는 신호
  3. 시장 상황에 따라 최적화된 스톱포인트
  4. 기본 설정만 유지하기 위한 간단한 매개 변수
  5. 적절히 느슨한 중지 라인 및 거래 빈도

최적화 방향

이 전략은 다음과 같은 부분에서 최적화될 수 있습니다.

  1. 다양한 EMA 변수 설정을 테스트하여 최적의 변수 조합을 찾습니다.
  2. 입시 신호의 강도를 판단하기 위해 VOLUME 배수를 늘립니다.
  3. MACD, KD 등의 다른 지표와 결합하여 입학 확정
  4. 특정 주식의 특성에 따라 최적화된 스톱 로즈 비율
  5. 거래 빈도를 최적화하고 거래 비용을 절감합니다.

요약하다

이 전략은 전체적으로 평행선 시스템을 기반으로 한 트렌드 추적 전략이다. 핵심 아이디어는 EMA를 사용하여 트렌드 방향을 결정하고, VOLUME 동력 지표와 함께 진입을 확인한다. 매개 변수 최적화를 통해 지속적으로 최적화할 수 있으며, 다른 지표가 추가 확인이 될 수 있도록 보조한다. 전체적으로 유연한 트렌드 추적 전략이며, 숙련된 사용 후 좋은 수익을 얻을 수 있다.

전략 소스 코드
/*backtest
start: 2023-10-30 00:00:00
end: 2023-11-06 00:00:00
period: 5m
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/
// © mohanee

//@version=4
strategy("EMA_cumulativeVolume_crossover[Strategy]", overlay=true, pyramiding=5, default_qty_type=strategy.percent_of_equity,  default_qty_value=20, initial_capital=10000)


emaLength= input(25, title="EMA Length", minval=1, maxval=200)
cumulativePeriod = input(100,  title="cumulative volume Period", minval=1, maxval=200)


riskCapital = input(title="Risk % of capital", defval=10, minval=1)
stopLoss=input(8,title="Stop Loss",minval=1)
takePartialProfits=input(true, title="take partial profits  (percentage same as stop loss)")

tradeDirection=input(title="Trade Direction", defval="LONG", options=["LONG", "SHORT"])

avgPrice = (high + low + close) / 3
avgPriceVolume = avgPrice * volume

cumulPriceVolume = sum(avgPriceVolume, cumulativePeriod)
cumulVolume = sum(volume, cumulativePeriod)

cumValue = cumulPriceVolume / cumulVolume

emaVal=ema(close, emaLength)

emaCumValue1=ema(cumValue, emaLength)
emaCumValue2=ema(cumValue, emaLength*2)

emaCumValueHistory=ema(cumValue[emaLength], emaLength)


//vwapVal1=vwap(hlc3)

rsiVal=rsi(close,5)

plotEma=plot(emaVal, title="EMA", color=color.green,  transp=25)
//plot(vwapValue, title="Cumulate Volumne", color=color.orange,  linewidth=2, transp=25)
//plot(vwapVal1, title="vwapVal1", color=color.purple,  linewidth=1, transp=25)
plotCum=plot(emaCumValue1, title="emaVwapValue", color=color.purple,  linewidth=2, transp=35)
plot(emaCumValue2, title="emaVwapValue", color=color.yellow,  linewidth=3, transp=25)
fill(plotEma,plotCum, color=emaVal>emaCumValue1 ? color.lime : color.red, transp=35, title="ema and cum area")

plot(emaCumValueHistory, title="emaCumValueHistory", color=color.black,  linewidth=2, transp=25)



//bgcolor(emaVal>vwapValue?color.blue:color.purple)    

//Entry--
//Echeck how many units can be purchased based on risk manage ment and stop loss
qty1 = (strategy.equity  * riskCapital / 100 ) /  (close*stopLoss/100)  

//check if cash is sufficient  to buy qty1  , if capital not available use the available capital only
qty1:= (qty1 * close >= strategy.equity ) ? (strategy.equity / close) : qty1

//strategy.entry(id="LE",comment="LE", long=true, qty=qty1, when=crossover(emaVal, vwapValue)  and (tradeDirection=="LONG") )    //emaVal>vwapValue and crossover(close , emaVal)

strategy.entry(id="LE",comment="LE", long=true, qty=qty1, when=strategy.position_size==0 and crossover(emaVal, emaCumValue1)  and (tradeDirection=="LONG") )    //emaVal>vwapValue and crossover(close , emaVal)

//re-entry
rentryCondition1=strategy.position_size>1 and emaVal > emaCumValue1 and emaCumValue1>emaCumValue2 and crossover(close, emaCumValue2) and close>open and  (tradeDirection=="LONG")
strategy.entry(id="LE",comment="LE RE", long=true, qty=qty1, when=rentryCondition1 )

rentryCondition2=strategy.position_size>1 and emaVal > emaCumValue1 and emaCumValue1>emaCumValueHistory and crossover(close, emaCumValueHistory) and close>open and  (tradeDirection=="LONG")
//strategy.entry(id="LE",comment="LE RE", long=true, qty=qty1, when=rentryCondition2 )    


//stoploss
stopLossVal=  strategy.position_size>=1 ?  (strategy.position_avg_price * (1-(stopLoss*0.01) )) : 0.00

//draw initil stop loss
//plot(strategy.position_size>=1 ? stopLossVal : na, color = color.purple , style=plot.style_linebr,  linewidth = 2, title = "stop loss")

//partial exits
takeProfit=  strategy.position_size>=1 ?  (strategy.position_avg_price * (1+(1*0.01) )) : ( close[1] * 2 )
//if(takePartialProfits==true)
    //strategy.close(id="LE", comment="Partial"+tostring(close-strategy.position_avg_price, "###.##") , qty=strategy.position_size/3 , when = (tradeDirection=="LONG" ) and close>takeProfit and crossunder(close, emaVal) )    //close<close[1] and close[1]<close[2] and close[2]<close[3])

strategy.close(id="LE", comment="PExit Points=>"+tostring(close-strategy.position_avg_price, "###.##") , qty=strategy.position_size/3 , when = (tradeDirection=="LONG" ) and  takePartialProfits == true and close>=takeProfit and crossunder(rsiVal,90) )

profitVal=    strategy.position_size>=1 ?  (strategy.position_avg_price * (1+(1*0.01) )) : ( close[1] * 2 )

//strategy.close(id="LE" , comment="LE Exit Points="+tostring(close-strategy.position_avg_price, "###.##"), when=crossunder(emaVal, vwapValue) and (tradeDirection=="LONG") )

strategy.close(id="LE" , comment="Exit Points=>"+tostring(close-strategy.position_avg_price, "###.##"), when=  crossunder(emaVal, emaCumValue1) and (tradeDirection=="LONG") )


strategy.close(id="LE" , comment="SL Exit Loss="+tostring(close-strategy.position_avg_price, "###.##"), when= close < stopLossVal   and (tradeDirection=="LONG") )


//for short  you dont have to wait crossodown of ema, falling is speed , so just check if close crossing down vwapVal
strategy.entry(id="SE",comment="SE", long=false, qty=qty1, when=crossunder(emaVal, emaCumValue1) and (tradeDirection=="SHORT") )    //emaVal>vwapValue and crossover(close , emaVal)


//stoploss
stopLossValUpside=  abs(strategy.position_size)>=1 and tradeDirection=="SHORT" ?  (strategy.position_avg_price * (1+(stopLoss*0.01) )) : 0.00

//draw initil stop loss
//plot(abs(strategy.position_size)>=1 and tradeDirection=="SHORT" ? stopLossValUpside : na, color = color.purple , style=plot.style_linebr,  linewidth = 2, title = "stop loss")

//partial exits
shortTakeProfit=  abs(strategy.position_size)>=1 and tradeDirection=="SHORT" ?  (strategy.position_avg_price * (1-(stopLoss*0.01) )) : 0.00
if(takePartialProfits==true)
    strategy.close(id="SE", comment="Partial" , qty=strategy.position_size/3 , when = (tradeDirection=="SHORT"   ) and  crossover(rsiVal,15) )  //close<takeProfit and (emaVal - close)>8 )
  
//strategy.close(id="SE" , comment="SE Exit Points="+tostring(close-strategy.position_avg_price, "###.##"), when=crossover(emaVal, vwapValue) and (tradeDirection=="SHORT") )
//strategy.close(id="SE" , comment="SE Exit Points="+tostring(close-strategy.position_avg_price, "###.##"), when= abs(strategy.position_size)>=1 and ( (emaVal<emaCumValue1 and close>emaCumValue1 and open>emaCumValue1 and close>open )   or (crossover(emaVal,emaCumValue1))  ) and (tradeDirection=="SHORT") )

//strategy.close(id="SE" , comment="SL Exit Loss="+tostring(close-strategy.position_avg_price, "###.##"), when= abs(strategy.position_size)>=1 and  close > stopLossValUpside   and (tradeDirection=="SHORT"   ) )
strategy.close(id="SE" , comment="SL Exit Loss="+tostring(close-strategy.position_avg_price, "###.##"), when= abs(strategy.position_size)>=1 and  crossover(emaVal, emaCumValue1)   and (tradeDirection=="SHORT"   ) )