GitHub で見る

バゴー EA クラシック戦略

この戦略は、MQL/7656/Bago_ea.mq4 の MetaTrader 専門家の StockSharp を忠実に移植したものです。元のトレンドフォローの哲学を維持しています。指数移動平均と RSI が同じ方向にニュートラル ゾーンを突破した場合にのみエントリーがトリガーされます。一方、ラスベガス トンネルは空間フィルターとして、また段階的なトレーリングのアンカーとして機能します。

取引ロジックの詳細

  1. インジケータースタック
    • 高速 EMA と低速 EMA (FastPeriod/SlowPeriod、共有メソッド MaMethod、適用価格 MaAppliedPrice)。
    • 固定期間 144 および 169 の Vegas トンネル EMA は、同じ設定を使用してトンネル エンベロープをエミュレートします。
    • RSI (RsiPeriodRsiAppliedPrice)、確認フィルターとしてクラシック 50 レベルが使用されます。
    • キャンドル データは CandleType から取得されます。同じローソク足フィードが、高レベルの Bind パイプラインを通じてすべてのインジケーターに電力を供給します。
  2. クロスステート マシン
    • EMA と RSI がしきい値を上回ったり下回ったりすると、ブール値のフラグとバーカウンターが設定されます。各状態は、CrossEffectiveBars のキャンドルが完成した後、または反対のクロスが表示されたときに期限切れになります。これは、MQL バージョンのタイマーとまったく同様です。
    • 追加のトンネル フラグは、終値がラスベガス トンネルの一方の側からもう一方の側にジャンプしたときを追跡するため、トレーリング ロジックはどのレジームを適用するかを認識します。
  3. セッションゲート
    • 取引は、ロンドン (7 時から 16 時まで)、ニューヨーク (12 時から 21 時まで)、東京 (00 時から 8 時までと 23 時足) の選択された市場セッション中にのみ許可されます。これらのウィンドウは、元の EA の extern bool スイッチを複製します。
  4. エントリフィルター
    • ロング: EMA アップ フラグと RSI アップ フラグの両方が必要で、少なくとも TunnelBandWidthPips ただし TunnelSafeZonePips 以下でトンネルの上に強気の終値を設定するか、バウンスをシグナルする TunnelBandWidthPips によってトンネルの下をリトレースメントで閉じるかのいずれかが必要です。
    • 簡単: EMA-down/RSI-down および対称トンネル チェックを使用したミラーリングされた状態。
    • 逆ポジションがオープンしている場合、戦略は新しい方向に入る前に市場でポジションをクローズし、MetaTrader からの OrderClose を模倣します。
  5. ポジションとエグジットの管理
    • 最初のストップロスはエントリーから StopLossPips 離れたところに配置されます。価格がラスベガス トンネルの周囲に停まるたびに、専門家の「フィボ」オフセットに一致する追加のクッション StopLossToFiboPips を使用して停留所が再配置されます。
    • 後続のステップは、EA からの TP レベルに対応します。価格がトンネルから遠ざかると、戦略はまずトンネル ±(TrailingStepX + StopLossToFiboPips) の近くに停留所を駐車し、徐々に純粋な価格追跡の TrailingStopPips のトレーリングに切り替えます。
    • 部分的な終了 (PartialClose1VolumePartialClose2Volume) は、移動が TrailingStep1Pips および TrailingStep2Pips に達すると実行されます。残りのボリュームは、3 番目のステップ (TrailingStep3Pips) に到達するまでトレーリングストップによって管理されます。
    • 逆の EMA/RSI クロスはすぐにフルポジションをクローズします。
  6. 注文の処理
    • 逆指値注文は、SellStop/BuyStop 呼び出しを通じて明示的に維持されます。ストップを移動する必要があるたびに、前の注文はキャンセルされ、新しい注文が送信されます。これは、MQL コードからの繰り返しの OrderModify 呼び出しを反映しています。
    • すべてのピップ計算は商品 PriceStep に依存しており、MetaTrader のポイント変換と同様に、ステップを 10 倍することで 3 桁または 5 桁の相場に合わせて自動的に調整されます。

パラメーター

パラメータ 種類 デフォルト 説明
TradeVolume 10進数 3 新しいシグナルでオープンされた合計ボリューム。
StopLossPips 10進数 30 初期保護停止距離 (pips)。
StopLossToFiboPips 10進数 20 ラスベガスのトンネル帯の周囲で停止する場合の追加のバッファ。
TrailingStopPips 10進数 30 価格がトンネルを出るときのハードトレーリングストップの距離。
TrailingStep1Pips 10進数 55 EA の TP1 レベルから派生した最初の利益層。
TrailingStep2Pips 10進数 89 第 2 の利益層 (TP2)。
TrailingStep3Pips 10進数 144 純粋なトレーリングに切り替える前の 3 番目の利益層 (TP3)。
PartialClose1Volume 10進数 1 TrailingStep1Pips に達すると終了する音量。
PartialClose2Volume 10進数 1 TrailingStep2Pips に達すると終了する音量。
CrossEffectiveBars 整数 2 クロスフラグが有効な間に完了したキャンドルの数。
TunnelBandWidthPips 10進数 5 トンネル周囲の中立地帯であり、新たな取引は避けられます。
TunnelSafeZonePips 10進数 120 突破口の侵入を可能にするトンネルからの最大距離。
EnableLondonSession ブール 本当の 為替時間の07:00から16:00までの取引を可能にします。
EnableNewYorkSession ブール 本当の 為替時間の12:00から21:00までの取引を可能にします。
EnableTokyoSession ブール 00:00 ~ 08:00 と 23:00 のローソク足での取引が可能になります。
FastPeriod 整数 5 高速な EMA の長さ。
SlowPeriod 整数 12 EMA の長さが遅いです。
MaShift 整数 0 移動平均の水平方向の変位。
MaMethod MovingAverageType 指数関数的 EMA 計算モード (実験用に構成可能なまま)。
MaAppliedPrice AppliedPriceType 閉じる ローソク足の価格はEMAに転送されます。
RsiPeriod 整数 21 RSI の平均期間。
RsiAppliedPrice AppliedPriceType 閉じる ローソク足の価格が RSI に転送されました。
CandleType DataType 上半期の時間枠 戦略を強化するキャンドル シリーズ。

実装メモ

  • この戦略は完全に高レベルのローソク足サブスクリプション API で実行され、インジケーター値をローリング リストに保持して、元のスクリプトのバー インデックス付け (Close[1]Close[2]) を模倣します。
  • タイマーとトンネル フラグは、クロスがまだ「新鮮」であるかどうかを判断する有限状態マシンを再現します。
  • StartProtection()OnStarted で呼び出され、StockSharp の組み込みリスク制御が MetaTrader のハードストップロスと同様にオープンポジションを監視します。
  • インライン コメントは英語で書かれており、メンテナンスを容易にするために変換の各ステップが説明されています。
using System;
using System.Collections.Generic;

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

namespace StockSharp.Samples.Strategies;

/// <summary>
/// Bago EA strategy - EMA crossover with RSI confirmation.
/// Buys when fast EMA crosses above slow EMA and RSI is above 50.
/// Sells when fast EMA crosses below slow EMA and RSI is below 50.
/// </summary>
public class BagoEaClassicStrategy : Strategy
{
	private readonly StrategyParam<int> _fastPeriod;
	private readonly StrategyParam<int> _slowPeriod;
	private readonly StrategyParam<int> _rsiPeriod;
	private readonly StrategyParam<decimal> _rsiLevel;
	private readonly StrategyParam<DataType> _candleType;

	private decimal _prevFast;
	private decimal _prevSlow;
	private bool _hasPrev;

	public int FastPeriod { get => _fastPeriod.Value; set => _fastPeriod.Value = value; }
	public int SlowPeriod { get => _slowPeriod.Value; set => _slowPeriod.Value = value; }
	public int RsiPeriod { get => _rsiPeriod.Value; set => _rsiPeriod.Value = value; }
	public decimal RsiLevel { get => _rsiLevel.Value; set => _rsiLevel.Value = value; }
	public DataType CandleType { get => _candleType.Value; set => _candleType.Value = value; }

	public BagoEaClassicStrategy()
	{
		_fastPeriod = Param(nameof(FastPeriod), 5)
			.SetDisplay("Fast EMA", "Fast EMA period", "Indicators");

		_slowPeriod = Param(nameof(SlowPeriod), 12)
			.SetDisplay("Slow EMA", "Slow EMA period", "Indicators");

		_rsiPeriod = Param(nameof(RsiPeriod), 14)
			.SetDisplay("RSI Period", "RSI period", "Indicators");

		_rsiLevel = Param(nameof(RsiLevel), 50m)
			.SetDisplay("RSI Level", "RSI neutral level", "Indicators");

		_candleType = Param(nameof(CandleType), TimeSpan.FromHours(4).TimeFrame())
			.SetDisplay("Candle Type", "Candle timeframe", "General");
	}

	public override IEnumerable<(Security sec, DataType dt)> GetWorkingSecurities() => [(Security, CandleType)];
	protected override void OnReseted() { base.OnReseted(); _prevFast = 0m; _prevSlow = 0m; _hasPrev = false; }

	protected override void OnStarted2(DateTime time)
	{
		base.OnStarted2(time);

		_hasPrev = false;

		var fast = new ExponentialMovingAverage { Length = FastPeriod };
		var slow = new ExponentialMovingAverage { Length = SlowPeriod };
		var rsi = new RelativeStrengthIndex { Length = RsiPeriod };

		var subscription = SubscribeCandles(CandleType);
		subscription
			.Bind(fast, slow, rsi, ProcessCandle)
			.Start();
	}

	private void ProcessCandle(ICandleMessage candle, decimal fast, decimal slow, decimal rsi)
	{
		if (candle.State != CandleStates.Finished)
			return;

		if (!_hasPrev)
		{
			_prevFast = fast;
			_prevSlow = slow;
			_hasPrev = true;
			return;
		}

		var crossUp = _prevFast <= _prevSlow && fast > slow;
		var crossDown = _prevFast >= _prevSlow && fast < slow;

		if (crossUp && rsi > RsiLevel && Position <= 0)
		{
			if (Position < 0)
				BuyMarket();
			BuyMarket();
		}
		else if (crossDown && rsi < RsiLevel && Position >= 0)
		{
			if (Position > 0)
				SellMarket();
			SellMarket();
		}

		_prevFast = fast;
		_prevSlow = slow;
	}
}