
移動平均線交差戦略は,非常に古典的でよく使用される技術分析戦略である.この戦略の核心思想は,異なる期間の移動平均線間の交差を買い売り信号として利用することである.短期移動平均線がより長い移動平均線を上から下を通るとき,買いの信号を生成し,短期移動平均線がより長い移動平均線を上から下を通るとき,売りの信号を生成する.
この戦略は,入力設定の入力移動平均のタイプ (SMA,EMA,WMA,RMA) と周期長,および反測の時間範囲を入力します.
変数関数の中で異なるタイプの移動平均を計算する. 計算された移動平均は,ma変数によって保存される.
クローズ価格がマを突破すると,買入シグナルが生成され,クローズ価格がマを突破すると,売出シグナルが生成されます.
ストップを設定するために,atrを使って14サイクル間の平均実際の波動幅を計算する. 通過点を基準として,上下加減2倍atrをストップ範囲として使う.
具体的には以下の通りです.
多頭入場:close上をmaで回測時間中に,止損点は入場点closeとする 多頭出場:closeの下穿 ma 減2倍atr 止損出場,または最高価格が入場点を超えたclose 加2倍atr 止止出場 空頭入場:close 下穿 ma で,回測時間において,止損点は入場点close 空頭出場:close上では,ma+2倍atrで出場を止めて,または入場点より低い最低値close+2倍atrで出場を止めて
リスクの最適化には,以下の方法があります.
この戦略は以下の点で最適化できます.
移動平均線交差策略は,非常に典型的でよく使用される技術分析策略である.この策略の核心構想はシンプルで,容易に実装され,各市場に適用され,量化取引の入門策略の1つである.しかし,この策略には,頻繁にシグナルを生成し,容易な止損など,いくつかの問題がある.適切な最適化によって,この策略の現場パフォーマンスを大幅に向上させることができる.全体として,移動平均線交差策略は,非常に良い戦略開発の枠組みを提供し,量化取引策略の学習の基石である.
/*backtest
start: 2023-10-03 00:00:00
end: 2023-11-02 00:00:00
period: 2h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=4
strategy("MA Cross Strategy", overlay=true,commission_value = 0.1)
type = input(defval = "WMA", title = "MA Type: ", options=["RMA", "SMA", "EMA", "WMA"])
length = input(28)
source = close
// === INPUT BACKTEST RANGE ===
FromDay = input(defval = 1, title = "From Day", minval = 1, maxval = 31)
FromMonth = input(defval = 1, title = "From Month", minval = 1, maxval = 12)
FromYear = input(defval = 2000, title = "From Year", minval = 2000)
// === FUNCTION EXAMPLE ===
start = timestamp(FromYear, FromMonth, FromDay, 00, 00) // backtest start window
finish = timestamp(9999, 1, 1, 23, 59) // backtest finish window
window() => time >= start and time <= finish ? true : false // create function "within window of time"
variant(type, src, len) =>
v1 = sma(src, len) // Simple
v2 = ema(src, len) // Exponential
v5 = wma(src, len) // Weighted
v7 = rma(src, len) // Smoothed
type=="EMA"?v2 : type=="WMA"?v5 : type=="RMA"?v7 : v1
ma = variant(type,source, length)
atr = security(syminfo.tickerid, "D", atr(14))
range = valuewhen(cross(close,ma), (atr*2), na)
ep = valuewhen(cross(close,ma), close, na)
plot(ma,color=ma>ma[1]?color.blue:color.red,transp=0,linewidth=1)
plot(ep,color=#2196f3,transp=100,trackprice=true, offset=-9999)
plot(ep+range,color=#2196f3,transp=100,trackprice=true, offset=-9999)
plot(ep-range,color=#2196f3,transp=100,trackprice=true, offset=-9999)
strategy.entry("Long Entry", true, when = crossover(close,ma) and window() , stop = ep )
strategy.exit("Long Exit", "Long Entry", stop = ep-range)
strategy.exit("Long Exit", "Long Entry", when = high > ep+range ,stop = ep[1] )
strategy.entry("Short Entry", false, when = crossunder(close,ma) and window() , stop = ep )
strategy.exit("Short Exit", "Short Entry", stop = ep+range)
strategy.exit("Short Exit", "Short Entry", when = low < ep-range ,stop = ep[1] )