GitHub で見る

Interceptor戦略 (StockSharpポート)

概要

Interceptor戦略はMetaTrader5エキスパートアドバイザーのC#ポートです。マルチタイムフレームEMA「ファン」アラインメントとStochasticオシレーター、フラットレンジのブレイクアウト検出、ダイバージェンス分析、ハンマーロウソク足フィルター、ホーン(ファン収束)確認を組み合わせます。目標はGBP/USD 5分チャートの統合期間後の強いトレンド継続を活用することです。

コアロジック

  • トレンド構造 – M5、M15、H1のタイムフレームで指数移動平均(長さ34/55/89/144/233)を評価します。有効なトレンドはすべてのEMAファンが整列(強気は上昇、弱気は下降)しており、最も遅いEMAと最も速いEMAの最大距離が設定可能な閾値を下回っていることを要求します。
  • モメンタム確認 – M5とM15のStochasticオシレーターが過売り/過買い領域から抜け出すことで、価格が混雑ゾーンを離れていることを確認する必要があります。
  • フラットブレイクアウトフィルター – ボラティリティ圧縮検出器が狭いレンジを探します(長さと幅はFlatnessCoefficientMinFlatBarsMaxFlatPointsで制御)。これらのゾーンからのブレイクアウトはシグナルに信頼性を追加します。
  • ハンマーフィルター – 最近のハンマーまたは逆ハンマーロウソク足(ボディ/長い影のルールと局所的な高値/安値で検証)は、意図したトレードの方向に枯渇シグナルとして機能します。
  • ダイバージェンス確認 – M5 Stochasticオシレーターと価格の間の強気/弱気ダイバージェンスを探し、ファンアラインメント後のリバーサルを予測します。
  • ホーン確認 – M5 EMAファンが収束(「ホーン」)すると、上位タイムフレームが動きをサポートしている場合に最近のレンジ上/下のブレイクアウトが追加エントリーをトリガーします。

エントリー条件

ロングセットアップは1つまたは複数の条件によってトリガーされます(各条件が決定に重みを加えます):

  1. 3つのタイムフレーム全体でEMAファンが整列、M5 Stochasticの強気クロスオーバー、強い強気のロウソク足ボディ。
  2. 安値で開いて高速EMAより上で閉じるM5 EMAファンブレイクアウトロウソク足。
  3. 強気方向へのフラットレンジブレイクアウト。
  4. EMAファン距離が許可された閾値を下回りながらM5 + M15ブレイクアウト合意。
  5. ファンが上を向きながらStochasticと価格の間の強気ダイバージェンス。
  6. 許可されたルックバックウィンドウ内の最近の強気ハンマーロウソク足。
  7. 強気のロウソク足ボディを伴うM15 Stochasticの強気クロスオーバー。
  8. EMAファン収束後の最近のレンジ上のホーンブレイクアウト。

ショートセットアップはミラーロジックに従います。ロングとショートの条件が同時に存在する場合、戦略はそのバーの取引をスキップします。

出口とリスク管理

  • ポイントで設定可能な固定ストップロスとテイクプロフィット。
  • 価格が利益閾値に達したときにストップを締める任意のブレイクイーブンロジック(StopLossAfterBreakevenTakeProfitAfterBreakeven)。
  • 最新の終値からの価格距離に基づくトレーリングストップ(TrailingStepPoints付きTrailingDistancePoints)。
  • 新しいポジションが開かれると、戦略はまず既存の反対ポジションを決済します。

パラメーター

パラメーター 説明
Volume 各エントリーに使用する注文ボリューム。
FlatnessCoefficient 検出されたフラットレンジの最大許容幅を制御する乗数。
StopLossPoints 価格ポイントでの初期ストップロス距離。
TakeProfitPoints 価格ポイントでの初期テイクプロフィット距離(0は無効)。
TakeProfitAfterBreakeven ブレイクイーブンロジックが有効になる前に必要な利益(ポイント)。
StopLossAfterBreakeven 有効化後のブレイクイーブンストップの距離。
MaxFanDistanceM5/M15/H1 各タイムフレームで許可される最大EMA分散。
StochasticKPeriodM5/M15 M5とM15のStochasticオシレーターの%K長。
StochasticUpperM5/M15 過買い閾値。
StochasticLowerM5/M15 過売り閾値。
MinBodyPoints 強いバーとして適格なロウソク足ボディの最小サイズ。
MinFlatBars フラットレンジを定義するために必要な最小バー数。
MaxFlatPoints フラットレンジの最大幅(ポイント)。
MinDivergenceBars ダイバージェンスピボット間の最小分離。
HammerLongShadowPercent ハンマー検出のための最小長い影の割合。
HammerShortShadowPercent ハンマー検出のための最大反対側の影の割合。
HammerMinSizePoints ハンマーロウソク足の最小合計レンジ。
HammerLookbackBars ハンマーパターンを検索するルックバックウィンドウ。
HammerRangeBars ハンマーの高値/安値を検証するために使用するバー数。
MaxFanWidthAtNarrowest ファンが収束したと見なされる最大EMA分散。
FanConvergedBars ホーンシグナルのためにファンが収束した状態を維持できるバー数。
RangeBreakLookback レンジブレイクアウト検出のルックバックウィンドウ。
TrailingStepPoints トレーリングストップ調整の最小増分。
TrailingDistancePoints 価格とトレーリングストップの間の距離。
CandleType プライマリロウソク足シリーズ(デフォルトM5タイムロウソク足)。

使用上の注意

  • 元のエキスパートアドバイザーはGBP/USD M5チャート向けに設計されました。他の銘柄やタイムフレームではパラメーターの調整が必要な場合があります。
  • 戦略はStockSharpの高レベルAPIとM5、M15、H1インターバルのロウソク足データを必要とします。
  • 1つのネットポジションのみ維持されます;反対のポジションは新しいトレードが開かれる前に決済されます。

免責事項

この戦略は教育目的で提供されています。過去のパフォーマンスは将来の結果を保証しません。実際の資金で取引する前に、安全なテスト環境でパラメーターとロジックを常に検証してください。

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>
/// Interceptor strategy (simplified). Uses RSI + EMA trend filter.
/// </summary>
public class InterceptorStrategy : Strategy
{
	private readonly StrategyParam<DataType> _candleType;
	private readonly StrategyParam<int> _emaLength;
	private readonly StrategyParam<int> _rsiLength;

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

	public int EmaLength
	{
		get => _emaLength.Value;
		set => _emaLength.Value = value;
	}

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

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

		_emaLength = Param(nameof(EmaLength), 50)
			.SetGreaterThanZero()
			.SetDisplay("EMA Length", "Trend EMA", "Indicators");

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

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

		var ema = new ExponentialMovingAverage { Length = EmaLength };
		var rsi = new RelativeStrengthIndex { Length = RsiLength };

		var subscription = SubscribeCandles(CandleType);
		subscription
			.Bind(ema, rsi, (ICandleMessage candle, decimal emaValue, decimal rsiValue) =>
			{
				if (candle.State != CandleStates.Finished)
					return;

				if (!IsFormedAndOnlineAndAllowTrading())
					return;

				var close = candle.ClosePrice;

				if (close > emaValue && rsiValue > 60m && Position <= 0)
					BuyMarket();
				else if (close < emaValue && rsiValue < 40m && Position >= 0)
					SellMarket();
			})
			.Start();

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