GitHub で見る

Alexav D1 Profit GBPUSD戦略

高値に対して計算されたEMA、RSIフィルター、MACDモメンタム確認、ATRベースのリスク管理を組み合わせたGBPUSDの日足ブレイクアウトシステム。スクリプトはオリジナルのMetaTraderバージョンの4段階の利益確定と損益分岐点動作を再現します。

主要事実

  • 市場: GBP/USD スポットまたはCFD
  • 時間軸: 日足ローソク足(設定可能)
  • 方向: ロングとショート
  • ポジションスタイル: 共有ストップロスを持つマルチターゲットスケーリング
  • 使用インストゥルメント: EMA (High)、RSI、MACDメインライン、ATR

インジケーター設定

  1. 高値のEMA – デフォルト長6、動的ブレイクアウトレベルを近似します。
  2. RSI – デフォルト長10、モメンタムフィルターとして使用される買われすぎ/売られすぎのコリドーを定義します。
  3. MACDメインライン – 速い5、遅い21、シグナル14。モメンタムの傾きを測定するためにメインラインのみが使用されます。
  4. ATR – 長28、ボラティリティに依存するストップとターゲットを提供します。

エントリーロジック

ロングエントリー

  1. 前の日足バーはEMA (High)を下回って開き、その上で閉じます(上昇クロス確認)。
  2. RSIは6080の間に留まります – 弱いモメンタム時のトレードを防ぎ、過度に伸びたラリーを避けます。
  3. MACDメインラインは2つのモメンタムチェックのうちの1つを満たします:
    • 2バー前の値が負(トレンドが最近プラスに転じたことを示す)、または
    • 最後の2バーの間の絶対MACD相対削減が設定可能なMacdDiffBuyしきい値(デフォルト0.5)を超える。

すべての条件が満たされると、4つの等しい成行買い注文が発注されます(デフォルト各0.1ロット)。新しいバッチが送られる前に、既存のショートエクスポージャーはフラット化されます。

ショートエントリー

  1. バーはEMA (High)を上回って開き、その下で閉じます。
  2. RSIは2539の間にあります – ロング側のしきい値を反映します。
  3. 2バー前のMACDがプラス、または最後の2バーの間の絶対MACDの相対変化がMacdDiffSell(デフォルト0.15)を上回ります。

確認時、戦略は既存のロングをフラット化してから4つの等しい成行売りを送ります。

トレード管理

  • 初期ストップ: エントリークローズから計算された共有ATRストップ。ロングはentry - ATR * StopLossMultiplier(デフォルト1.6)を使用します。ショートはentry + ATR * StopLossMultiplierを使用します。
  • 利益ターゲット: 方向ごとに4つのインクリメンタルATRベースのレベル: TakeProfitMultiplierパラメーター(デフォルト1)でスケールされた1.01.52.02.5 ATR倍数。各レベルは価格がレベルを通過したときに成行注文で元のポジションの4分の1をクローズします。
  • 損益分岐点動作: 各部分出口後、残りのポジションの保護ストップが最新のターゲット価格に移動されます。これはTPトレードが発生するたびにストップロスをフィルされたテイクプロフィット価格に変更するオリジナルEAを模倣します。
  • ストップ処理: 価格が保護レベルにイントラバーで触れた場合(ローソク足の高値/安値を使用)、残りのポジションは即座に成行でクローズされます。

リスク管理の注意事項

  • 戦略は4エントリーバッチを超えてピラミッドしません。同じ方向にエクスポージャーが残っている間、新しいシグナルは無視されます。
  • ATRは正でなければなりません;ボラティリティインジケーターがまだ形成されていない場合、シグナルはスキップされます。
  • ランタイムでのパラメーター変更は将来の注文のみに影響します;注文ごとのボリュームはエントリー時に出口での正しいスケーリングのために取得されます。

パラメーター

名前 説明 デフォルト
OrderVolume バッチ内の個別成行注文ごとのボリューム 0.1
EmaPeriod ローソク足の高値に適用されるEMA長 6
RsiPeriod RSI平均期間 10
AtrPeriod ATR平均期間 28
StopLossMultiplier 保護ストップのATR倍数 1.6
TakeProfitMultiplier 利益ターゲットの基本ATR倍数 1.0
MacdFastPeriod MACD速いEMA長 5
MacdSlowPeriod MACD遅いEMA長 21
MacdSignalPeriod MACDシグナルEMA長 14
MacdDiffBuyThreshold ロングトレードの最小MACD傾き改善 0.5
MacdDiffSellThreshold ショートトレードの最小MACD傾き改善 0.15
RsiUpperLimit ロングエントリー前の最大許容RSI 80
RsiUpperLevel ロングエントリーに必要な最小RSI 60
RsiLowerLevel ショートエントリーの最大許容RSI 39
RsiLowerLimit ショート前の最小必要RSI 25
CandleType ローソク足サブスクリプションに使用される時間軸 1 Day

デプロイのヒント

  • RSIとMACDしきい値を一緒に最適化します;MACDアクセラレーションフィルターを調整せずにRSIコリドーを緩めると、だましが生まれる可能性があります。
  • 部分出口はローソク足の極値に依存するため、高値/安値の正確なデータはリアルなバックテストに重要です。
  • 常にシグナルごとに4つの同時注文を処理するのに十分な資本で運用します。
using System;
using System.Collections.Generic;

using Ecng.Common;

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

namespace StockSharp.Samples.Strategies;

/// <summary>
/// Alexav D1 Profit GBPUSD strategy (simplified). Uses EMA crossover with RSI
/// filter for breakout entries with ATR-based stop/take management.
/// </summary>
public class AlexavD1ProfitGbpUsdStrategy : Strategy
{
	private readonly StrategyParam<DataType> _candleType;
	private readonly StrategyParam<int> _emaFastLength;
	private readonly StrategyParam<int> _emaSlowLength;
	private readonly StrategyParam<int> _rsiLength;
	private readonly StrategyParam<decimal> _rsiUpperLevel;
	private readonly StrategyParam<decimal> _rsiLowerLevel;

	public DataType CandleType
	{
		get => _candleType.Value;
		set => _candleType.Value = value;
	}

	public int EmaFastLength
	{
		get => _emaFastLength.Value;
		set => _emaFastLength.Value = value;
	}

	public int EmaSlowLength
	{
		get => _emaSlowLength.Value;
		set => _emaSlowLength.Value = value;
	}

	public int RsiLength
	{
		get => _rsiLength.Value;
		set => _rsiLength.Value = value;
	}

	public decimal RsiUpperLevel
	{
		get => _rsiUpperLevel.Value;
		set => _rsiUpperLevel.Value = value;
	}

	public decimal RsiLowerLevel
	{
		get => _rsiLowerLevel.Value;
		set => _rsiLowerLevel.Value = value;
	}

	public AlexavD1ProfitGbpUsdStrategy()
	{
		_candleType = Param(nameof(CandleType), TimeSpan.FromHours(4).TimeFrame())
			.SetDisplay("Candle Type", "Candles", "General");

		_emaFastLength = Param(nameof(EmaFastLength), 6)
			.SetGreaterThanZero()
			.SetDisplay("EMA Fast", "Fast EMA period", "Indicators");

		_emaSlowLength = Param(nameof(EmaSlowLength), 21)
			.SetGreaterThanZero()
			.SetDisplay("EMA Slow", "Slow EMA period", "Indicators");

		_rsiLength = Param(nameof(RsiLength), 10)
			.SetGreaterThanZero()
			.SetDisplay("RSI Length", "RSI period", "Indicators");

		_rsiUpperLevel = Param(nameof(RsiUpperLevel), 65m)
			.SetDisplay("RSI Upper", "Max RSI for buy", "Filters");

		_rsiLowerLevel = Param(nameof(RsiLowerLevel), 35m)
			.SetDisplay("RSI Lower", "Min RSI for sell", "Filters");
	}

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

		var emaFast = new ExponentialMovingAverage { Length = EmaFastLength };
		var emaSlow = new ExponentialMovingAverage { Length = EmaSlowLength };

		decimal prevFast = 0, prevSlow = 0;
		var hasPrev = false;

		var subscription = SubscribeCandles(CandleType);
		subscription
			.Bind(emaFast, emaSlow, (ICandleMessage candle, decimal fastVal, decimal slowVal) =>
			{
				if (candle.State != CandleStates.Finished)
					return;

				if (!hasPrev)
				{
					prevFast = fastVal;
					prevSlow = slowVal;
					hasPrev = true;
					return;
				}

				if (!IsFormedAndOnlineAndAllowTrading())
				{
					prevFast = fastVal;
					prevSlow = slowVal;
					return;
				}

				var close = candle.ClosePrice;

				// EMA fast crosses above slow - buy signal
				var bullishCross = prevFast <= prevSlow && fastVal > slowVal;
				// EMA fast crosses below slow - sell signal
				var bearishCross = prevFast >= prevSlow && fastVal < slowVal;

				if (bullishCross && Position <= 0)
					BuyMarket();
				else if (bearishCross && Position >= 0)
					SellMarket();

				prevFast = fastVal;
				prevSlow = slowVal;
			})
			.Start();

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