指数関数移動平均値とMACD指標に基づく戦略

作者: リン・ハーンチャオチャン, 日付: 2023-12-08 16:58:01
タグ:

img

概要

この戦略は,指数的な移動平均値とMACD指標からのブレイクアウト信号を,長期および短期保持期間の両方で組み合わせ,トレンドフォローと平均逆転取引を通じて利益を実現します.

戦略原則

この戦略は主に以下の点に基づいています.

  1. 主なトレンド方向を決定するために200日間のEMAを計算する. 200-EMAを超える閉値は上昇傾向を示し,下値は下落傾向を示します.

  2. EMAを計算し,MACDヒストグラムを構成するために EMAと最高/最低価格の差を計算します.

  3. MACDヒストグラムの9日間MAを計算してMACD信号線を構成する.

  4. MACDが信号線の上を横切ると買い信号が生成され,MACDが信号線下を横切ると売り信号が生成される.

  5. 主要な動向の分析を組み合わせて,市場が新しい動向の始まりなのか,それとも短期的な逆転なのかを判断します.

利点

この戦略は,トレンドフォローと平均リバーストレードの両方を組み合わせ,長期トレンドを追跡し,異なる市場状況に対応するための短期リバース機会を把握することができます.

主な利点は以下の通りです.

  1. 200日間のEMAは主要なトレンド方向を決定し,トレンドに反する取引を避けます.

  2. MACD指標は短期的な価格変動に敏感で,収益性の高い逆転信号を捉えることができます.

  3. MACD 構成要素の異なるパラメータは,時間枠を超えて取引信号を生成することができます.

  4. 単一の取引損失を効果的に制御するためにストップ損失戦略を統合します.

リスク

主なリスクは以下です.

  1. 長期指標と短期指標からの取引シグナルの間には時間遅れがある可能性があります.主要なトレンドに関する判断は重要です.

  2. 平均逆転指数であるMACDは,強いトレンドの間,劣悪なパフォーマンスを示す可能性があります.

  3. 誤ったストップ・ロスの配置は,早期にストップ・ロスのトリガーまたは過剰な損失を引き起こす可能性があります.

  4. 過剰に頻繁に 信号が発信されれば 誤った信号が増える可能性があります

解決策:

  1. MACD パラメータを最適化して指標の感度を調整する.

  2. 他の指標を組み合わせて 市場の状況を判断し,MACD信号を盲目的に従うのを避けます

  3. ストップ・ロスの戦略のパラメータをテストして最適化します

  4. 偽信号を減らすためにフィルターを追加します.

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

戦略を最適化するには

  1. 移動平均値とMACDのパラメータを最適化して,より効果的な取引信号を得る.

  2. 戦略の有効性を高めるため,RSIなどの他の指標を追加します.

  3. 取引ごとに定量ではなく ポジションサイズを決めるルールを設定します

  4. ストップ・ロスの上には,より高度な退出規則を追加します.例えば,利益目標,トライリング・ストップ.

  5. リアルな取引をシミュレートするために より現実的な料金設定でバックテストします

  6. 信頼性を向上させるため 歩み先の分析や強度テストを行います

結論

この戦略は,トレンドフォローと平均逆転トレードをバランスする.本質は適切なパラメータ調節と主要なトレンドの正しい理解にあります.パラメータを最適化し,フィルターを追加することで,戦略はより良い取引信号判断を行い,より安定した利益を達成することができます.全体的に言えば,この戦略は高い統合度と有望なアプリケーション見通しを持っています.


/*backtest
start: 2022-12-01 00:00:00
end: 2023-12-07 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
strategy("Strategia EMA + Impulse MACD", shorttitle="EMA+IMACD", overlay=true)

// Impostazioni
ema_length = input(200, title="Periodo EMA a 200", type=input.integer)
lengthMA = input(34, title="Periodo EMA", type=input.integer)
lengthSignal = input(9, title="Periodo Signal", type=input.integer)
lengthImpulseMACD = input(12, title="Periodo Impulse MACD", type=input.integer)
lengthImpulseMACDSignal = input(9, title="Periodo Impulse MACD Signal", type=input.integer)
stopLossPeriod = input(20, title="Periodo Stop Loss", type=input.integer)

var float ema200 = na
if bar_index >= ema_length
    ema200 := ema(close, ema_length)

// Impulse MACD
var float hi = na
var float lo = na
var float mi = na
var float impulseMACD = na
var float impulseMACDSignal = na

calc_smma(src, len) =>
    var float smma = na
    if na(smma)
        smma := sma(src, len)
    else
        smma := (smma[1] * (len - 1) + src) / len
    smma

calc_zlema(src, length) =>
    ema1 = ema(src, length)
    ema2 = ema(ema1, length)
    d = ema1 - ema2
    ema1 + d

if bar_index >= lengthMA
    src = hlc3
    hi := calc_smma(high, lengthMA)
    lo := calc_smma(low, lengthMA)
    mi := calc_zlema(src, lengthMA)

    impulseMACD := (mi > hi) ? (mi - hi) : (mi < lo) ? (mi - lo) : 0
    impulseMACDSignal := sma(impulseMACD, lengthSignal)

// Calcolo dello stop loss
var float stopLossLong = na
var float stopLossShort = na

stopLossLong := lowest(low, stopLossPeriod)
stopLossShort := highest(high, stopLossPeriod)

// Calcolo del take profit
var float takeProfitLong = na
var float takeProfitShort = na

if not na(stopLossLong)
    takeProfitLong := close + (close - stopLossLong) * 1.5
if not na(stopLossShort)
    takeProfitShort := close - (stopLossShort - close) * 1.5

// Condizioni per aprire una posizione long
longCondition = not na(ema200) and not na(impulseMACD) and not na(impulseMACDSignal) and close > ema200 and impulseMACD < 0 and impulseMACDSignal < 0 and crossover(impulseMACD, impulseMACDSignal)

// Condizioni per aprire una posizione short
shortCondition = not na(ema200) and not na(impulseMACD) and not na(impulseMACDSignal) and close < ema200 and impulseMACD > 0 and impulseMACDSignal > 0 and crossunder(impulseMACD, impulseMACDSignal)

// Disegna l'EMA 200 sul grafico
plot(ema200, color=color.blue, title="EMA 200")

// Imposta lo stop loss e il take profit
strategy.entry("Long", strategy.long, when=longCondition)
strategy.entry("Short", strategy.short, when=shortCondition)
strategy.exit("Take Profit/Stop Loss Long", from_entry="Long", stop=stopLossLong, limit=takeProfitLong)
strategy.exit("Take Profit/Stop Loss Short", from_entry="Short", stop=stopLossShort, limit=takeProfitShort)

// Impulse MACD
plot(0, color=color.gray, linewidth=1, title="MidLine")
plot(impulseMACD, color=color.red, linewidth=2, title="ImpulseMACD", style=plot.style_histogram)
plot(impulseMACDSignal, color=color.blue, linewidth=2, title="ImpulseMACDSignal", style=plot.style_histogram)

// Disegna le operazioni long e short sul grafico
plotshape(series=longCondition, location=location.belowbar, color=color.green, style=shape.triangleup, title="Long Entry")
plotshape(series=shortCondition, location=location.abovebar, color=color.red, style=shape.triangledown, title="Short Entry")


もっと