暗号取引戦略 MACD をベースに

作者: リン・ハーンチャオチャン, 日時: 2023-09-19 11:21:42
タグ:

概要

この戦略は,暗号通貨の取引信号を識別するために,移動平均収束差異 (MACD) と相対強度指数 (RSI) の指標を使用する.これは,市場動向と過買い/過売りレベルを判断するために,短期および長期移動平均とRSIの違いを計算する.

戦略の論理

  1. 12日間の EMA と 26 日間の EMA を短期間の移動平均と長期間の移動平均として計算する.

  2. MACDヒストグラムとして短期と長期EMAの差を計算する.

  3. MACD の 9 日間の EMA を信号線として計算する.

  4. 14日間のRSIを計算して 買い過ぎ/売過ぎのレベルを判断します

  5. MACDが信号線上を横断し,RSIが81を超えると購入信号が表示されます.

  6. MACDがシグナルラインを下回り,RSIが27未満になると売り信号が表示されます.

  7. 入口と出口に組み込まれた戦略モジュールを使用する.

利点分析

  1. MACDはトレンドと変化を特定し,RSIは過買い/過売りレベルを示します.両方を組み合わせることで信号の正確性が向上します.

  2. ゼロ線上のMACDは,短期傾向と長期傾向の方向性/強さを示します.

  3. RSIは高/低レベルでは,過剰熱/過剰売りが起こりうることを示します.取引信号を見つけるのに役立ちます.

  4. 明確でシンプルな取引シグナルで 取引を体系的に実行しやすい

  5. 最適化と異なる市場条件への適応のためのカスタマイズ可能なパラメータ

リスク分析

  1. MACDとRSIデータは誤ったブレイクや異常に易いので,誤った信号を生む可能性があります.

  2. 固定パラメータは 市場の変化に適応できず 最適化が必要になります

  3. シグナルが遅れて ターニングポイントで取引できないかもしれません

  4. 市場から利益を得られない

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

  1. 最適な設定を見つけるために 異なるパラメータの組み合わせをテストします

  2. 偽の脱出取引を避けるためにフィルターを追加します.

  3. ストップロスを追加して一方的な市場での損失を制限します.

  4. ポジションのサイズ,トレンドの増加,範囲の減少を管理する.

  5. 他の指標と組み合わせれば より正確な信号が得られます

  6. 異なる機器と時間枠でテストする

概要

この戦略は,トレンドと取引信号を特定するためにMACDとRSIの補完的な強みを利用する.微調整パラメータとフィルターを追加することで,強度と収益性を向上させることができます.ストップとポジションサイズ調整はまた,利益を最大化しリスクを最小化するのに役立ちます.MACDとRSIのメリットとデメリットにより,この戦略は短期間のトレンドよりも中期から長期間のトレンドを捉えるのにより適しています.全体として,改善されたバックテストとライブ結果を達成するために,さらなるテストと最適化に値するシンプルで実践的な戦略です.


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

//@version=3
// Revision:        5
// Author:          @Hugo_Moriceau
//study("Thesis_EMLYON_Withdate-strategies-Daily_Crypto_Moriceau_indicator",overlay=true)

// Pyramide 10 order size 100, every tick

strategy("Daily_Crypto_Moriceau_indicator",overlay=true)

// === GENERAL INPUTS ===

fast = 12, slow = 26
fastMA = ema(close, fast)
slowMA = ema(close, slow)

macd = fastMA - slowMA
signal = sma(macd, 9)
rsi = rsi(close,14)



tradeInvert     = input(defval = false, title = "Invert Trade Direction?")

// === LOGIC ===

// is fast ma above slow ma?
aboveBelow = fastMA >= slowMA ? true : false

// are we inverting our trade direction?
tradeDirection = tradeInvert ? aboveBelow ? false : true : aboveBelow ? true : false

// === Plot Setting ===

//plot(fastMA,color=red)
//plot(slowMA,color=blue)
//barcolor(color=iff(fastMA > slowMA, yellow, na))
//barcolor(color=iff(fastMA < slowMA, black, na))
barcolor(color=iff(macd > 0.12*close , fuchsia, na))
barcolor(color=iff(macd < -0.1*close , lime, na))
dataS= macd > 0.125 and rsi>81 and fastMA > slowMA
dataB= macd < -0.1  and rsi<27 and fastMA< slowMA


plotchar(dataB, char='B',color=black,size = size.tiny,location = location.belowbar,transp= 0)  
plotchar(dataS, char='S',color=black,size = size.tiny,location = location.abovebar,transp= 0)


// === BACKTEST RANGE ===
FromMonth = input(defval = 01, title = "From Month", minval = 1)
FromDay   = input(defval = 01, title = "From Day", minval = 1)
FromYear  = input(defval = 2017, title = "From Year", minval = 2014)
ToMonth   = input(defval = 2, title = "To Month", minval = 1)
ToDay     = input(defval = 10, title = "To Day", minval = 1)
ToYear    = input(defval = 2019, title = "To Year", minval = 2018)


// === STRATEGY RELATED INPUTS ===+
// the risk management inputs
inpTakeProfit   = input(defval = 20000, title = "Take Profit", minval = 0)
inpStopLoss     = input(defval = 1500, title = "Stop Loss", minval = 0)
inpTrailStop    = input(defval = 100, 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


// === STRATEGY - LONG POSITION EXECUTION ===

enterLong() => not tradeDirection[1] and tradeDirection 
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)

もっと