
この戦略は,MACD指標を使用して多空方向を識別するトレンド追跡戦略である.それは,高速移動平均と遅い移動平均の差値を計算して,MACD主線を生成する.戦略は,MACD主線と信号線の黄金の交差点を用いて,買取信号を生成し,死を用いて,売出信号を生成し,多空均衡の追跡を実現する.
コードは,まず,戦略の履歴をテストするために,反測の開始時間を設定します.
それから,MACD指標の計算,すなわち,高速移動平均,遅い移動平均,MACD平均線の長さの設定.高速線はより敏感で,遅い線はより安定している.それらの差値がMACD主線を形成し,均等線からMACD信号線を形成する.差値の上のゼロ軸を貫くとき,多頭信号が生じ,ゼロ軸を貫くとき,空頭信号が生じます.
多頭と空頭シグナルに基づいて,最後にシグナルが生じた時間を記録する. 快線と慢線が正交所したとき,購入/売却シグナルを確認して記録する. このとき,ポジションを開くことができる.
入場後,継続的に保有価格の最高値と最低値を追跡する. ストップ損失パーセントを設定し,損失がそのパーセントに達したときにストップ損失退出する.
MACD指標は,トレンドを効果的に識別し,技術分析のクラシック指標の1つです.
価格の変化の動力と方向を早期に捉えるために,遅い平均の差値設計.
均線の波作用を利用して,部分的な偽信号をフィルターすることができる.
戦略はリスク管理のための ストップ・ローズ・メカニズムを導入した.
MACD指標は偽信号を生成しやすい.指標自体は最適化できるスペースは限られている.
ストップポイントの設定が不適切で,過剰にアクティブまたは保守的になり,異なる品種ごとに個別に最適化する必要があります.
固定数値のポジションは,レバレッジを過高にすることが容易であり,資金の規模に応じてリスクの値を設定することを考えることができます.
回帰時間窓の選択の合理性は,過適合を避けるために検証する必要がある.
平均線配列の組み合わせを最適化して,異なる品種に最適のパラメータを適合させる.
K線形,ブリン帯,RSIなどの他の指標フィルターを追加して信号を検証する.
撤回,シャープ比率などの指標によって異なるストップダスの効果を評価することができる.
移動ストップ,固定ストップなどのストップ戦略を最適化します.
資金の変動や変動率などに合わせて動的ポジションを設定してみてください.
MACD多空平衡戦略は,クラシック技術指標に基づいたトレンド追跡戦略である.それは,価格変化の動態に敏感なキャプチャ能力を持ち,パラメータ最適化によって異なる品種にうまく適応することができる.より多くの波指標,止損方法,そしてダイナミックなポジション管理と組み合わせて,戦略の安定性と収益性を向上させることができる.
/*backtest
start: 2023-09-16 00:00:00
end: 2023-10-16 00:00:00
period: 3h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=2
strategy("MACD BF", overlay=true, initial_capital=10000, default_qty_type=strategy.percent_of_equity, default_qty_value=100, commission_type=strategy.commission.percent, commission_value=0.0)
/////////////// Component Code Start ///////////////
testStartYear = input(2017, "Backtest Start Year")
testStartMonth = input(1, "Backtest Start Month")
testStartDay = input(1, "Backtest Start Day")
testPeriodStart = timestamp(testStartYear,testStartMonth,testStartDay, 0, 0)
testStopYear = input(2019, "Backtest Stop Year")
testStopMonth = input(12, "Backtest Stop Month")
testStopDay = input(31, "Backtest Stop Day")
testPeriodStop = timestamp(testStopYear,testStopMonth,testStopDay, 0, 0)
// A switch to control background coloring of the test period
testPeriodBackground = input(title="Color Background?", type=bool, defval=true)
testPeriodBackgroundColor = testPeriodBackground and (time >= testPeriodStart) and (time <= testPeriodStop) ? #00FF00 : na
bgcolor(testPeriodBackgroundColor, transp=97)
testPeriod() => true
/////////////// MACD Component - Default settings for one day. ///////////////
fastLength = input(12) // 72 for 4hr
slowlength = input(26) // 156 for 4 hr
MACDLength = input(12) // 12 for 4hr
MACD = ema(close, fastLength) - ema(close, slowlength)
aMACD = ema(MACD, MACDLength)
delta = MACD - aMACD
long = crossover(delta, 0)
short = crossunder(delta, 0)
last_long = long ? time : nz(last_long[1])
last_short = short ? time : nz(last_short[1])
long_signal = crossover(last_long, last_short)
short_signal = crossover(last_short, last_long)
last_open_long_signal = long_signal ? open : nz(last_open_long_signal[1])
last_open_short_signal = short_signal ? open : nz(last_open_short_signal[1])
last_long_signal = long_signal ? time : nz(last_long_signal[1])
last_short_signal = short_signal ? time : nz(last_short_signal[1])
in_long_signal = last_long_signal > last_short_signal
in_short_signal = last_short_signal > last_long_signal
last_high = not in_long_signal ? na : in_long_signal and (na(last_high[1]) or high > nz(last_high[1])) ? high : nz(last_high[1])
last_low = not in_short_signal ? na : in_short_signal and (na(last_low[1]) or low < nz(last_low[1])) ? low : nz(last_low[1])
sl_inp = input(5.0, title='Stop Loss %', type=float)/100
/////////////// Strategy Component ///////////////
// Strategy Entry
if testPeriod()
strategy.entry("Long Entry", strategy.long, when=long_signal)
strategy.entry("Short Entry", strategy.short, when=short_signal)
since_longEntry = barssince(last_open_long_signal != last_open_long_signal[1]) // LONG SL
since_shortEntry = barssince(last_open_short_signal != last_open_short_signal[1]) // SHORT SL
slLong = in_long_signal ? strategy.position_avg_price * (1 - sl_inp) : na
slShort = strategy.position_avg_price * (1 + sl_inp)
long_sl = in_long_signal ? slLong : na
short_sl = in_short_signal ? slShort : na
// Strategy SL Exit
if testPeriod()
strategy.exit("Long SL", "Long Entry", stop=long_sl, when=since_longEntry > 1)
strategy.exit("Short SL", "Short Entry", stop=short_sl, when=since_shortEntry > 1)
//plot(strategy.equity, title="equity", color=blue, linewidth=2, style=areabr)