
쌍평평선 돌파 전략은 두 개의 다른 주기에서 움직이는 평균의 교차로 구매 시드널을 기반으로 한 트렌드 추적 전략이다. 이 전략은 빠른 평균과 느린 평균의 교차점을 거래 입시점으로 사용하고, 교차 후 트렌드 방향을 판단하고 그에 따른 상위 또는 공수 위치를 구축한다. 그것은 중간 수준의 트렌드를 포착 할 수 있으며, 불필요한 변동으로 인한 거래 빈도 문제가 줄어들 수 있습니다.
이 전략은 두 개의 이동 평균을 사용한다: 빠른 MA와 느린 MA. 빠른 MA 사이클은 일반적으로 단기적인 가격 변화를 포착하기 위해 짧은 기간에 설정된다 (예: 15 주기); 느린 MA 사이클은 일반적으로 긴 기간에 설정된다 (예: 21 주기), 주요 트렌드 방향을 판단하기 위해. 전략의 거래 신호는 두 MA의 교차로부터 온다: 빠른 MA 상에서 느린 MA를 통과할 때 구매 신호; 빠른 MA 아래에서 느린 MA를 통과할 때 판매 신호.
다양한 MA 주기 포트폴리지를 설정하여 전략이 트렌드를 잡는 시간의 길이를 조정할 수 있다. 짧은 MA 포트폴리지는 짧은 소기간의 가격 변동 기회를 잡을 수 있다. 더 긴 MA 포트폴리지는 긴 라인 레벨의 트렌드만을 잡을 수 있는 흔들림을 필터링할 수 있다.
이 전략은 또한 위험 관리 모듈을 포함합니다: 중지, 중지, 이동 중지. 이것은 단일 거래의 최대 손실을 제한하고 전체 수익을 보호하는 데 도움이됩니다.
두 가지 전략은 다음과 같은 장점을 가지고 있습니다.
이중 일률적 전략은 다음과 같은 몇 가지 측면에 초점을 맞추고 있습니다.
이러한 위험은 MA 매개 변수를 조정하고, 필터링 조건을 추가하고, 스톱 로직을 최적화함으로써 개선되고 최적화될 수 있다.
이중 일률적인 전략은 다음과 같은 측면에서 최적화될 수 있습니다.
이러한 최적화와 개선을 통해 전략의 성공률, 수익률, 리스크 수익률을 크게 향상시킬 수 있습니다.
쌍평선 돌파구 전략은 전반적으로 실행 및 최적화하기 쉬운 트렌드 추적 전략입니다. 그것은 작동의 단순성, 유연한 조정 가능성과 위험 제어 가능성의 장점을 가지고 있으며, 양적 거래의 입문 전략으로 매우 적합합니다. 지속적인 테스트 및 최적화를 통해이 전략은 지속적으로 개선 될 수 있으며 양적 전략이 될 잠재력을 가지고 있습니다.
/*backtest
start: 2022-12-10 00:00:00
end: 2023-06-16 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=3
strategy(title = "Silent Trader Strategy", shorttitle = "Silent Trader", overlay = true, pyramiding = 0, default_qty_type = strategy.cash, default_qty_value = 1000, commission_value = 0.0675, initial_capital = 1000, currency = currency.USD, calc_on_order_fills = true, calc_on_every_tick = true)
maFastSource = input(defval = ohlc4, title = "Fast MA Source")
maFastLength = input(defval = 15, title = "Fast MA Period", minval = 1)
maSlowSource = input(defval = ohlc4, title = "Slow MA Source")
maSlowLength = input(defval = 21, title = "Slow MA Period", minval = 1)
tradeInvert = input(defval = false, title = "Invert Trade Direction?")
inpTakeProfit = input(defval = 100, title = "Take Profit percentage(0.1%)", minval = 0)
inpStopLoss = input(defval = 100, title = "Stop Loss", minval = 0)
inpTrailStop = input(defval = 0, title = "Trailing Stop Loss", minval = 0)
inpTrailOffset = input(defval = 0, title = "Trailing Stop Loss Offset", minval = 0)
useTakeProfit = inpTakeProfit >= 1 ? inpTakeProfit : na
useStopLoss = inpStopLoss >= 1 ? inpStopLoss : na
useTrailStop = inpTrailStop >= 1 ? inpTrailStop : na
useTrailOffset = inpTrailOffset >= 1 ? inpTrailOffset : na
useTimeLimit = input(defval = true, title = "Use Start Time Limiter?")
startYear = input(defval = 2018, title = "Start From Year", minval = 0, step = 1)
startMonth = input(defval = 05, title = "Start From Month", minval = 0,step = 1)
startDay = input(defval = 01, title = "Start From Day", minval = 0,step = 1)
startHour = input(defval = 00, title = "Start From Hour", minval = 0,step = 1)
startMinute = input(defval = 00, title = "Start From Minute", minval = 0,step = 1)
startTimeOk() =>
inputTime = timestamp(syminfo.timezone, startYear, startMonth, startDay, startHour, startMinute)
timeOk = time > inputTime ? true : false
r = (useTimeLimit and timeOk) or not useTimeLimit
maFast = ema(maFastSource, maFastLength)
maSlow = sma(maSlowSource, maSlowLength)
fast = plot(maFast, title = "Fast MA", color = #26A69A, linewidth = 1, style = line, transp = 50)
slow = plot(maSlow, title = "Slow MA", color = #EF5350, linewidth = 1, style = line, transp = 50)
aboveBelow = maFast >= maSlow ? true : false
tradeDirection = tradeInvert ? aboveBelow ? false : true : aboveBelow ? true : false
if( startTimeOk() )
enterLong = not tradeDirection[1] and tradeDirection
exitLong = tradeDirection[1] and not tradeDirection
strategy.entry( id = "Long", long = true, when = enterLong )
//strategy.close( id = "Long", when = exitLong )
enterShort = tradeDirection[1] and not tradeDirection
exitShort = not tradeDirection[1] and tradeDirection
strategy.entry( id = "Short", long = false, when = enterShort )
//strategy.close( id = "Short", when = exitShort )
strategy.exit("Exit Long", from_entry = "Long", profit = close * useTakeProfit / 1000 / syminfo.mintick, loss = close * useStopLoss / 1000 / syminfo.mintick, trail_points = close * useTrailStop / 1000 / syminfo.mintick, trail_offset = close * useTrailOffset / 1000 / syminfo.mintick)
strategy.exit("Exit Short", from_entry = "Short", profit = close * useTakeProfit / 1000 / syminfo.mintick, loss = close * useStopLoss / 1000 / syminfo.mintick, trail_points = close * useTrailStop / 1000 / syminfo.mintick, trail_offset = close * useTrailOffset / 1000 / syminfo.mintick)