GitHub で見る

Neuro Nirvaman戦略

概要

Neuro Nirvaman戦略はMetaTrader 5エキスパートアドバイザー NeuroNirvamanEA の直接変換版です。4つのLaguerre平滑化された正の方向性インジケーター(+DI)と2つのSilverTrendスイングディテクターを組み合わせることで、オリジナルのMQL実装からパーセプトロンベースの決定木を再現します。戦略は完了したローソク足で動作し、ポイントで定義された動的なテイクプロフィットとストップロスレベルで成行注文を送信します。トレーリングストップ、アベレージング、またはピラミッディングは適用されません — いつでも存在できるポジションは1つだけです。

市場入力とインジケーター

  • AverageDirectionalIndex(4インスタンス) — 各インスタンスは独自の期間で設定されています。戦略は+DIコンポーネントを読み取り、[0, 1]の範囲の滑らかなオシレーター値を得るためにLaguerreフィルターを通過させます。
  • LaguerrePlusDiState — カスタムインジケーターlaguerre_plusdi.mq5のロジックを再現する内部ヘルパーで、4段階のLaguerre平滑化とCU / (CU + CD)正規化を含みます。
  • SilverTrendState(2インスタンス)silvertrend_signal.mq5ロジックの忠実なポートです。ブレイクアウトポイントを検出するために最後の10本のローソク足(SSP = 9)を評価し、弱気の矢印で1、強気の矢印で-1、矢印がない場合に0を出力します。
  • ローソク足ストリーム — 戦略はCandleTypeで選択された単一の時間軸を購読し、完了したローソク足のみを処理します。

トレーディングロジック

  1. シグナルの準備
    • 各Laguerre値はComputeTensionSignalヘルパーを介して離散的な活性化に変換されます:0.5 + distance/100を超える値は-1を生成し、0.5 - distance/100を下回る値は1を生成し、ニュートラルゾーンは0を生成します。
    • SilverTrendスイングはすべてのローソク足で更新されます。リスクパラメーター(Risk1Risk2)はMLQインジケーターとまったく同じようにサポート/レジスタンスチャネルを縮小または拡大します。
  2. パーセプトロン
    • パーセプトロン1は最初のLaguerre活性化を最初のSilverTrendスイングとX11 - 100X12 - 100の重みを使用して混合します。
    • パーセプトロン2は2番目のLaguerre活性化を2番目のSilverTrendスイングとX21 - 100X22 - 100の重みを使用して混合します。
    • パーセプトロン3は3番目と4番目のLaguerre活性化にX31 - 100X32 - 100の重みで作用します。
  3. スーパーバイザー(Passパラメーター)
    • Pass = 3パーセプトロン3 > 0を必要とします。パーセプトロン2 > 0の場合も、戦略はTakeProfit2 / StopLoss2を使用して買います。そうでなければ、パーセプトロン1 < 0の場合、TakeProfit1 / StopLoss1を使用して売ります。
    • Pass = 2パーセプトロン2 > 0の場合、2番目のリスク制限セットでロングポジションが開かれます。パーセプトロン2 <= 0の場合、最初のリミットセットでショートが開かれます。
    • Pass = 1パーセプトロン1 < 0の場合、戦略は最初のリスクセットを使用して売ります。そうでなければ、同じリスク設定を使用してロングに行きます。
  4. 注文管理
    • エントリーはBuyMarketまたはSellMarketで実行され、TradeVolumeパラメーターをロットサイズとして使用します。
    • テイクプロフィットとストップロスレベルはシグナルローソク足の終値から計算されます:entry ± points * PriceStep。それらはオリジナルのMT5保護注文をエミュレートして、高値/安値チェックを通じてすべての完了したローソク足で監視されます。
    • 新しいシグナルはポジションがアクティブな間は無視されます;ポジションが閉じられて初めて新しいトレードが評価されます。

パラメーター

名前 タイプ デフォルト 説明
CandleType DataType 15分時間軸 計算に使用するローソク足タイプ。
TradeVolume decimal 0.1 ロット単位のポジションボリューム。
Risk1, Risk2 int 3 / 9 チャネル幅を定義するSilverTrendリスクファクター。
Laguerre1PeriodLaguerre4Period int 14 各Laguerre平滑化ストリームのADX長。
Laguerre1DistanceLaguerre4Distance decimal 0 ニュートラルゾーンを定義する0.5しきい値周辺のパーセンテージ(0–100)での距離。
X11, X12, X21, X22, X31, X32 decimal 100 重み係数;MQLコードは適用前に100を引きます。
TakeProfit1, StopLoss1, TakeProfit2, StopLoss2 int 100 / 50 ポイントで表された保護距離。
Pass int 3 トレーディングに使用するパーセプトロンの組み合わせを選択するスーパーバイザーモード。

使用上のノート

  • デフォルトの重み(100)はパーセプトロンを中立化します。戦略を有効にするには、パーセプトロンが非ゼロの出力を生成できるよう重みを100から調整してください。
  • SilverTrendの実装はオリジナルのアラートカウントロジック(アラートなし)を尊重し、ローソク足間で状態を維持するため、シグナルはMT5バージョンと一致します。
  • テイクプロフィットとストップロスレベルは内部的にシミュレートされるため、完了した各ローソク足の高値/安値はターゲットヒットを確認するために使用されます。ティック間のインタバースパイクはモデル化されません。
  • 戦略は単一シンボルであり、複数のインストゥルメントを管理しません。目的の証券に付加し、それに応じてローソク足シリーズを設定してください。
  • ロングまたはショートポジションは一度に1つのみ許可されます;ポジションを逆転させると最初に完全なエグジットが強制されます。

展開

  1. ソリューションをビルドし、StockSharpサンプルランチャーから戦略を実行するか、カスタムプロジェクトに含めます。
  2. 証券を選択し、ローソク足シリーズを割り当て、パーセプトロンの重みとリスクパラメーターを設定します。
  3. 戦略を開始し、自動的に作成されたチャートを使用してトレードを監視します(Laguerreインジケーターと自身のディールがエリアに追加されます)。
  4. 必要に応じて、組み込みパラメーターメタデータ(SetCanOptimize)を通じて最適化を実行できます。
namespace StockSharp.Samples.Strategies;

using System;

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

/// <summary>
/// Neuro Nirvaman strategy (simplified).
/// Uses RSI with EMA trend filter.
/// Buys when RSI oversold and price above EMA, sells when RSI overbought and price below EMA.
/// </summary>
public class NeuroNirvamanStrategy : Strategy
{
	private readonly StrategyParam<DataType> _candleType;
	private readonly StrategyParam<int> _rsiPeriod;
	private readonly StrategyParam<int> _emaPeriod;
	private readonly StrategyParam<decimal> _rsiOversold;
	private readonly StrategyParam<decimal> _rsiOverbought;

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

	public int RsiPeriod
	{
		get => _rsiPeriod.Value;
		set => _rsiPeriod.Value = value;
	}

	public int EmaPeriod
	{
		get => _emaPeriod.Value;
		set => _emaPeriod.Value = value;
	}

	public decimal RsiOversold
	{
		get => _rsiOversold.Value;
		set => _rsiOversold.Value = value;
	}

	public decimal RsiOverbought
	{
		get => _rsiOverbought.Value;
		set => _rsiOverbought.Value = value;
	}

	public NeuroNirvamanStrategy()
	{
		_candleType = Param(nameof(CandleType), TimeSpan.FromHours(1).TimeFrame())
			.SetDisplay("Candle Type", "Source candles", "General");

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

		_emaPeriod = Param(nameof(EmaPeriod), 20)
			.SetGreaterThanZero()
			.SetDisplay("EMA Period", "EMA trend filter period", "Indicators");

		_rsiOversold = Param(nameof(RsiOversold), 45m)
			.SetDisplay("RSI Oversold", "RSI oversold level", "Signals");

		_rsiOverbought = Param(nameof(RsiOverbought), 55m)
			.SetDisplay("RSI Overbought", "RSI overbought level", "Signals");

		Volume = 0.1m;
	}

	/// <inheritdoc />
	protected override void OnStarted2(DateTime time)
	{
		base.OnStarted2(time);

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

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

				if (!IsFormedAndOnlineAndAllowTrading())
					return;

				if (rsiValue < RsiOversold && Position <= 0)
				{
					BuyMarket();
				}
				else if (rsiValue > RsiOverbought && Position >= 0)
				{
					SellMarket();
				}
			})
			.Start();

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