GitHub で見る
MACD ヘッジグリッド戦略のサンプル
概要
この戦略は、MetaTrader「MACD サンプル ヘッジ グリッド」エキスパート アドバイザーの StockSharp 移植です。これは、短期的な MACD クロスオーバー、ローカルな EMA スロープ フィルター、およびより長い時間枠の確認を組み合わせたものです。条件が一致すると、戦略は検出された方向にポジションのグリッドを構築し、設定可能な指数によって取引サイズを拡大します。
マーケットロジック
- ベースタイムフレーム: 設定可能 (デフォルトは 5 分足ローソク足)。
- トレンド フィルター: EMA (デフォルトは 26 期間) は、長期取引の場合は上向きに、短期取引の場合は下向きに傾く必要があります。
- MACD トリガー: 高速の MACD ラインは、最小絶対値 (価格ステップで表される) を超えながら、基本時間枠でシグナル ラインを横切る必要があります。
- モメンタムの確認: より高い時間枠でのモメンタムとニュートラル 100 レベルの間の絶対距離は、ロングとショートの個別のしきい値を超える必要があります。最後の 3 つの上位タイムフレーム ローソク足が検査され、元の EA の動作が再現されます。
- 長期的な確認: 長期の時間枠 (デフォルトでは毎月) で計算された MACD は取引方向と一致する必要があります (MACD の上のシグナルは強気環境、下は弱気環境のシグナル)。
シグナルが発火すると、戦略は、エントリの最大数に達していない限り、その方向に新しいグリッドを開始するか、既存のグリッドに追加します。
ポジション管理
- グリッド サイズ: エントリを追加するたびに、初期ボリュームに
LotExponent が乗算されます (デフォルトは 1.44)。ポジションサイズは、方向が変わるかポジションがクローズされるとリセットされます。
- リスク管理: オプションのテイクプロフィットとストップロスの距離は、価格ステップで StockSharp の保護注文に変換されます。
- 方向変更: 反対の信号が到着すると、新しい方向にグリッドを開く前に現在の露出が平坦化されます。
パラメーター
| 名前 |
説明 |
デフォルト |
CandleType |
MACD と EMA の計算に使用される主な時間枠。 |
5分の時間枠 |
MomentumCandleType |
より高いタイムフレームが勢いを確認します。 |
30分の時間枠 |
TrendCandleType |
トレンド MACD フィルターに使用される長い時間枠。 |
30日間の期間 |
FastMaPeriod |
MACD 内の高速な EMA の長さ。 |
12 |
SlowMaPeriod |
MACD 内の EMA の長さが遅いです。 |
26 |
SignalPeriod |
MACD の信号 SMA の長さ。 |
9 |
TrendMaPeriod |
ローカル トレンド フィルターの EMA の長さ。 |
26 |
MomentumPeriod |
モメンタムインジケーターの長さ(より高いタイムフレーム)。 |
14 |
MacdOpenLevel |
取引に必要な最小絶対値 MACD レベル (価格ステップ単位)。 |
3 |
MomentumBuyThreshold |
ロングの場合の最小絶対運動量距離は 100 からです。 |
0.3 |
MomentumSellThreshold |
ショートの場合の最小絶対運動量距離は 100 からです。 |
0.3 |
MaxTrades |
方向ごとのグリッド エントリの最大数。 |
10 |
LotExponent |
追加のグリッド エントリごとに使用される乗数。 |
1.44 |
StopLossSteps |
価格ステップで測定されるストップロス距離。 |
20 |
TakeProfitSteps |
価格ステップで測定される利食い距離。 |
50 |
注意事項
- オリジナルの EA には、金額ベースのトレーリング、損益分岐点の動き、口座資本のストップも含まれていました。これらの機能には、ブローカー固有のポートフォリオ データと手動の注文管理が必要です。これらは、この高レベルの StockSharp 変換では実装されていません。
- ローソク足のサブスクリプション、インジケーター バインディング、取引実行は、StockSharp が推奨する高レベルの API の使用法に従います。
- 選択した商品が設定されたローソク足タイプをサポートしていること、および参照されているすべての時間枠で履歴データが利用可能であることを確認してください。
namespace StockSharp.Samples.Strategies;
using System;
using Ecng.Common;
using StockSharp.Algo.Indicators;
using StockSharp.Algo.Strategies;
using StockSharp.Messages;
/// <summary>
/// MACD Sample Hedging Grid: MACD crossover with grid-like position management.
/// </summary>
public class MacdSampleHedgingGridStrategy : Strategy
{
private readonly StrategyParam<DataType> _candleType;
public DataType CandleType
{
get => _candleType.Value;
set => _candleType.Value = value;
}
public MacdSampleHedgingGridStrategy()
{
_candleType = Param(nameof(CandleType), TimeSpan.FromMinutes(30).TimeFrame())
.SetDisplay("Candle Type", "Candle timeframe", "General");
}
protected override void OnStarted2(DateTime time)
{
base.OnStarted2(time);
var macd = new MovingAverageConvergenceDivergence();
decimal? prevMacd = null;
var subscription = SubscribeCandles(CandleType);
subscription
.Bind(macd, (candle, macdLine) =>
{
if (candle.State != CandleStates.Finished)
return;
if (!IsFormedAndOnlineAndAllowTrading())
return;
if (prevMacd.HasValue)
{
if (prevMacd.Value <= 0 && macdLine > 0 && Position <= 0)
BuyMarket();
else if (prevMacd.Value >= 0 && macdLine < 0 && Position >= 0)
SellMarket();
}
prevMacd = macdLine;
})
.Start();
var area = CreateChartArea();
if (area != null)
{
DrawCandles(area, subscription);
DrawOwnTrades(area);
}
}
}
import clr
clr.AddReference("StockSharp.Messages")
clr.AddReference("StockSharp.Algo")
clr.AddReference("StockSharp.Algo.Indicators")
clr.AddReference("StockSharp.Algo.Strategies")
from System import TimeSpan
from StockSharp.Messages import DataType, CandleStates
from StockSharp.Algo.Indicators import MovingAverageConvergenceDivergence
from StockSharp.Algo.Strategies import Strategy
class macd_sample_hedging_grid_strategy(Strategy):
def __init__(self):
super(macd_sample_hedging_grid_strategy, self).__init__()
self._macd = None
self._prev_macd = None
def OnReseted(self):
super(macd_sample_hedging_grid_strategy, self).OnReseted()
self._macd = None
self._prev_macd = None
def OnStarted2(self, time):
super(macd_sample_hedging_grid_strategy, self).OnStarted2(time)
self._macd = MovingAverageConvergenceDivergence()
subscription = self.SubscribeCandles(DataType.TimeFrame(TimeSpan.FromMinutes(30)))
subscription.Bind(self._macd, self._process_candle)
subscription.Start()
def _process_candle(self, candle, macd_value):
if candle.State != CandleStates.Finished:
return
if not self._macd.IsFormed:
return
macd_line = float(macd_value)
if self._prev_macd is not None:
if self._prev_macd <= 0.0 and macd_line > 0.0 and self.Position <= 0:
self.BuyMarket()
elif self._prev_macd >= 0.0 and macd_line < 0.0 and self.Position >= 0:
self.SellMarket()
self._prev_macd = macd_line
def CreateClone(self):
return macd_sample_hedging_grid_strategy()