파란만장한 광대 스펙트럼 이동 평균 거래 전략

저자:차오장, 날짜: 2024-01-25 14:19:27
태그:

震荡型广谱移动平均线交易策略

개요

이 전략은 광선 이동 평균에 기반하여, 빠른 이동 평균의 금포크로 형성된 거래 신호이다. 광선 이동 평균은 단순한 이동 평균에서 흔들리는 이동 평균 등 다양한 유형을 커버하며, 파라미터에 의해 자유 조합을 조정할 수 있으며, 강력한 적응력을 가지고 있다.

전략적 원칙

이 전략은 변수 이동평균 함수를 사용하여 12가지의 다른 유형의 이동평균을 생성한다. 기본 원리는 빠른 라인 (Close MA) 과 느린 라인 (Open MA) 을 계산하는 두 개의 이동평균을 계산하는 것이다. 빠른 라인이 느린 라인을 통과할 때 구매 신호를 생성하고 빠른 라인이 느린 라인을 통과할 때 판매 신호를 생성한다. 동시에 정지 해상도 매개 변수를 설정하면 자동 해상도 매개를 구현할 수 있다.

핵심 논리는 변수 함수를 통해 두 개의 이동 평균을 생성하는 것입니다.closeSeries = variant(basisType, close, basisLen, offsetSigma, offsetALMA)그리고openSeries = variant(basisType, open, basisLen, offsetSigma, offsetALMA)▲variant 함수는 12가지 다른 유형의 평균 계산 방법을 포괄하고 있으며, basisType 변수를 통해 자유롭게 선택할 수 있다. 따라서 광역 이동 평균의 조합이 실현된다.

기본적인 거래 신호 생성 논리는 다음과 같습니다.longCond = xlong그리고shortCond = xshort이 말은 고속도로에서 느린 노선을 사용하는 것이 더 많고, 고속도로에서 느린 노선을 사용하는 것이 빈자리라는 뜻입니다.

전략 입상 규칙은 롱컨드 또는 쇼트컨드 조건이 충족될 때 각각 더공을 하는 것이다. 스톱손손손금리 규칙은 가격 움직임이 미리 설정된 스톱손손금리점에 도달할 때 스톱손손이나 스톱손을 하는 것이다.

장점 분석

이 전략의 가장 큰 장점은 다양한 유형의 이동 평균을 자유롭게 조합할 수 있다는 것입니다. 다른 시장의 다른 주기에 따라 어떤 이동 평균이 가장 적합한지는 확실하지 않습니다. 이 전략은 강력한 사용자 지정 기능을 제공합니다. 사용자는 반복 테스트를 통해 최적의 파라미터 조합을 결정하여 특정 시장에 최적의 방안을 만들 수 있습니다.

또 다른 장점은 전략 논리가 간단하고 명확하지만 강력한 기능을 제공한다는 것입니다. 사용자가 쉽게 이해하고 사용할 수 있습니다. 동시에 풍부한 입력 매개 변수는 고급 사용자에게 충분한 최적화 공간을 제공합니다.

위험 분석

이 전략의 가장 큰 위험은 광스펙트럼 이동평균이 자체적으로 어느 정도 뒤떨어져 있다는 것이다. 이상적인 가격 돌파가 발생하면 더 큰 손실이 발생할 수 있다. 또한, 파라미터 선택이 잘못되면 거래 빈도가 너무 높거나 과도한 신호가 생성될 수 있다.

위험을 줄이기 위해, 다른 지표와 함께 신호의 효과를 판단하여 가짜 돌파구를 피하는 것이 좋습니다. 또한, 매개 변수 최적화와 재검토가 매우 필요하며, 최적의 매개 변수 조합을 찾기 위해 반복 테스트가 필요합니다. 실전에서 입금 규모를 적절히 축소하여 단일 손실을 제어해야합니다.

최적화 방향

이 전략은 다음과 같은 몇 가지 주요 최적화 방향을 가지고 있습니다:

  1. 더 많은 유형의 이동 평균 조합을 테스트하여 가장 좋은 조합을 찾습니다.
  2. 필터를 추가하여 거래량 지표와 같은 가짜 신호를 피합니다.
  3. 이동평균의 길이 변수를 최적화하고 최적의 변수를 찾습니다.
  4. 포지션 크기와 스톱 손실 차단 매개 변수를 최적화
  5. 다양한 품종과 주기를 시도합니다.

위 몇 가지 방향의 최적화를 통해 전략의 실제 성능을 지속적으로 향상시킬 수 있습니다.

요약

이 거래 전략은 광 스펙트럼 이동 평균에 기반하여 매우 유연성을 구현합니다. 그것은 강력한 사용자 지정 기능을 제공하며 사용자가 다양한 유형의 평균을 자유롭게 선택하고 조합할 수 있습니다. 전략 논리는 간단하고 명확하며 사용하기 쉽습니다. 또한 많은 최적화 공간을 제공합니다. 이 전략은 매개 변수 최적화와 위험 통제로 다양한 시장 환경에 적응하고 안정적인 수익을 얻을 수 있습니다. 그것은 효율적이고 유연한 트렌드 추적 전략입니다.


/*backtest
start: 2023-01-18 00:00:00
end: 2024-01-24 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
//

strategy(title="Long/Short", shorttitle="Banana Maker", overlay=true, pyramiding=0, default_qty_type=strategy.percent_of_equity, default_qty_value=100, calc_on_every_tick=false)



// === INPUTS ===
useRes = input(defval=true, title="Use Alternate Resolution?")
intRes = input(defval=7, title="Multiplier for Alernate Resolution")
stratRes = timeframe.ismonthly ? tostring(timeframe.multiplier * intRes, "###M") : 
   timeframe.isweekly ? tostring(timeframe.multiplier * intRes, "###W") : 
   timeframe.isdaily ? tostring(timeframe.multiplier * intRes, "###D") : 
   timeframe.isintraday ? tostring(timeframe.multiplier * intRes, "####") : '60'
basisType = input(defval="DEMA", title="MA Type: ", options=["SMA", "EMA", "DEMA", "TEMA", "WMA", "VWMA", "SMMA", "HullMA", "LSMA", "ALMA", "SSMA", "TMA"])
basisLen = input(defval=8, title="MA Period", minval=1)
offsetSigma = input(defval=6, title="Offset for LSMA / Sigma for ALMA", minval=0)
offsetALMA = input(defval=0.85, title="Offset for ALMA", minval=0, step=0.01)
scolor = input(false, title="Show coloured Bars to indicate Trend?")
delayOffset = input(defval=0, title="Delay Open/Close MA (Forces Non-Repainting)", minval=0, step=1)
tradeType = input("BOTH", title="What trades should be taken : ", options=["LONG", "SHORT", "BOTH", "NONE"])
// === /INPUTS ===

// Constants colours that include fully non-transparent option.
green100 = #008000FF
lime100 = #6ad279
red100 = #FF0000FF
blue100 = #0000FFFF
aqua100 = #00FFFFFF
darkred100 = #8B0000FF
gray100 = #808080FF

// === BASE FUNCTIONS ===
variant(type, src, len, offSig, offALMA) =>
    v1 = sma(src, len)  // Simple
    v2 = ema(src, len)  // Exponential
    v3 = 2 * v2 - ema(v2, len)  // Double Exponential
    v4 = 3 * (v2 - ema(v2, len)) + ema(ema(v2, len), len)  // Triple Exponential
    v5 = wma(src, len)  // Weighted
    v6 = vwma(src, len)  // Volume Weighted
    v7 = 0.0
    sma_1 = sma(src, len)  // Smoothed
    v7 := na(v7[1]) ? sma_1 : (v7[1] * (len - 1) + src) / len
    v8 = wma(2 * wma(src, len / 2) - wma(src, len), round(sqrt(len)))  // Hull
    v9 = linreg(src, len, offSig)  // Least Squares
    v10 = alma(src, len, offALMA, offSig)  // Arnaud Legoux
    v11 = sma(v1, len)  // Triangular (extreme smooth)
    // SuperSmoother filter
    // © 2013  John F. Ehlers
    a1 = exp(-1.414 * 3.14159 / len)
    b1 = 2 * a1 * cos(1.414 * 3.14159 / len)
    c2 = b1
    c3 = -a1 * a1
    c1 = 1 - c2 - c3
    v12 = 0.0
    v12 := c1 * (src + nz(src[1])) / 2 + c2 * nz(v12[1]) + c3 * nz(v12[2])
    type == "EMA" ? v2 : type == "DEMA" ? v3 : 
       type == "TEMA" ? v4 : type == "WMA" ? v5 : type == "VWMA" ? v6 : 
       type == "SMMA" ? v7 : type == "HullMA" ? v8 : type == "LSMA" ? v9 : 
       type == "ALMA" ? v10 : type == "TMA" ? v11 : type == "SSMA" ? v12 : v1

// security wrapper for repeat calls* NEEDS REFINEMENT- backtesting this shows repaint. need new wrapper
reso(exp, use, res) =>
    security_1 = security(syminfo.tickerid, res, exp, gaps=barmerge.gaps_off, lookahead=barmerge.lookahead_on)
    use ? security_1 : exp



// === /BASE FUNCTIONS ===

// === SERIES SETUP ===
closeSeries = variant(basisType, close[delayOffset], basisLen, offsetSigma, offsetALMA)
openSeries = variant(basisType, open[delayOffset], basisLen, offsetSigma, offsetALMA)
// === /SERIES ===

// === PLOTTING ===

// alt resulution 
closeSeriesAlt = reso(closeSeries, useRes, stratRes)
openSeriesAlt = reso(openSeries, useRes, stratRes)
//
trendColour = closeSeriesAlt > openSeriesAlt ? color.green : color.red
bcolour = closeSeries > openSeriesAlt ? lime100 : red100
barcolor(scolor ? bcolour : na, title="Bar Colours")
closeP = plot(closeSeriesAlt, title="Close Series", color=trendColour, linewidth=0, style=plot.style_line, transp=1)
openP = plot(openSeriesAlt, title="Open Series", color=trendColour, linewidth=0, style=plot.style_line, transp=1)
fill(closeP, openP, color=trendColour, transp=80)

// === /PLOTTING ===
//

//
// === ALERT conditions

xlong = crossover(closeSeriesAlt, openSeriesAlt)
xshort = crossunder(closeSeriesAlt, openSeriesAlt)
longCond = xlong  // alternative: longCond[1]? false : (xlong or xlong[1]) and close>closeSeriesAlt and close>=open
shortCond = xshort  // alternative: shortCond[1]? false : (xshort or xshort[1]) and close<closeSeriesAlt and close<=open


// === /ALERT conditions. needs work in study mode. the banana maker is the study script. 
// Create alert for cross, shunt back 1 if source is not 'open', this should prevent repaint issue.
//shunt = RSIsrc == open ? 0 : 1
//shunt = 0
//c_alert = (buy[shunt]==1 or sell[shunt]==1)
//alertcondition(c_alert, title="QQECROSS Alert", message="QQECROSS Alert")
// show only when alert condition is met and bar closed.
//plotshape(c_alert,title= "Alert Indicator Closed", location=location.bottom, color=sell[shunt]==1?red:green, transp=0, style=shape.circle)

//Repaint city, study mode will help but wont trigger the alerts


// === STRATEGY ===
// stop loss
slPoints = input(defval=0, title="Initial Stop Loss Points (zero to disable)", minval=0)
tpPoints = input(defval=0, title="Initial Target Profit Points (zero for disable)", minval=0)
// Include bar limiting algorithm
ebar = input(defval=1000, title="Number of Bars for Back Testing", minval=0)
dummy = input(false, title="- SET to ZERO for Daily or Longer Timeframes")
//
// Calculate how many mars since last bar
tdays = (timenow - time) / 60000.0  // number of minutes since last bar
tdays := timeframe.ismonthly ? tdays / 1440.0 / 5.0 / 4.3 / timeframe.multiplier : 
   timeframe.isweekly ? tdays / 1440.0 / 5.0 / timeframe.multiplier : 
   timeframe.isdaily ? tdays / 1440.0 / timeframe.multiplier : 
   tdays / timeframe.multiplier  // number of bars since last bar
//
//set up exit parameters
TP = tpPoints > 0 ? tpPoints : na
SL = slPoints > 0 ? slPoints : na

// Make sure we are within the bar range, Set up entries and exit conditions
if (ebar == 0 or tdays <= ebar) and tradeType != "NONE"
    strategy.entry("long", strategy.long, when=longCond == true and tradeType != "SHORT")
    strategy.entry("short", strategy.short, when=shortCond == true and tradeType != "LONG")
    strategy.close("long", when=shortCond == true and tradeType == "LONG")
    strategy.close("short", when=longCond == true and tradeType == "SHORT")
    strategy.exit("XL", from_entry="long", profit=TP, loss=SL)
    strategy.exit("XS", from_entry="short", profit=TP, loss=SL)



// === /STRATEGY ===
// eof


더 많은 내용