GitHub で見る

Alexav D1 利益 GBPUSD 戦略

概要

Alexav D1 Profit GBPUSD は、MetaTrader 4 Expert Advisor Alexav_d1_profit_gbpusd.mq4 から変換された日次ブレイクアウト システムです。この戦略は GBP/USD の毎日のローソク足で動作し、完了したセッションを 1 日 1 回 (火曜日から金曜日まで) 評価します。モメンタムの確認は RSI と MACD によって提供され、ボラティリティ調整されたストップと段階的な利益目標は ATR から得られます。

取引ロジック

  1. インジケーターの準備
    • 同じ期間の 2 つの EMA が毎日の高値と安値に適用され、強気と弱気の基準レベルが定義されます。
    • 10 期間のルックバックを使用した RSI は勢いを測定します。 RSI の測定値が極端に高いと、その方向への新規取引が一時的にブロックされます。
    • MACD (5/24/14) は、最後の 2 つのヒストグラム値を比較することによって加速フィルターを提供します。
    • ATR (28) は、ストップと利益目標に使用されるボラティリティ単位を提供します。
  2. セッションフィルター
    • 火曜日から金曜日までの完了した日次キャンドルごとに 1 つの評価のみが実行されます。月曜日と週末は省略されます。
  3. 長いセットアップ
    • 前回の日次ローソク足は、2 セッション前に計算された高値の EMA を上回って終了する必要があります。
    • 前のセッションの RSI は、上限レベル (デフォルト 60) を超え、上限 (デフォルト 80) を下回っている必要があります。
    • MACD は、2 セッション前にゼロ未満になっているか、前の値と比較して十分な正の加速度を示している必要があります。
    • 前回の始値が高値の EMA を下回った場合、この戦略ではブロックがリセットされた後に新しいバッチの購入が可能になります。
  4. 簡単なセットアップ
    • EMA の低値、RSI の下限しきい値 (39 / 25)、および MACD フィルターを使用した、長いセットアップのミラー ロジック。

注文管理

設定が確認されると、戦略は 4 つの成行注文のバッチを開始します (それぞれ戦略 Volume を使用します)。

  • ストップ: 各注文は、エントリー価格から ATR * AtrStopMultiplier (デフォルト 1.6) 離れた同じ保護ストップを共有します。
  • 目標: 利益目標は、[0..3] の注文インデックス i に対して AtrTargetMultiplier * (1 + i / 2) ずつスケールされ、元の EA の 1.0、1.5、2.0、および 2.5 ATR オフセットを複製します。
  • 競合処理: 新しいバッチを開く前に、反対のポジションがフラット化されます。長いバッチをトリガーすると、保留中の短いバッチがクリアされます (逆も同様)。

この戦略は完成したキャンドルを監視します。毎日の安値がストップに接触した場合、対応するロング注文は市場でクローズされます。高値が目標に達した場合、注文もクローズされます。ショートはストップのローソク高値とターゲットの安値を使用して対称的に処理されます。

パラメーター

パラメータ 説明 デフォルト
CandleType プライマリーキャンドルシリーズ、デフォルトで毎日。 1日
MaPeriod 高値/安値に適用される EMA の期間。 6
RsiPeriod 運動量フィルターの RSI 期間。 10
AtrPeriod ストップ/ターゲットのサイジングの期間は ATR です。 28
AtrStopMultiplier 停留所の場合は ATR 倍です。 1.6
AtrTargetMultiplier ターゲットの基本 ATR 倍数。 1.0
RsiUpperLevel RSI のしきい値は強気の勢いを裏付けています。 60
RsiUpperLimit 新しいロングをブロックする RSI キャップ。 80
RsiLowerLevel RSI のしきい値は弱気の勢いを裏付けています。 39
RsiLowerLimit 新しいショーツをブロックする RSI 階。 25
FastMaPeriod MACD の高速 EMA 期間。 5
SlowMaPeriod MACDのEMA期間が遅いです。 24
SignalMaPeriod MACD の EMA 期間を信号で知らせます。 14
MacdDiffBuy ロングの最小加速度は MACD です。 0.5
MacdDiffSell ショートパンツの最小加速度は MACD です。 0.15

戦略を開始する前に、戦略 Volume を注文ごとに希望のロットサイズに設定します。

注意事項

  • 変換では、元の Expert Advisor にある 1 日あたり 1 回の評価ロジックが維持されます。
  • 意図した動作を再現するためにバックテストを行う場合は、GBP/USD の日次履歴データを使用します。
  • 保護的なストップとターゲットは、完成したローソク足の極値を使用してシミュレートされます。日次ローソク足内の日中のスパイクは戦略には表示されません。
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>
/// Alexav D1 Profit breakout strategy.
/// Buys when price breaks above EMA and RSI is rising.
/// Sells when price breaks below EMA and RSI is falling.
/// </summary>
public class AlexavD1ProfitGbpUsdBreakoutStrategy : Strategy
{
	private readonly StrategyParam<int> _emaPeriod;
	private readonly StrategyParam<int> _rsiPeriod;
	private readonly StrategyParam<DataType> _candleType;

	private decimal _prevClose;
	private decimal _prevEma;
	private decimal _prevRsi;
	private bool _hasPrev;

	public int EmaPeriod { get => _emaPeriod.Value; set => _emaPeriod.Value = value; }
	public int RsiPeriod { get => _rsiPeriod.Value; set => _rsiPeriod.Value = value; }
	public DataType CandleType { get => _candleType.Value; set => _candleType.Value = value; }

	public AlexavD1ProfitGbpUsdBreakoutStrategy()
	{
		_emaPeriod = Param(nameof(EmaPeriod), 20)
			.SetDisplay("EMA Period", "EMA period", "Indicators");

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

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

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

	/// <inheritdoc />
	protected override void OnReseted()
	{
		base.OnReseted();
		_prevClose = 0m;
		_prevEma = 0m;
		_prevRsi = 0m;
		_hasPrev = false;
	}

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

		_hasPrev = false;

		var ema = new ExponentialMovingAverage { Length = EmaPeriod };
		var rsi = new RelativeStrengthIndex { Length = RsiPeriod };

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

	private void ProcessCandle(ICandleMessage candle, decimal emaValue, decimal rsiValue)
	{
		if (candle.State != CandleStates.Finished)
			return;

		var close = candle.ClosePrice;

		if (!_hasPrev)
		{
			_prevClose = close;
			_prevEma = emaValue;
			_prevRsi = rsiValue;
			_hasPrev = true;
			return;
		}

		// Breakout above EMA with rising RSI
		if (_prevClose <= _prevEma && close > emaValue && rsiValue > _prevRsi && Position <= 0)
		{
			if (Position < 0)
				BuyMarket();
			BuyMarket();
		}
		// Breakout below EMA with falling RSI
		else if (_prevClose >= _prevEma && close < emaValue && rsiValue < _prevRsi && Position >= 0)
		{
			if (Position > 0)
				SellMarket();
			SellMarket();
		}

		_prevClose = close;
		_prevEma = emaValue;
		_prevRsi = rsiValue;
	}
}