ゴールデンクロス SMA トレーディング戦略

作者: リン・ハーンチャオチャン,日付: 2024-01-26 14:29:01
タグ:

img

概要

ゴールデンクロスSMAの取引戦略は,異なるタイムフレームの2つの移動平均値とのクロスオーバーに基づいて購入・売却信号を生成する.特に,より速い移動平均値が下から遅い移動平均値を超越したとき,金色のクロスが形成され,上昇傾向の逆転を示します.より速いMAが上から遅いMAを下に横断すると,デッドクロスが形成され,下降傾向の逆転を示します.

原則

この戦略は2つの原則に基づいています.

  1. 移動平均値は市場の動向と勢いを反映する.短期MAは最近の価格動向と逆転を捉える.長期MAは支配的な傾向を示す.

  2. より速いMAがより遅いMAと黄金十字を形成すると,それは短期的な勢力が長期的トレンドよりも強くなっていることを示し,したがって上昇傾向の始まりである可能性を示します.死亡十字は長期的下落傾向が優勢であることを示し,したがって下落傾向が続く可能性を示します.

具体的には,この戦略は 13 と 30 期間の単純な移動平均値を使用し,そのクロスオーバー信号を取引します.クロスオーバーロジックは:

  1. MA の間の黄金十字は,買い機会を示す長い信号を生成する.シグナルの可動性は,上昇傾向を確認するために,一定期間間にわたって持続する上昇傾向が必要であることを評価する.

  2. MA間の死十字はショートシグナルを生成する.同様に,ショートシグナルが実行可能であることを確認するために,持続的な下落傾向が必要である.

  3. MA間の傾斜差は,クロスオーバー信号の強さを測定するために使用される.差が限界を超えるとのみ,信号は取引するのに十分な強さと考えられる.これは偽信号を排除するのに役立ちます.

  4. ストップ・ロスは20%で 利益は100%で

利点

SMAクロスオーバー戦略には以下の利点があります.

  1. 論理は単純で分かりやすいし,初心者にも適している.

  2. 価格平均を活用してノイズをフィルタリングし,短期変動に誤導されないようにします.

  3. クロスオーバー信号を盲目的に追跡するのではなく,トレンド持続性を評価し,市場全体的な状況とより大きな確認を保証します.

  4. 信号をより信頼性のあるものにするため,マスの傾斜運動因子を導入します.

  5. 簡単なバックテストと最適化です MA期間やトレンド期間のような キーパラメータがいくつかあります

リスク

この戦略には次のリスクもあります

  1. クロスオーバー信号は,自然に遅れているため,逆転を完璧に予測することはできません.遅延のリスクがあります.より短いMAsを使用するか,予測指標と組み合わせるべきです.

  2. メカニカル・システムは同時に取引を誘発し,モメンタムを悪化させ,ストップ・ロスト/テイク・プロフィートを無効にする傾向があります. 段階的な出口または手動のオーバーライドを使用する必要があります.

  3. 横向きの市場ではうまくいかない.そのようなインstrumentを避けるべきで,トレンドペアに集中する.

  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

もっと