골든 크로스 트레이딩 전략


생성 날짜: 2024-01-26 14:29:01 마지막으로 수정됨: 2024-01-26 14:29:01
복사: 4 클릭수: 613
avatar of ChaoZhang ChaoZhang
1
집중하다
1617
수행원

골든 크로스 트레이딩 전략

개요

쌍평선 교차 golden cross 거래 전략은 두 개의 다른 주기의 이동 평균의 교차를 구매 및 판매 신호로 사용합니다. 구체적으로, 단기 이동 평균이 하향에서 장기 이동 평균을 돌파 할 때, 황금 교차 신호가 발생, bull를 나타냅니다; 단기 이동 평균이 상향에서 긴 주기 이동 평균을 돌파 할 때, 사망 교차 신호가 발생, bear를 나타냅니다.

전략 원칙

이 전략은 두 가지 원칙에 기초하고 있습니다.

  1. 이동 평균은 시장의 추세와 힘을 나타냅니다. 단기 이동 평균은 시장의 최근의 움직임과 전환점을 포착합니다. 장기 이동 평균은 시장의 주요 추세를 나타냅니다.

  2. 단기 이동 평균과 장기 이동 평균이 황금 교차를 형성할 때, 단기 시장의 힘이 장기 트렌드의 힘을 초과하기 때문에 새로운 상승 트렌드를 시작할 가능성이 높습니다. 사망 교차가 형성될 때, 장기 하향 트렌드가 지배적이기 때문에 계속 하락할 가능성이 높습니다.

구체적으로, 이 전략은 13주기 및 30주기의 간단한 이동 평균을 설정하고 그들이 교차할 때 거래 신호를 생성합니다. 교차의 원리는 다음과 같습니다:

  1. 단기 이동 평균선 위에 긴 주기 이동 평균선을 횡단할 때, 금색 교차 신호가 발생하여 더 많은 일을 할 기회를 나타냅니다. 이 때, 트렌드 강도를 평가하여 입금하십시오: 가격이 일정 주기 이상 상승세를 유지하면 현재 상승 추세라고 확신하면 더 많은 일을하십시오.

  2. 단기 이동 평균선 아래로 장기 이동 평균선을 통과할 때, 사망 교차 신호가 발생하여, 하락의 기회를 나타냅니다. 이 때, 추세 강도를 평가하여 진입한다: 가격이 일정 주기 이상 계속 하락하면, 현재 하락 추세라고 확신하면, 하락한다.

  3. 이동 평균 경사도를 통해 교차 신호의 강도를 평가한다. 단기 및 장기 이동 평균 경사도가 특정 하위값보다 크게 다르면만 교차 신호가 충분히 강하다고 판단하여 출전할 가치가 있다. 이것은 일반적인 false 신호의 간섭을 억제한다.

  4. 스톱로스는 20%로, 스톱은 100%로 설정되어 있다.

우위 분석

이중 평행선 교차 전략은 다음과 같은 장점이 있습니다.

  1. 아이디어는 명확하고 단순하며, 이해하기 쉽고, 실행하기 쉽습니다.

  2. 가격 평균 특성을 활용하여, 약간의 소음 제거 효과가 있으며, 단기 가격 변동에 착각하지 않도록 한다.

  3. 트렌드가 견고하다는 것을 평가하고, 기계적으로 더 많은 공백을 피하고, 대장 판단을 결합하십시오.

  4. 이동 평균 경사 동량 인자를 도입하여 신호를 더욱 신뢰할 수 있게 했다.

  5. 회귀 최적화는 간단하며 이동 평균 변수와 트렌드 견고성 시간 등의 몇 가지 핵심 변수만 조정해야 합니다.

위험 분석

이 전략에는 다음과 같은 위험도 있습니다.

  1. 양평선 교차는 여전히 지연 신호의 본질이며, 전환점을 완벽하게 예측할 수 없으며, 어느 정도의 지연이 존재한다. 이동 평균 주기를 적절히 단축하거나, 전환점을 예측할 수 있는 요소와 함께 사용한다.

  2. 기계적 거래 시스템은 집단적으로 동시에 타격을 받을 수 있으며, 이로 인해 거래상황이 과도하게 악화되어, 손해 중지 또는 제동이 무효가 된다. 계단형 손해 중지 제동, 또는 적절한 인적 개입을 설정한다.

  3. 흔들리는 상황을 잘 처리할 수 없기 때문에, 이런 주기 동안 수평으로 반복되는 품종을 피하고, 명확한 방향을 선택하는 품종을 거래한다.

  4. 추세 강도를 평가하는 시간 창은 결과에 큰 영향을 미치는지 여부를 확인하기 위해 반복적으로 테스트해야 합니다.

최적화 방향

양평선 교차 전략은 다음과 같은 측면에서 최적화될 수 있다:

  1. 대도 트렌드를 평가하는 지표를 추가하고 역동적인 동작을 피한다. 예를 들어 비교 선 또는 달 선의 위치를 추가한다.

  2. 거래량 검증을 추가하고, 거래량이 커질 경우에만 신호를 발송하고, 가짜 신호를 피한다.

  3. 이동 평균 변수를 최적화하여 최적의 주기 조합을 찾는다. 이동 평균 변수를 스스로 적응하는 것을 시도할 수 있다.

  4. MACD, KD 등과 같은 주요 공식 지표와 결합하여 보조 판단을 통해 신호 정확도를 향상시킵니다.

  5. 계단형 손해 차단기를 설치하여 위험을 더 잘 통제할 수 있다.

요약하다

쌍평선 교차 전략은 전체적으로 매우 직관적으로 설명할 수 있는 전략이다. 그것은 이동 평균의 무음 특성을 결합하여 교차 판단의 간단한 경향 인식 능력을 갖는다. 동시에, 신호에 대한 일정 검증이 이루어지고, 맹목적 추종을 피하는 것도 실용성과 안정성을 향상시킨다. 이 글에서 언급한 몇 가지 개선 방법 이외에도, 이 전략은 여전히 최적화 할 수있는 큰 공간이 있으며, 더 깊이 연구할 가치가 있다.

전략 소스 코드
/*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