2つのMAのクロスオーバートレンド追跡戦略

作者: リン・ハーンチャオチャン開催日:2023年12月21日 16時22分
タグ:

img

概要

この戦略は,二重移動平均クロスオーバーの典型的なトレンド追跡方法を採用し,ストップ・ロース,テイク・プロフィート,トラッキング・ストップ・ロースなどのリスク管理メカニズムと組み合わせ,トレンド市場から大きな利益を得ることを目的としています.

戦略の論理

  1. 短期間の高速線として n 日間の EMA を計算する.
  2. 長期間のスローラインとして m 日間 EMA を計算する.
  3. 高速線がスロー線を突破して上向きになると 長い線を引くし 下向きになると 短い線を引く.
  4. 出口信号:逆交差点 (例えば,長交差点が発生した場合,長出口点)
  5. リスク管理のためにストップ・ロスを使って 利益を得たり トレイリング・ストップ・ロスを使います

利点分析

  1. 双 EMA 線を採用することで,価格トレンドの逆転点をより良く決定し,トレンドの動きを把握できます.
  2. ストップ・ロスト,テイク・プロフィート,トラッキング・ストップを組み合わせることで 単一の取引損失を制限し,利益を固定し,引き下げを減らすことができます
  3. 異なる製品や市場環境のために調整し最適化できる多くのカスタマイズ可能なパラメータがあります.
  4. 戦略の論理は シンプルで明快で 分かりやすく 変更も容易です
  5. 長期および短期間の操作の両方をサポートし,異なる市場状況に適応できます.

リスク分析

  1. ダブルMA戦略は 偽の脱出に敏感で 罠にかかったりします
  2. パラメータの設定が正しくない場合,取引が頻繁になり,取引コストが増加し,滑り損が生じる可能性があります.
  3. 戦略自体は 傾向の逆転点を決定することはできません 他の指標と組み合わせなければなりません
  4. 異なる市場で取引シグナルを生成するのは簡単ですが,実際の収益性は低い傾向にあります.
  5. パラメータは 異なる製品や市場環境に最適化する必要があります

リスクは以下によって軽減できます.

  1. 誤った信号を他の指標でフィルタリングする
  2. 取引頻度を下げるためにパラメータを最適化
  3. 市場取引の範囲を制限しないために傾向判断指標を追加する.
  4. 単一の取引リスクを下げるようにポジションのサイズを調整する.

オプティマイゼーションの方向性

戦略は以下の側面で最適化できます.

  1. 迅速かつ遅い MA 期間を異なる製品や市場のために最適化する.
  2. 傾向を特定し,誤った信号をフィルタリングするために他の指標を追加します.例えばMACD,KDJなど.
  3. EMA を SMA または WMA に置き換えることを検討する.
  4. ATRに基づいてストップ損失を動的に調整する.
  5. ポジションサイズを柔軟に調整する.
  6. パラメーターの自己適応最適化 関連性および変動度指標に基づいて

概要

概要すると,これは典型的な二重EMAクロスオーバートレンド追跡戦略である.ストップ・ロスト,テイク・プロフィート,トラッキング・ストップ・ロストなどのリスク管理メカニズムと統合されたトレンド・ムーブメントをキャプチャする利点があります.しかし,ノイズやレンジ・バインド市場への高い敏感性や,罠にかかりやすいような典型的な弱点もあります.追加の指標,パラメータ最適化,ダイナミックな調整,ポートフォリオの使用を導入することで戦略のパフォーマンスを向上させることでさらなる改善ができます.全体的に言えば,適切なパラメータ調節と製品および市場状況に適した良好なフィットネスにより,この戦略は立派な結果を達成することができます.


/*backtest
start: 2023-11-20 00:00:00
end: 2023-12-20 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=2

strategy(title = "Strategy Code Example", shorttitle = "Strategy Code Example", overlay = true)

// Revision:        1
// Author:          @JayRogers
//
// *** THIS IS JUST AN EXAMPLE OF STRATEGY RISK MANAGEMENT CODE IMPLEMENTATION ***

// === GENERAL INPUTS ===
// short ma
maFastSource   = input(defval = open, title = "Fast MA Source")
maFastLength   = input(defval = 14, title = "Fast MA Period", minval = 1)
// long ma
maSlowSource   = input(defval = open, title = "Slow MA Source")
maSlowLength   = input(defval = 21, title = "Slow MA Period", minval = 1)

// === STRATEGY RELATED INPUTS ===
tradeInvert     = input(defval = false, title = "Invert Trade Direction?")
// the risk management inputs
inpTakeProfit   = input(defval = 1000, title = "Take Profit", minval = 0)
inpStopLoss     = input(defval = 200, title = "Stop Loss", minval = 0)
inpTrailStop    = input(defval = 200, title = "Trailing Stop Loss", minval = 0)
inpTrailOffset  = input(defval = 0, title = "Trailing Stop Loss Offset", minval = 0)

// === RISK MANAGEMENT VALUE PREP ===
// if an input is less than 1, assuming not wanted so we assign 'na' value to disable it.
useTakeProfit   = inpTakeProfit  >= 1 ? inpTakeProfit  : na
useStopLoss     = inpStopLoss    >= 1 ? inpStopLoss    : na
useTrailStop    = inpTrailStop   >= 1 ? inpTrailStop   : na
useTrailOffset  = inpTrailOffset >= 1 ? inpTrailOffset : na

// === SERIES SETUP ===
/// a couple of ma's..
maFast = ema(maFastSource, maFastLength)
maSlow = ema(maSlowSource, maSlowLength)

// === PLOTTING ===
fast = plot(maFast, title = "Fast MA", color = green, linewidth = 2, style = line, transp = 50)
slow = plot(maSlow, title = "Slow MA", color = red, linewidth = 2, style = line, transp = 50)

// === LOGIC ===
// is fast ma above slow ma?
aboveBelow = maFast >= maSlow ? true : false
// are we inverting our trade direction?
tradeDirection = tradeInvert ? aboveBelow ? false : true : aboveBelow ? true : false

// === STRATEGY - LONG POSITION EXECUTION ===
enterLong() => not tradeDirection[1] and tradeDirection // functions can be used to wrap up and work out complex conditions
exitLong() => tradeDirection[1] and not tradeDirection
strategy.entry(id = "Long", long = true, when = enterLong()) // use function or simple condition to decide when to get in
strategy.close(id = "Long", when = exitLong()) // ...and when to get out
// === STRATEGY - SHORT POSITION EXECUTION ===
enterShort() => tradeDirection[1] and not tradeDirection
exitShort() => not tradeDirection[1] and tradeDirection
strategy.entry(id = "Short", long = false, when = enterShort())
strategy.close(id = "Short", when = exitShort())

// === STRATEGY RISK MANAGEMENT EXECUTION ===
// finally, make use of all the earlier values we got prepped
strategy.exit("Exit Long", from_entry = "Long", profit = useTakeProfit, loss = useStopLoss, trail_points = useTrailStop, trail_offset = useTrailOffset)
strategy.exit("Exit Short", from_entry = "Short", profit = useTakeProfit, loss = useStopLoss, trail_points = useTrailStop, trail_offset = useTrailOffset)


もっと