골든 크로스 SMA 거래 전략

저자:차오장, 날짜: 2024-01-26 14:29:01
태그:

img

전반적인 설명

골든 크로스 SMA 거래 전략은 서로 다른 시간 프레임의 두 이동 평균 사이의 교차를 기반으로 구매 및 판매 신호를 생성합니다. 구체적으로, 더 빠른 이동 평균이 밑에서 느린 이동 평균을 넘을 때, 황금 십자가가 형성되며, 상승 트렌드 반전을 나타냅니다. 더 빠른 MA가 위에서 느린 MA를 넘을 때, 죽음의 십자가가 형성되며, 하락 트렌드 반전을 나타냅니다.

원칙

이 전략은 두 가지 원칙에 기초합니다.

  1. 이동 평균은 시장 추세와 동력을 반영 할 수 있습니다. 단기 MA는 최근 가격 움직임과 역전을 포착합니다. 장기 MA는 지배 추세를 보여줍니다.

  2. 더 빠른 MA가 더 느린 MA와 황금 십자가를 형성하면 단기 추진력이 장기 트렌드보다 힘을 얻고 있음을 나타냅니다. 따라서 상승 추세의 시작이 될 가능성이 있습니다. 죽음의 십자가는 장기 하향 추세가 지배하고 있음을 나타냅니다. 따라서 지속적인 하향 추세가 될 가능성이 있습니다.

구체적으로 이 전략은 13 및 30 기간 간단한 이동 평균을 사용 하 여 그들의 교차 신호를 거래 합니다. 교차 논리는:

  1. MA 사이의 황금색 십자선은 긴 신호를 생성하여 구매 기회를 나타냅니다. 시그널의 생존성은 상승 추세를 확인하기 위해 최소한의 기간 동안 지속적인 상승 추세를 요구함으로써 평가됩니다.

  2. MAs 사이의 죽음의 십자가는 짧은 신호를 생성합니다. 마찬가지로 단축 신호의 생존성을 확인하려면 지속적인 하락 추세가 필요합니다.

  3. MA 사이의 기울기 차이는 크로스오버 신호의 강도를 측정하는 데 사용됩니다. 차이는 한 임계치를 초과 할 때만 신호가 거래하기에 충분히 강하다고 간주됩니다. 이것은 잘못된 신호를 제거하는 데 도움이됩니다.

  4. 스톱 로스는 20%로 설정하고 수익은 100%로 설정됩니다.

장점

SMA 크로스오버 전략은 다음과 같은 장점을 가지고 있습니다.

  1. 논리는 간단하고 이해하기 쉬우며 초보자도 쉽게 이해할 수 있습니다.

  2. 소음을 필터링하고 단기 변동에 의해 잘못 인도되는 것을 피하기 위해 가격 평균을 사용합니다.

  3. 트렌드 지속성을 평가하는 대신 단순히 교차 신호를 맹목적으로 따라가며 전체 시장 조건과 더 많은 확인을 보장합니다.

  4. 신호를 더 신뢰할 수 있도록 MA에 기울기 모멘텀 인수를 도입합니다.

  5. MA 기간과 트렌드 기간과 같은 몇 가지 주요 매개 변수로 간단한 백테스팅과 최적화

위험성

이 전략은 또한 다음과 같은 위험을 가지고 있습니다.

  1. 크로스오버 신호는 자연적으로 지연되어 있으며 역전을 완벽하게 예측할 수 없습니다. 지연 위험이 있습니다. 짧은 MA를 사용하거나 예측 지표와 결합해야합니다.

  2. 기계 시스템은 동시 거래를 유발하고, 추진력을 악화시키고, 스톱 로스/프로피트를 무효화합니다. 단계적 출구나 수동 오버라이드를 사용해야 합니다.

  3. 부진한 부문 시장에서 잘 수행되지 않습니다. 그러한 도구를 피하고 트렌딩 쌍에 집중해야합니다.

  4. 성능은 트렌드 기간과 같은 적절히 캘리브레이드 된 매개 변수에 크게 달려 있습니다. 최적의 값을 찾기 위해 반복 테스트가 필요합니다.

최적화 방향

이 전략은 다음과 같이 더 최적화 될 수 있습니다.

  1. 더 높은 시간 프레임 트렌드 평가를 추가하여 역 트렌드 거래를 피합니다. 예를 들어 주간 또는 월간 가격을 사용하여.

  2. 가짜 신호를 제거하기 위해 거래 부피 확인을 요구합니다.

  3. 가장 좋은 기간 조합을 찾기 위해 MA 매개 변수를 최적화합니다. 적응적인 이동 평균을 고려하십시오.

  4. MACD, KD와 같은 인기있는 지표를 포함하여 신호 확인과 정확성을 지원합니다.

  5. 단계적 스톱 로스/프로피트 취득을 채택하여 위험을 더 잘 제어합니다.

결론

SMA 크로스오버 전략은 매우 직관적이고 해석하기 쉽습니다. 이동 평균의 노이즈 필터링 특성을 크로스오버 신호의 간단한 트렌드 식별 능력과 결합합니다. 추가 신호 확인은 더 많은 실용성과 안정성을 제공합니다. 적용된 개선 사항 외에도 추가 최적화에 대한 충분한 공간이 남아있어이 전략을 연구 할 가치가 있습니다.


/*backtest
start: 2024-01-01 00:00:00
end: 2024-01-25 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4

// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © MakeMoneyCoESTB2020


//*********************Notes for continued work***************

//************************************************************

//Hello my fellow investors
//I am creating a simple non-cluttered strategy that uses 3(+1) simple means to determine: viability, entry, and exit
//1) Has a consistent trend been maintained for several days/weeks
//2) SH SMA crossover LG SMA = Bullish entry/LG SMA crossover SH SMA = Bearish entry
//3) Use the Slope factor & Weeks in Trend (WiT) to dertermine how strong of an entry signal you are comfortable with
//4) Exit position based on next SMA cross and trend reversal or stop loss%
//3+1) For added confidence in trend detection: Apply MACD check - buy--> MACD line above signal line and corssover below histogram \\ sell --> MACD line below signal line and crossover above histogram.
//*)This code also allows you to determine your desired backtesting date compliments of alanaster


//This code is the product of many hours of hard work on the part of the greater tradingview community.  The credit goes to everyone in the community who has put code out there for the greater good.

//Happy Hunting!

// 1. Define strategy settings*************************************************************************************************************************************************************************

//Title
strategy("KISS Strategy: SMA + EMA", shorttitle="KISS Strat")

//define calculations price source
price = input(title="Price Source", defval=close)

// 2. Calculate strategy values*************************************************************************************************************************************************************************

//Calculate 13/30/200SMA 
SH_SMA_length= input(title="SH SMA Length", defval=13) //short SMA length
LG_SMA_length= input(title="LG SMA Length", defval=30) //long SMA length
GV_SMA_length= input(title="SH SMA Length", defval=200) //Gravitational SMA length

SH_SMA=sma(price, SH_SMA_length) //short SMA 
LG_SMA=sma(price, LG_SMA_length) //long SMA
GV_SMA=sma(price, GV_SMA_length) //gravitational SMA

//calculate MACD
//define variables for speed
fast = 12, slow = 26
//define parameters to calculate MACD
fastMA = ema(price, fast)
slowMA = ema(price, slow)
//define MACD line
macd = fastMA - slowMA
//define SIGNAL line
signal = sma(macd, 9)

//Determine what type of trend we are in
dcp = security(syminfo.tickerid, 'D', close)   //daily close price 
wcp = security(syminfo.tickerid, 'W', close)   //weekly close price 

WiT = input(title="Weeks In Trend", defval=1, maxval=5, minval=1)    //User input for how many weeks of price action to evaluate (Weeks in Trend = WiT)
BearTrend = false       //initialize trend variables as false
BullTrend = false       //initialize trend variables as false

// BullTrend := (wcp > SH_SMA) and (SH_SMA > LG_SMA)  //true if price is trending up based on weekly price close
// BearTrend := (wcp < SH_SMA) and (SH_SMA < LG_SMA)  //true if price is trending down based on weekly price close


// BullTrend := (price > SH_SMA) and (SH_SMA > LG_SMA)  //true if price is trending up
// BearTrend := (price < SH_SMA) and (SH_SMA < LG_SMA)  //true if price is trending down

//Determine if the market has been in a trend for 'n' weeks

n=WiT                           //create loop internal counting variable
for i=1 to WiT                  //create loop to determine if BearTrend=true to set number of weeks
    if (wcp[n] < price)         //evaluate if BearTrend=false comparing the current price to a paticular week close
        BearTrend := false      //set value to false if older price value is less than newer: trending up
        break                   //break out of for loop when trend first falters
    if (wcp[n] > price)         //evaluate if BearTrend=true comparing the current price to a paticular week close
        BearTrend := true       //set value to true if older price value is greater than newer: trending down
    n:=n-1                      //set internal counter one day closer to present

m=WiT                           //create loop internal counting variable
for j=1 to WiT                  //create loop to determine if BearTrend=true to set number of weeks
    if (wcp[m] > price)         //evaluate if BullTrend=false comparing the current price to a paticular week close
        BullTrend := false      //set value to false if older price value is greater than newer: trending down
        break                   //break out of for loop when trend first falters
    if (wcp[m] < price)         //evaluate if BullTrend=true comparing the current price to a paticular week close
        BullTrend := true       //set value to true if older price value is less than newer: trending up
    m:=m-1                      //set internal counter one day closer to present


//Determine if crossings occur
SH_LGcrossover = crossover(SH_SMA, LG_SMA)  //returns true if short crosses over long
SH_LGcrossunder = crossunder(SH_SMA, LG_SMA)    //returns true if short crosses under long

//Determine the slope of the SMAs when a cross over occurs
SlopeFactor= input(title="Slope Factor", defval=.01, minval=0, step = 0.001) //user input variable for what slope to evaluate against
XSlopeSH = abs(SH_SMA-SH_SMA[2]) //slope of short moving average (time cancels out)
XSlopeLG = abs(LG_SMA-LG_SMA[2]) //slope of long moving average (time cancels out)
StrongSlope = iff (abs(XSlopeSH-XSlopeLG)>SlopeFactor, true, false) //create a boolean variable to determine is slope intensity requirement is met

// ************************************ INPUT BACKTEST RANGE ******************************************=== coutesy of alanaster
fromMonth = input(defval = 4,    title = "From Month",      type = input.integer, minval = 1, maxval = 12)
fromDay   = input(defval = 1,    title = "From Day",        type = input.integer, minval = 1, maxval = 31)
fromYear  = input(defval = 2020, title = "From Year",       type = input.integer, minval = 1970)
thruMonth = input(defval = 1,    title = "Thru Month",      type = input.integer, minval = 1, maxval = 12)
thruDay   = input(defval = 1,    title = "Thru Day",        type = input.integer, minval = 1, maxval = 31)
thruYear  = input(defval = 2112, title = "Thru Year",       type = input.integer, minval = 1970)

// === INPUT SHOW PLOT ===
showDate  = input(defval = true, title = "Show Date Range", type = input.bool)

// === FUNCTION EXAMPLE ===
start     = timestamp(fromYear, fromMonth, fromDay, 00, 00)        // backtest start window
finish    = timestamp(thruYear, thruMonth, thruDay, 23, 59)        // backtest finish window
window()  => true

bgcolor(color = showDate and window() ? color.gray : na, transp = 90) 
// === EXECUTION ===
//strategy.entry("L", strategy.long, when = window() and crossOv)    // enter long when "within window of time" AND crossover
//strategy.close("L", when = window() and crossUn)                   // exit long when "within window of time" AND crossunder

// 3. Output strategy data*************************************************************************************************************************************************************************

//Embolden line if a trend exists
trendcolorLG = BearTrend?color.red:color.black //highlights beartrend condition met graphically
trendcolorSH = BullTrend?color.green:color.black //highlights beartrend condition met graphically

//plot SMAs
plot(SH_SMA, title = "SH SMA", color = trendcolorSH)
plot(LG_SMA, title = "LG SMA", color = trendcolorLG)
plot(GV_SMA, title = "GV SMA", color = color.silver, linewidth = 4, transp = 70)

//Highlight crossovers
plotshape(series=SH_LGcrossover, style=shape.arrowup, location=location.belowbar,size=size.normal, color=color.green)
plotshape(series=SH_LGcrossunder, style=shape.arrowdown, location=location.abovebar,size=size.normal, color=color.red)

// 4. Determine Long & Short Entry Calculations*************************************************************************************************************************************************************************

//Define countback variable
countback=input(minval=0, maxval=5, title="Price CountBack", defval=0)
//User input for what evaluations to run: SMA or SMA + EMA
SMA_Y_N=input(defval = "Y", title="Run SMA", type=input.string, options=["Y", "N"])
MACD_Y_N=input(defval = "N", title="Run MACD", type=input.string, options=["Y", "N"])

//Calculate SMA Cross entry conditions
SMAbuy=false
SMAsell=false
SMAbuy := SH_LGcrossover and StrongSlope and BearTrend[WiT*7]   //enter long if short SMA crosses over long SMA & security has been in a BearTrend for 'n' days back
SMAsell := SH_LGcrossunder and StrongSlope and BullTrend[WiT*7] //enter short if short SMA crosses under long SMA & security has been in a BullTrend for 'n' days back

//Calculate MACD Cross entry conditions
MACDbuy = iff(MACD_Y_N=="Y", crossunder(signal[countback], macd[countback]), true) and iff(MACD_Y_N=="Y", macd[countback]<0, true) and StrongSlope and BearTrend     //enter long if fast MACD crosses over slow MACD & there is a strong slope & security has been in a BearTrend for 'n' days back
MACDsell = iff(MACD_Y_N=="Y", crossunder(macd[countback], signal[countback]), true) and iff(MACD_Y_N=="Y", signal[countback]>0, true) and StrongSlope and BullTrend  //enter short if fast MACD crosses under slow MACD & there is a strong slope & security has been in a BullTrend for 'n' days back

//long entry condition
dataHCLB=(iff(SMA_Y_N=="Y", SMAbuy, true) and iff(MACD_Y_N=="Y", MACDbuy, true))
plotshape(dataHCLB, title= "HC-LB", color=color.lime, style=shape.circle, text="HC-LB")
strategy.entry("HC-Long", strategy.long, comment="HC-Long", when = dataHCLB and window())

//short entry condition
dataHCSB=(iff(SMA_Y_N=="Y", SMAsell, true) and iff(MACD_Y_N=="Y", MACDsell, true))
plotshape(dataHCSB, title= "HC-SB", color=color.fuchsia, style=shape.circle, text="HC-SB")
strategy.entry("HC-Short", strategy.short, comment="HC-Short", when=dataHCSB and window())


// 5. Submit Profit and Loss Exit Calculations Orders*************************************************************************************************************************************************************************

// User Options to Change Inputs (%)
stopPer = input(12, title='Stop Loss %', type=input.float) / 100
takePer = input(25, title='Take Profit %', type=input.float) / 100

// Determine where you've entered and in what direction
longStop = strategy.position_avg_price * (1 - stopPer)
shortStop = strategy.position_avg_price * (1 + stopPer)
shortTake = strategy.position_avg_price * (1 - takePer)
longTake = strategy.position_avg_price * (1 + takePer)

//exit position conditions and orders
if strategy.position_size > 0//or crossunder(price[countback], upperBB)
    strategy.exit(id="Close Long", when = window(), stop=longStop, limit=longTake)
if strategy.position_size < 0 //or crossover(price[countback], lowerBB)
    strategy.exit(id="Close Short", when = window(), stop=shortStop, limit=shortTake)





//Evaluate/debug equation***************************************************************************************************************************************************************************
// plotshape((n==5? true : na), title='n=5', style=shape.labeldown, location=location.abovebar, text='5', color=color.white, textcolor=color.black, transp=0) //print n value if 5
// plotshape((n==4? true : na), title='n=4', style=shape.labeldown, location=location.abovebar, text='4', color=color.white, textcolor=color.black, transp=0) //print n value if 4 
// plotshape((n==3? true : na), title='n=3', style=shape.labeldown, location=location.abovebar, text='3', color=color.white, textcolor=color.black, transp=0) //print n value if 3
// plotshape((n==2? true : na), title='n=2', style=shape.labeldown, location=location.abovebar, text='2', color=color.white, textcolor=color.black, transp=0) //print n value if 2
// plotshape((n==1? true : na), title='n=1', style=shape.labeldown, location=location.abovebar, text='1', color=color.white, textcolor=color.black, transp=0) //print n value if 1
// lineValue = 11                                           //set random visible line value to check when equation is true
// colorP = (BearTrend==true) ? color.green : color.red
// plot (lineValue, title = "BearTrend", color = colorP)   //Plot when condition true=green, false=red
// plot (XSlopeLG+15, color=color.white) //used for code debugging
// plot (XSlopeSH+15, color=color.blue) //used for code debugging
// plot (abs(XSlopeSH-XSlopeLG)+20, color=color.fuchsia) //used for code debugging

더 많은