GitHub で見る

Exp SSL NRTR Tm Plus 戦略

概要

この戦略はStockSharpの高レベルインフラを使用してMetaTraderエキスパートアドバイザー「Exp_SSL_NRTR_Tm_Plus」を複製します。 単一の時間軸をサブスクライブし、設定可能な平滑化方法でSSL NRTRチャネルを計算し、インジケーターが提供する色の 転換に反応します。チャネルが強気になるとロングエントリーがトリガーされ、弱気転換時にはショートエントリーが発生します。 実装は元のリスク管理、オプションのトレードフィルター、タイマーベースのエグジットを保持します。

パラメーター

グループ パラメーター 説明
Trading Money Management 注文サイズに使用するポートフォリオの割合(または負の値/Lotモードの場合は直接ロット数)。
Trading Margin Mode Money Managementの値をポジションサイズに変換するモード。Lot以外のモードはポートフォリオベースの計算で近似されます。
Trading Allow Long/Short Entries 各方向でのポジションのオープンを有効または無効にします。
Trading Allow Long/Short Exits インジケーターの反転時に各方向でポジションをクローズすることを許可します。
Risk Stop Loss 価格ステップでの保護ストップ距離。戦略はネイティブストップ注文を発注する代わりにレベルを監視します。
Risk Take Profit 価格ステップでのテイクプロフィット距離。
Risk Slippage 元のEAから維持された情報パラメーター。
Risk Use Time Exit 設定した保有期間後に強制的にフラットポジションにするタイマーを有効にします。
Risk Exit Minutes タイムベースエグジットの保有期間(分)。
Data Candle Type 取引とインジケーター計算の両方に使用するワーキング時間軸。
Indicator Smoothing Method SSL NRTRチャネルで使用する移動平均タイプ。サポートされていないカスタムタイプはEMAにフォールバックします。
Indicator Length 平滑化アルゴリズムの基本期間。
Indicator Phase 適応的平均(T3、VIDYA、AMA)に使用する補助パラメーター。
Indicator Signal Bar SSLカラーを評価する際に振り返る閉じたバーの数。

トレードロジック

  1. 設定した時間軸をサブスクライブして完成したローソク足のみを処理します。
  2. SSL NRTRの移動平均を計算してチャネルカラーを導出します(上昇、下降、または中立)。
  3. カラーが強気(0)に変わるとき、オプションでショートポジションをクローズし、有効な場合はロングポジションをオープンします。
  4. カラーが弱気(2)に変わるとき、オプションでロングポジションをクローズし、有効な場合はショートポジションをオープンします。
  5. エントリー価格を使用してストップロス/テイクプロフィットのレベルを追跡し、いずれかのレベルに達したらポジションをクローズします。
  6. 保有時間がExit Minutesパラメーターを超えたらオプションでポジションをクローズします。
  7. 同一バー内の繰り返しエントリーを元のMT5の「タイムレベル」ロジックでスロットリングして防止します。

マネーマネジメント

  • Lotモードはマネーマネジメントの値をロット/コントラクトで表した直接ボリュームとして扱います。
  • FreeMarginBalanceは最後の終値で割ることで要求された資本割合を近似します。
  • LossFreeMarginLossBalanceは設定されたストップロス距離を使用して1トレードあたりの許容損失から取引可能なボリュームを推定します。
  • 負のマネーマネジメント値は常に絶対ロットサイズにマッピングされます。

ノート

  • StockSharpで利用可能な平滑化方法のみが直接実装されています。JurxParmaは指数移動平均にフォールバックし、この動作はコードコメントに記録されています。
  • 戦略はプラットフォームに依存しないようにネイティブ保護注文を送信するのではなく、戦略ループ内にストップロスとテイクプロフィットのロジックを保持します。
  • スリッページは完全性のために保持された情報設定です;注文はシンプルなマーケット注文として送信されます。
  • 実装はデフォルトでチャートエリアにローソク足と自己の取引を描画します。
using System;
using System.Collections.Generic;

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

namespace StockSharp.Samples.Strategies;

public class ExpSslNrtrTmPlusStrategy : Strategy
{
	private readonly StrategyParam<DataType> _candleType;
	private readonly StrategyParam<int> _fastPeriod;
	private readonly StrategyParam<int> _slowPeriod;
	private decimal? _prevFast, _prevSlow;

	public DataType CandleType { get => _candleType.Value; set => _candleType.Value = value; }
	public int FastPeriod { get => _fastPeriod.Value; set => _fastPeriod.Value = value; }
	public int SlowPeriod { get => _slowPeriod.Value; set => _slowPeriod.Value = value; }

	public ExpSslNrtrTmPlusStrategy()
	{
		_candleType = Param(nameof(CandleType), TimeSpan.FromHours(1).TimeFrame()).SetDisplay("Candle Type", "Timeframe", "General");
		_fastPeriod = Param(nameof(FastPeriod), 10).SetGreaterThanZero().SetDisplay("Fast EMA", "Fast period", "Indicators");
		_slowPeriod = Param(nameof(SlowPeriod), 30).SetGreaterThanZero().SetDisplay("Slow EMA", "Slow period", "Indicators");
	}

	public override IEnumerable<(Security sec, DataType dt)> GetWorkingSecurities() => [(Security, CandleType)];

	/// <inheritdoc />
	protected override void OnReseted()
	{
		base.OnReseted();
		_prevFast = null;
		_prevSlow = null;
	}

	protected override void OnStarted2(DateTime time)
	{
		base.OnStarted2(time);
		_prevFast = null; _prevSlow = null;
		var fast = new ExponentialMovingAverage { Length = FastPeriod };
		var slow = new ExponentialMovingAverage { Length = SlowPeriod };
		var subscription = SubscribeCandles(CandleType);
		subscription.Bind(fast, slow, ProcessCandle).Start();
		var area = CreateChartArea();
		if (area != null) { DrawCandles(area, subscription); DrawIndicator(area, fast); DrawIndicator(area, slow); DrawOwnTrades(area); }
	}

	private void ProcessCandle(ICandleMessage candle, decimal fast, decimal slow)
	{
		if (candle.State != CandleStates.Finished) return;
		if (!IsFormedAndOnlineAndAllowTrading()) { _prevFast = fast; _prevSlow = slow; return; }
		if (_prevFast == null || _prevSlow == null) { _prevFast = fast; _prevSlow = slow; return; }
		var prevAbove = _prevFast.Value > _prevSlow.Value;
		var currAbove = fast > slow;
		_prevFast = fast; _prevSlow = slow;
		if (!prevAbove && currAbove && Position <= 0) { if (Position < 0) BuyMarket(); BuyMarket(); }
		else if (prevAbove && !currAbove && Position >= 0) { if (Position > 0) SellMarket(); SellMarket(); }
	}
}