GitHub で見る

戦略 SUPERMACBOT by The Guardian Forex TV Strategy

概要

SUPERMACBOT by The Guardian Forex TV Strategy は、MACD オシレーターとデュアル単純移動平均トレンド フィルターおよびトレーリング平均出口フィルターを組み合わせることで、オリジナルの MetaTrader エキスパート アドバイザーのコンセプトを再現しています。変換された StockSharp 実装は、完了したローソク足で動作し、強気または弱気の合流点が形成されるたびに成行注文を送信します。この戦略はティックごとの取引を回避し、ローソク足のサブスクリプションとインジケーター バインディングに依存することで、高レベルの API ガイドラインに従います。

取引エンジンは、MACD ヒストグラムと 2 つの単純な移動平均間のトレンドの調整を通じて勢いを評価します。末尾移動平均は、取引管理参照と遅延確認フィルターの両方として機能し、MQL エキスパートで設定された末尾モジュールを反映します。 StockSharp バージョンは、すべてのキー値を構成可能なパラメータとして公開することで、金融商品や時間枠を超えた明確さと移植性に重点を置いています。

取引ロジック

  1. データ ソース – ストラテジーは、構成可能なローソク足タイプ (タイムフレーム) をサブスクライブします。完了したキャンドルごとに決定フローがトリガーされます。
  2. インジケーターの準備 – MACD (調整可能なファースト、スロー、シグナル期間あり) と 2 つの SMA がローソク足ごとに再計算されます。追加の SMA は、MQL エキスパートからの末尾フィルターを複製します。
  3. エントリールール
    • ロングエントリー
      • MACD ヒストグラムが設定可能なしきい値を超えています。
      • 速い SMA は遅い SMA を上回っており、確立された強気傾向を示しています。
      • 価格の強さを確保するために、終値は末尾の SMA を上回っています。
      • この戦略には既存のロング ポジションがありません (ネット ポジションが 1 つだけ維持されます)。
    • 短いエントリー
      • MACD ヒストグラムが負のしきい値を下回っています。
      • 速い SMA は遅い SMA を下回っており、弱気の環境であることを示しています。
      • 終値は末尾の SMA を下回ったままです。
      • この戦略ではショートエクスポージャは一切禁止されています。
  4. 退出ルール
    • ロング ポジションは、次のいずれかが発生したときに閉じられます。ヒストグラムがマイナスになる、速い SMA が遅い SMA を下回る、または価格が後続の SMA を下回って閉じる。
    • ヒストグラムがプラスに転じた場合、速い SMA が遅い SMA を上回った場合、または価格が後続の SMA を上回った場合、ショート ポジションはクローズされます。
  5. リスク処理 – このアルゴリズムは単一のネット ポジションを取引し、ピラミッド取引は行いません。必要に応じて、StockSharp リスク ルールを使用して、保護停止を外部から追加できます。

パラメーター

名前 説明 デフォルト
CandleType 戦略的に加工されたキャンドルシリーズ。 1分間の時間枠
FastMaPeriod 高速単純移動平均フィルターの周期。 12
SlowMaPeriod 低速単純移動平均フィルターの周期。 26
MacdFastPeriod MACD インジケーターの速い EMA 期間。 12
MacdSlowPeriod MACD インジケーターの EMA 期間が遅い。 24
MacdSignalPeriod MACD インジケーターの EMA 期間をシグナルします。 9
HistogramThreshold ポジションを開く前に、MACD ヒストグラムから必要な最小絶対値。 0.0
TrailingPeriod 確認と決済に使用される後続単純移動平均の期間。 12

すべてのパラメータは StrategyParam<T> を通じて公開され、StockSharp デザイナー内で最適化できます。

使用上の注意

  • テスト環境に適したセキュリティと期間に戦略を追加します。
  • 取引が開始される前にすべてのインジケーターが完全に形成されるように、十分な履歴バッファーが利用可能であることを確認してください。
  • この戦略は完成したローソク足とネットポジションで機能するため、注文が競合することなく複数の商品ポートフォリオで安全に実行できます。
  • 他の StockSharp モジュールを使用して戦略を構成することで、追加の資金管理 (ロットサイジング、ストップロス、部分的エグジット) を追加できます。

オリジナルエキスパートとの違い

  • StockSharp 変換は、MetaTrader エキスパート アドバイザーのイベント駆動型エンジンではなく、ローソク足終値ロジックに重点を置いています。これにより、バックテストとライブ取引全体で動作が決定的に保たれます。
  • 元の Expert Advisor からのロットサイジングとトレーリングストップ注文は、トレーリング平均によって条件付けられる簡素化されたポジションベースのエグジットに置き換えられます。
  • 信号のしきい値は、MACD ヒストグラムしきい値パラメーターを介して処理され、ユーザーは値を調整することで MQL エキスパートのスコアリング システムを模倣できます。

免責事項

取引アルゴリズムには財務リスクが伴います。実際の資金を投入して戦略を展開する前に、戦略を徹底的にバックテストおよびフォワードテストします。

using System;
using System.Linq;
using System.Collections.Generic;

using Ecng.Common;
using Ecng.Collections;
using Ecng.Serialization;

using StockSharp.Algo.Indicators;
using StockSharp.Algo.Strategies;
using StockSharp.BusinessEntities;
using StockSharp.Messages;

namespace StockSharp.Samples.Strategies;

/// <summary>
/// SUPERMACBOT strategy converted from the MQL expert by The Guardian Forex TV.
/// </summary>
public class SupermacbotByTheGuardianForexTvStrategy : Strategy
{
	private readonly StrategyParam<DataType> _candleType;
	private readonly StrategyParam<int> _fastMaPeriod;
	private readonly StrategyParam<int> _slowMaPeriod;
	private readonly StrategyParam<int> _macdFastPeriod;
	private readonly StrategyParam<int> _macdSlowPeriod;
	private readonly StrategyParam<int> _macdSignalPeriod;
	private readonly StrategyParam<decimal> _histogramThreshold;
	private readonly StrategyParam<int> _trailingPeriod;

	/// <summary>
	/// Candle type to process.
	/// </summary>
	public DataType CandleType
	{
		get => _candleType.Value;
		set => _candleType.Value = value;
	}

	/// <summary>
	/// Fast simple moving average period.
	/// </summary>
	public int FastMaPeriod
	{
		get => _fastMaPeriod.Value;
		set => _fastMaPeriod.Value = value;
	}

	/// <summary>
	/// Slow simple moving average period.
	/// </summary>
	public int SlowMaPeriod
	{
		get => _slowMaPeriod.Value;
		set => _slowMaPeriod.Value = value;
	}

	/// <summary>
	/// Fast EMA period for MACD.
	/// </summary>
	public int MacdFastPeriod
	{
		get => _macdFastPeriod.Value;
		set => _macdFastPeriod.Value = value;
	}

	/// <summary>
	/// Slow EMA period for MACD.
	/// </summary>
	public int MacdSlowPeriod
	{
		get => _macdSlowPeriod.Value;
		set => _macdSlowPeriod.Value = value;
	}

	/// <summary>
	/// Signal EMA period for MACD.
	/// </summary>
	public int MacdSignalPeriod
	{
		get => _macdSignalPeriod.Value;
		set => _macdSignalPeriod.Value = value;
	}

	/// <summary>
	/// Minimal absolute histogram value required for new entries.
	/// </summary>
	public decimal HistogramThreshold
	{
		get => _histogramThreshold.Value;
		set => _histogramThreshold.Value = value;
	}

	/// <summary>
	/// Trailing simple moving average period.
	/// </summary>
	public int TrailingPeriod
	{
		get => _trailingPeriod.Value;
		set => _trailingPeriod.Value = value;
	}

	/// <summary>
	/// Initializes a new instance of <see cref="SupermacbotByTheGuardianForexTvStrategy"/>.
	/// </summary>
	public SupermacbotByTheGuardianForexTvStrategy()
	{
		_candleType = Param(nameof(CandleType), TimeSpan.FromMinutes(5).TimeFrame())
			.SetDisplay("Candle Type", "Type of candles to process", "General");

		_fastMaPeriod = Param(nameof(FastMaPeriod), 12)
			.SetGreaterThanZero()
			.SetDisplay("Fast SMA", "Fast SMA period", "Indicators")
			
			.SetOptimize(5, 30, 1);

		_slowMaPeriod = Param(nameof(SlowMaPeriod), 26)
			.SetGreaterThanZero()
			.SetDisplay("Slow SMA", "Slow SMA period", "Indicators")
			
			.SetOptimize(10, 60, 1);

		_macdFastPeriod = Param(nameof(MacdFastPeriod), 12)
			.SetGreaterThanZero()
			.SetDisplay("MACD Fast", "MACD fast EMA period", "Indicators")
			
			.SetOptimize(5, 20, 1);

		_macdSlowPeriod = Param(nameof(MacdSlowPeriod), 24)
			.SetGreaterThanZero()
			.SetDisplay("MACD Slow", "MACD slow EMA period", "Indicators")
			
			.SetOptimize(18, 40, 1);

		_macdSignalPeriod = Param(nameof(MacdSignalPeriod), 9)
			.SetGreaterThanZero()
			.SetDisplay("MACD Signal", "MACD signal EMA period", "Indicators")
			
			.SetOptimize(3, 15, 1);

		_histogramThreshold = Param(nameof(HistogramThreshold), 0m)
			.SetDisplay("Histogram Threshold", "Required MACD histogram magnitude", "Logic");

		_trailingPeriod = Param(nameof(TrailingPeriod), 12)
			.SetGreaterThanZero()
			.SetDisplay("Trailing SMA", "Trailing SMA period", "Logic")
			
			.SetOptimize(6, 30, 1);
	}

	/// <inheritdoc />
	public override IEnumerable<(Security sec, DataType dt)> GetWorkingSecurities()
	{
		return [(Security, CandleType)];
	}

	/// <inheritdoc />
	protected override void OnReseted()
	{
		base.OnReseted();

	}

	/// <inheritdoc />
	protected override void OnStarted2(DateTime time)
	{
		base.OnStarted2(time);

		var fastMa = new SimpleMovingAverage { Length = FastMaPeriod };
		var slowMa = new SimpleMovingAverage { Length = SlowMaPeriod };
		var trailingMa = new SimpleMovingAverage { Length = TrailingPeriod };

		var subscription = SubscribeCandles(CandleType);
		subscription
			.Bind(fastMa, slowMa, trailingMa, ProcessCandle)
			.Start();

		StartProtection(
			takeProfit: new Unit(2, UnitTypes.Percent),
			stopLoss: new Unit(1, UnitTypes.Percent));

		var area = CreateChartArea();
		if (area != null)
		{
			DrawCandles(area, subscription);
			DrawIndicator(area, fastMa);
			DrawIndicator(area, slowMa);
			DrawOwnTrades(area);
		}
	}

	private void ProcessCandle(ICandleMessage candle, decimal fastMa, decimal slowMa, decimal trailingMa)
	{
		if (candle.State != CandleStates.Finished)
			return;

		if (Position != 0)
			return;

		var bullishTrend = fastMa > slowMa;
		var bearishTrend = fastMa < slowMa;
		var price = candle.ClosePrice;

		if (bullishTrend && price > trailingMa)
			BuyMarket();
		else if (bearishTrend && price < trailingMa)
			SellMarket();
	}
}