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オシレーターが過売り/過買い領域から抜け出すことで、価格が混雑ゾーンを離れていることを確認する必要があります。
- フラットブレイクアウトフィルター – ボラティリティ圧縮検出器が狭いレンジを探します(長さと幅は
FlatnessCoefficient、MinFlatBars、MaxFlatPointsで制御)。これらのゾーンからのブレイクアウトはシグナルに信頼性を追加します。
- ハンマーフィルター – 最近のハンマーまたは逆ハンマーロウソク足(ボディ/長い影のルールと局所的な高値/安値で検証)は、意図したトレードの方向に枯渇シグナルとして機能します。
- ダイバージェンス確認 – M5 Stochasticオシレーターと価格の間の強気/弱気ダイバージェンスを探し、ファンアラインメント後のリバーサルを予測します。
- ホーン確認 – M5 EMAファンが収束(「ホーン」)すると、上位タイムフレームが動きをサポートしている場合に最近のレンジ上/下のブレイクアウトが追加エントリーをトリガーします。
エントリー条件
ロングセットアップは1つまたは複数の条件によってトリガーされます(各条件が決定に重みを加えます):
- 3つのタイムフレーム全体でEMAファンが整列、M5 Stochasticの強気クロスオーバー、強い強気のロウソク足ボディ。
- 安値で開いて高速EMAより上で閉じるM5 EMAファンブレイクアウトロウソク足。
- 強気方向へのフラットレンジブレイクアウト。
- EMAファン距離が許可された閾値を下回りながらM5 + M15ブレイクアウト合意。
- ファンが上を向きながらStochasticと価格の間の強気ダイバージェンス。
- 許可されたルックバックウィンドウ内の最近の強気ハンマーロウソク足。
- 強気のロウソク足ボディを伴うM15 Stochasticの強気クロスオーバー。
- EMAファン収束後の最近のレンジ上のホーンブレイクアウト。
ショートセットアップはミラーロジックに従います。ロングとショートの条件が同時に存在する場合、戦略はそのバーの取引をスキップします。
出口とリスク管理
- ポイントで設定可能な固定ストップロスとテイクプロフィット。
- 価格が利益閾値に達したときにストップを締める任意のブレイクイーブンロジック(
StopLossAfterBreakeven、TakeProfitAfterBreakeven)。
- 最新の終値からの価格距離に基づくトレーリングストップ(
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);
}
}
}
import clr
clr.AddReference("StockSharp.Messages")
clr.AddReference("StockSharp.Algo")
clr.AddReference("StockSharp.Algo.Indicators")
clr.AddReference("StockSharp.Algo.Strategies")
from System import TimeSpan
from StockSharp.Messages import DataType, CandleStates
from StockSharp.Algo.Indicators import ExponentialMovingAverage, RelativeStrengthIndex
from StockSharp.Algo.Strategies import Strategy
class interceptor_strategy(Strategy):
def __init__(self):
super(interceptor_strategy, self).__init__()
self._candle_type = self.Param("CandleType", DataType.TimeFrame(TimeSpan.FromHours(4))) \
.SetDisplay("Candle Type", "Candles", "General")
self._ema_length = self.Param("EmaLength", 50) \
.SetDisplay("EMA Length", "Trend EMA", "Indicators")
self._rsi_length = self.Param("RsiLength", 14) \
.SetDisplay("RSI Length", "RSI period", "Indicators")
@property
def CandleType(self):
return self._candle_type.Value
@property
def EmaLength(self):
return self._ema_length.Value
@property
def RsiLength(self):
return self._rsi_length.Value
def OnStarted2(self, time):
super(interceptor_strategy, self).OnStarted2(time)
ema = ExponentialMovingAverage()
ema.Length = self.EmaLength
rsi = RelativeStrengthIndex()
rsi.Length = self.RsiLength
subscription = self.SubscribeCandles(self.CandleType)
subscription.Bind(ema, rsi, self._on_process).Start()
area = self.CreateChartArea()
if area is not None:
self.DrawCandles(area, subscription)
self.DrawIndicator(area, ema)
self.DrawOwnTrades(area)
def _on_process(self, candle, ema_value, rsi_value):
if candle.State != CandleStates.Finished:
return
close = float(candle.ClosePrice)
ev = float(ema_value)
rv = float(rsi_value)
if close > ev and rv > 60 and self.Position <= 0:
self.BuyMarket()
elif close < ev and rv < 40 and self.Position >= 0:
self.SellMarket()
def CreateClone(self):
return interceptor_strategy()