移動平均クロスオーバーブレイクアウト戦略


作成日: 2024-02-06 15:02:33 最終変更日: 2024-02-06 15:02:33
コピー: 1 クリック数: 671
1
フォロー
1617
フォロワー

移動平均クロスオーバーブレイクアウト戦略

概要

この戦略は,3つの異なる周期の移動平均を使用し,市場の傾向の方向を識別する. 3つの移動平均の方向が一致するときに,ポジションに入ります.同時に,最近のN根K線の最高価格または最低価格と組み合わせて,ストップ・ロスを設定します.

戦略原則

  1. 長期,中期,短期の3つの移動平均を計算する. ユーザは周期を自分で設定できます. 既定は20日,10日,5日です.

  2. 3つの移動平均の方向を比較する.短期移動平均が中期に,中期が長期に穿戴するときは,多頭市場として判断する.短期移動平均が中期に,中期が長期に穿戴するときは,空頭市場として判断する.

  3. 多頭市場では,価格が最近 N 根K 線内の最高値を破った場合,多頭する.空頭市場では,価格が最近 N 根K 線内の最低値を破った場合,空頭する.N はユーザーにカスタマイズされたパラメータでもある.

  4. ポジションに入ると,ストップ・ロストを設定する.多頭市場のストップは,最近のN根K線内の最低価格,空頭市場のストップは,最近のN根K線内の最高価格である.

優位分析

この戦略は,移動平均指数とK線グラフを組み合わせて,市場の動きをよく判断できます.同時に,ストップ・ロスの設定は合理的で,大きな損失を回避するのに役立ちます.

単一の移動平均などの指標と比較して,この戦略は,3つの移動平均を使用し,市場の動きを判断する信頼性が高い.同時に,近年のN根K線最高価格または最低価格を突破してポジションに入るのは,比較的一般的な突破戦略である.全体的に,戦略の考え方は明確で,実行しやすい.

リスク分析

この戦略に伴う主なリスクは以下の通りです.

  1. 三つの移動平均方向判断誤差の確率.中短期移動平均が誤ったシグナルを生じさせれば,不必要な損失を引き起こす可能性がある.

  2. 突破入場タイミングの選択は不適切で,簡単に騙される。入場タイミングの選択を適切に最適化すべきである。

  3. 止損距離が小さすぎると設定され,止損距離を拡大すると,価格が高くなる.

最適化の方向

この戦略は以下の方向で最適化できます.

  1. 移動平均信号の信頼性を保証する他の指標のフィルタを追加する.例えば,取引量の多空判断を増やす.

  2. 移動平均の周期パラメータを最適化して,異なる品種に適応させる.

  3. 機械学習アルゴリズムを追加し,パラメータの自動最適化を実現する.

  4. この戦略の有効性を高周波データでテストする.

要約する

この戦略は,全体的に比較的シンプルで汎用的で,考え方が明確で,実用性が強い.移動平均クロスシステムの例として,初心者にとって一般的な選択である.適切な最適化により,システムをより広範な品種と時間周期に適用することができ,その結果,安定した収益が得られる.

ストラテジーソースコード
/*backtest
start: 2023-01-30 00:00:00
end: 2024-02-05 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// This Pine Script™ code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © hobbiecode

//@version=5
strategy("Cross Breakout - Hobbiecode", shorttitle="Cross - HOBBIE", overlay=true)

// User-defined input for moving averages
long_period = input(20, title="Long Period")
medium_period =  input(10, title = "Medium Period")
short_period = input(5, title="Short Period")
type_ma = input.string("SMA", title = "MA type", options = ["SMA", "EMA"])
candles_back = input(10, title = "Candles Back")
bars_valid = input(3, title = "Bars to Exit")

// Calculating moving averages
long_ma = 0.0
medium_ma = 0.0
short_ma = 0.0

if type_ma == "SMA"
    long_ma := ta.sma(close, long_period)
    medium_ma := ta.sma(close, medium_period)
    short_ma := ta.sma(close, short_period)
else
    long_ma := ta.ema(close, long_period)
    medium_ma := ta.ema(close, medium_period)
    short_ma := ta.ema(close, short_period)

// Plot moving averages
plot(long_ma, title="Long Moving Average", color=color.red)
plot(medium_ma, title = "Medium Moving Average", color = color.yellow)
plot(short_ma, title="Short Moving Average", color=color.green)

// Check last min/max
last_min = ta.lowest(candles_back)
last_max = ta.highest(candles_back)

// Strategy logic for crossing of moving averages
longCondition = short_ma > medium_ma and medium_ma > long_ma and high == last_max
shortCondition = short_ma < medium_ma and medium_ma < long_ma and low == last_min

longCondition_entry = longCondition and strategy.position_size == 0
shortCondition_entry = shortCondition and strategy.position_size == 0

// Check last min/max for operation
last_min_op = ta.lowest(candles_back)[1]
last_max_op = ta.highest(candles_back)[1]

// Plot lines
var line r1Line = na

// Entry orders
// if (longCondition)
//     from_line = chart.point.now(high)
//     to_line = chart.point.from_index(bar_index + candles_back, high)
//     r1Line := line.new(from_line, to_line, color = color.green, width = 2)

if longCondition_entry and ta.crossover(close,last_max_op)
    strategy.entry("Long", strategy.long)
    strategy.exit("Exit Long", from_entry="Long", stop=low)

// if (shortCondition)
//     from_line = chart.point.now(low)
//     to_line = chart.point.from_index(bar_index + candles_back, low)
//     r1Line := line.new(from_line, to_line, color = color.red, width = 2)

if shortCondition_entry and ta.crossunder(close,last_min_op)
    strategy.entry("Short", strategy.short)
    strategy.exit("Exit Short", from_entry="Short", stop=high)

if ta.barssince(longCondition_entry) >= bars_valid
    strategy.close("Long")

if ta.barssince(shortCondition_entry) >= bars_valid
    strategy.close("Short")