
부린띠와 이동평준선을 교차하는 것을 거래 신호로 사용하여 시장의 추세를 자동으로 식별할 수 있는 양적 전략을 구현하고 스톱스톱 손실 규칙에 따라 거래를 수행합니다.
이 전략은 주로 부린띠 지표와 이동평균 지표의 교차 신호를 기반으로 거래한다. 구체적으로, 그것은 동시에 부린띠 중간 궤도, 부린띠 위 궤도, 그리고 5 ~ 200 일 길이의 7 개의 이동 평균을 사용합니다. 가격이 아래에서 위쪽으로 부린띠 중간 궤도를 돌파 할 때 구매 신호를 발생; 가격이 위에서 아래로 부린띠 위 궤도를 돌파 할 때 판매 신호를 발생, 트렌드 추적을 구현한다.
또한, 전략은 moveToFract의 다공간 판단 지표를 도입한다. 이 지표는 단기 및 장기 이동 평균의 순서 배열을 계산하여 현재 시장의 움직임이 상향 또는 하향이라고 판단하여 충격적인 상황에서 잘못된 신호를 피한다. 마지막으로, 구성 가능한 스톱 스톱 손실 규칙과 결합하여 보다 완전한 트렌드 추적 거래 전략을 형성한다.
이 전략은 전반적으로 매우 실용적인 트렌드 추적 전략이다. 그것은 지표의 교차를 사용하여 결정을 내리고, 트렌드 판단 모듈을 추가하여 잘못된 신호를 효과적으로 제거할 수 있다. 정지 중지 손실을 구성 한 후, 트렌드를 충분히 추적하여 거래를 할 수 있으며, 더 나은 수익을 얻을 수 있다. 파라미터 포지션을 조정하고 더 많은 필터를 추가함으로써, 이 전략은 더욱 최적화 될 수 있으며, 더 많은 시장 환경에 적응할 수 있으며, 많은 개선 공간과 응용 전망이 있다.
/*backtest
start: 2023-10-24 00:00:00
end: 2023-11-23 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/
// © HeWhoMustNotBeNamed
//@version=4
strategy("BuyTheDip", overlay=true, initial_capital = 100000, default_qty_type = strategy.percent_of_equity, default_qty_value = 100, commission_type = strategy.commission.percent, pyramiding = 1, commission_value = 0.01, calc_on_order_fills = true)
MAType = input(title="Moving Average Type", defval="sma", options=["ema", "sma", "hma", "rma", "vwma", "wma"])
exitType = input(title="Exit Strategy", defval="Signal", options=["Signal", "TrailingStop", "Both"])
LookbackPeriod = input(30, minval=10,step=10)
BBStdDev = input(2, minval=1, maxval=10, step=0.5)
BBLength = input(60, minval=5, step=5)
atrLength = input(22)
atrMult = input(6)
tradeDirection = input(title="Trade Direction", defval=strategy.direction.all, options=[strategy.direction.all, strategy.direction.long, strategy.direction.short])
backtestYears = input(10, minval=1, step=1)
includePartiallyAligned = true
f_getMovingAverage(source, MAType, length)=>
ma = sma(source, length)
if(MAType == "ema")
ma := ema(source,length)
if(MAType == "hma")
ma := hma(source,length)
if(MAType == "rma")
ma := rma(source,length)
if(MAType == "vwma")
ma := vwma(source,length)
if(MAType == "wma")
ma := wma(source,length)
ma
f_getTrailingStop(atr, atrMult)=>
stop = close - atrMult*atr
stop := strategy.position_size > 0 ? max(stop, stop[1]) : stop
stop
f_getMaAlignment(MAType, includePartiallyAligned)=>
ma5 = f_getMovingAverage(close,MAType,5)
ma10 = f_getMovingAverage(close,MAType,10)
ma20 = f_getMovingAverage(close,MAType,20)
ma30 = f_getMovingAverage(close,MAType,30)
ma50 = f_getMovingAverage(close,MAType,50)
ma100 = f_getMovingAverage(close,MAType,100)
ma200 = f_getMovingAverage(close,MAType,200)
upwardScore = 0
upwardScore := close > ma5? upwardScore+1:upwardScore
upwardScore := ma5 > ma10? upwardScore+1:upwardScore
upwardScore := ma10 > ma20? upwardScore+1:upwardScore
upwardScore := ma20 > ma30? upwardScore+1:upwardScore
upwardScore := ma30 > ma50? upwardScore+1:upwardScore
upwardScore := ma50 > ma100? upwardScore+1:upwardScore
upwardScore := ma100 > ma200? upwardScore+1:upwardScore
upwards = close > ma5 and ma5 > ma10 and ma10 > ma20 and ma20 > ma30 and ma30 > ma50 and ma50 > ma100 and ma100 > ma200
downwards = close < ma5 and ma5 < ma10 and ma10 < ma20 and ma20 < ma30 and ma30 < ma50 and ma50 < ma100 and ma100 < ma200
upwards?1:downwards?-1:includePartiallyAligned ? (upwardScore > 5? 0.5: upwardScore < 2?-0.5:upwardScore>3?0.25:-0.25) : 0
inDateRange = time >= timestamp(syminfo.timezone, year(timenow) - backtestYears, 01, 01, 0, 0)
exitBySignal = exitType == "Signal" or exitType == "Both"
exitByTrailingStop = exitType == "TrailingStop" or exitType == "Both"
maAlignment = f_getMaAlignment(MAType,includePartiallyAligned)
atr = atr(atrLength)
trailingStop = f_getTrailingStop(atr, atrMult)
maAligned = highest(maAlignment,LookbackPeriod)
[middle, upper, lower] = bb(close, BBLength, BBStdDev)
buyCondition = maAligned == 1 and (crossover(close, lower) or crossover(close, middle))
buyExitCondition = crossunder(close, upper)
strategy.entry("Buy", strategy.long, when=buyCondition and inDateRange, oca_name="oca_buy")
strategy.close("Buy", when=buyExitCondition and exitBySignal)
strategy.exit("ExitBuy", "Buy", stop = trailingStop, when=exitByTrailingStop )