移動平均突破戦略を横切る

作者: リン・ハーンチャオチャン,日付: 2024-02-06 15:02:33
タグ:

img

概要

この戦略は,異なる期間の3つの移動平均値を用い,市場のトレンド方向を特定する.この3つの移動平均値が同じ方向に動いているとき,ポジションに入ります.同時に,最も最近のNキャンドルの最高または最低価格と組み合わせて,ストップ・ロスを設定し,利益を得ます.

戦略の論理

  1. 長期,中期,短期の3つの移動平均を計算します.ユーザーは自己で期間を設定できます.デフォルト値は20,10および5です.

  2. 3つの移動平均の方向を比較する. 短期移動平均が中期平均を上回り,中期平均が長期平均を上回ると,それは牛市場とみなされる. 短期平均が中期平均を下回り,中期平均が長期平均を下回ると,それは熊市場とみなされる.

  3. 牛市では,価格が最新のNキャンドルの最高価格を突破した場合,ロング;熊市では,価格が最新のNキャンドルの最低価格を突破した場合,ショート.Nはユーザーによってもカスタマイズ可能なパラメータです.

  4. ポジションに入ると,ストップ・ロスを設定し,利益を取ります.牛市ではストップ・ロスは,最新のNキャンドルの最低価格で,熊市では最高価格で設定されます.

利点分析

この戦略は,移動平均指標とキャンドルスタックチャートを組み合わせ,市場の傾向をより正確に決定することができます.同時に,ストップ・ロストとテイク・プロフィートの設定は合理的で,より大きな損失を避けるのに役立ちます.

この戦略は,単一の移動平均値および他の指標と比較して,市場動向をより信頼的に判断するために3つの移動平均値を使用しています.一方,最も最近のNキャンドルの最高値または最低値を突破するときにポジションに入ることは,一般的なブレイクアウト戦略です.全体として,戦略のアイデアは明確で実行が簡単です.

リスク分析

この戦略の主要な潜在的なリスクは以下のとおりです.

  1. 3つの移動平均値の方向に対する誤った判断の確率.中短期移動平均値が間違った信号を引き起こすると,不必要な損失が発生する可能性があります.

  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")

もっと