GitHub で見る

N7S AO 772012 戦略

概要

この戦略は、MetaTrader エキスパート アドバイザー N7S_AO_772012 の StockSharp の変換です。オリジナルのロボットは、複数のタイムフレームにわたるオーサム オシレーター (AO) のパーセプトロンのようなフィルターと、価格パターン ゲートおよび基本ロジックをオーバーライドできる構成可能な「ニューロ」モードを組み合わせています。変換されたバージョンでは、すべての調整ノブを戦略パラメーターとして公開しながら、決定木を保持します。

ボットは戦略で選択された主要な手段で動作し、以下を使用します。

  • M1 ローソク足 はエントリーのタイミングと価格のパーセプトロンです。
  • H1 キャンドル は、複数の AO ベースのパーセプトロンに供給します。
  • H4 キャンドルは、ベースの買い/売りセレクター (BTS) によって使用される AO モメンタム デルタを計算します。

取引ロジック

  1. 終了した M1 ローソクごとに、戦略は価格パターン履歴を更新し、既存のポジションを管理し、取引が許可されているかどうかを評価します (プラットフォーム現地時間で月曜日の 02:00 まで、または金曜日の 18:00 以降は取引禁止)。
  2. 時間ごとの AO 値は 5 つのパーセプトロンに集約されます。
    • Perceptron X/Y – 価格パーセプトロンおよび H4 AO デルタと連携して動作するベース BTS フィルター。
    • Neuro X/Y – ニューロ モードで優先順位が与えられる場合に使用される高度なロング/ショート フィルター。
    • Neuro Z – モード 4 で Neuro X を有効にするゲート パーセプトロン。
  3. 価格パーセプトロンは、最近の M1 始値と最新の終値の間の加重差を評価します。
  4. ニューロ モード パラメーターは、大文字のパーセプトロンがどのように介入するかを制御します。
    • 4: Neuro Z > 0 の場合、Neuro X のみが長い信号を生成できます。そうしないと、Neuro Y がショートを引き起こす可能性があります。どちらも起動しない場合は、BTS にフォールバックします。
    • 3: Neuro Y はショートを引き起こす可能性があります。それ以外の場合は BTS にフォールバックします。
    • 2: Neuro X はロングをトリガーできます。それ以外の場合は BTS にフォールバックします。
    • 他の値はニューロ層をスキップし、BTS を直接評価します。
  5. BTS ブロックは、価格パーセプトロンと H4 AO デルタをゲートとして使用します。
    • 長いセットアップ: 価格パーセプトロン > 0 (BtsMode = 0 を除く)、Neuro/BTS X > 0、および H4 AO デルタ > 0。ストップロスは BaseStopLossPointsLong、テイクプロフィットは BaseTakeProfitFactorLong × BaseStopLossPointsLong です。
    • 短いセットアップ: 価格パーセプトロン < 0 (BtsMode = 0 を除く)、Neuro/BTS Y > 0、H4 AO デルタ < 0。ストップロスは BaseStopLossPointsShort、テイクプロフィットは BaseTakeProfitFactorShort × BaseStopLossPointsShort です。
  6. シグナルが受け入れられた後、戦略は (有効な方向を考慮して) 成行注文を開きます。保護価格は内部で追跡されます。完成したすべての M1 ローソク足は、ローソク足の高値/安値を使用してストップまたはターゲットに到達したかどうかを確認し、適切な場合はポジションを閉じます。反対のシグナルは、まず既存のポジションを閉じ、次のローソク足を待ってから再エントリーします。

パラメーター

取引

  • OrderVolume – すべての成行注文の基本量。
  • AllowLongTrades /AllowShortTrades – ロングまたはショートのエントリーを有効または無効にします。
  • BtsMode0 に設定すると、BTS の価格パーセプトロン ゲートは無視されます。それ以外の場合は、その符号が取引と一致している必要があります。
  • NeuroMode – 高度なパーセプトロンがどのように参加するかを選択します (ロジックセクションを参照)。

基本 BTS パーセプトロン

  • BaseStopLossPointsLong / BaseTakeProfitFactorLong – ロングテイクプロフィットのストップ距離 (ポイント) と乗数。
  • BaseStopLossPointsShort / BaseTakeProfitFactorShort – ショートトレードの類似設定。
  • PerceptronPeriodX / Y – それぞれのパーセプトロンによって使用される AO シフト (H1 バー単位)。
  • PerceptronWeightX1..4 / Y1..4 – パーセプトロン入力の重み (0 ~ 100)。内部的には 50 を引いて中央に配置されます。
  • PerceptronThresholdX / Y – 有効とみなされる前に必要な最小絶対パーセプトロン出力。

価格フィルター

  • PricePatternPeriod – 価格パーセプトロンの各ラグを形成する M1 ローソク足の数。
  • PriceWeight1..4 – パーセプトロン内の価格差に適用される重み (50 付近を中心)。

ニューロパーセプトロン

  • NeuroStopLossPointsLong / NeuroTakeProfitFactorLong – Neuro X 信号によって使用されるストップおよび TP 乗数。
  • NeuroStopLossPointsShort / NeuroTakeProfitFactorShort – Neuro Y 信号によって使用されるストップおよび TP 乗数。
  • NeuroPeriodX / Y / Z – 3 つのニューロ パーセプトロンの AO シフト (H1 キャンドル)。
  • NeuroWeightX1..4 / NeuroWeightY1..4 / NeuroWeightZ1..4 – パーセプトロンの重み。
  • NeuroThresholdX / NeuroThresholdY / NeuroThresholdZ – 各ニューロ パーセプトロンの最小絶対値。

データ

  • CandleType – 主要取引のキャンドルに使用される時間枠 (デフォルトは 1 分)。

貿易管理

  • ストップロスとテイクプロフィットの距離は、商品価格ステップを使用してポイントから絶対価格に変換されます。距離をゼロに設定すると、対応する保護が無効になります。
  • 完成した M1 キャンドルの保護レベルは、キャンドルの高値/安値を保存価格と比較することによって監視されます。
  • この戦略はネッティング モードで機能します。ロング ポジションとショート ポジションの両方を同時に保持することはありません。逆のシグナルが最初に現在のポジションをクローズします。

変換時の注意点

  • 高レベルの StockSharp バインディング (SubscribeCandles().Bind(...)) は、直接インジケーター クエリを行わずに AO 値をストリーミングするために使用されます。
  • 履歴バッファーは、インジケーターの直接検索を回避しながら、元のシフトベースのインデックス付けをエミュレートするために固定サイズのリストとして保持されます。
  • 要求されたとおり、Python バージョンは提供されません。
  • テストは変更されませんでした。
using System;
using System.Collections.Generic;

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

namespace StockSharp.Samples.Strategies;

/// <summary>
/// Perceptron-based strategy using Awesome Oscillator values at different lookback periods.
/// Combines weighted AO signals with price pattern confirmation for entry/exit decisions.
/// </summary>
public class N7SAo772012Strategy : Strategy
{
	private readonly StrategyParam<DataType> _candleType;
	private readonly StrategyParam<int> _aoPeriod;
	private readonly StrategyParam<int> _lookback;

	private readonly List<decimal> _aoHistory = new();
	private decimal _entryPrice;

	public N7SAo772012Strategy()
	{
		_candleType = Param(nameof(CandleType), TimeSpan.FromHours(2).TimeFrame())
			.SetDisplay("Candle Type", "Timeframe for analysis.", "General");

		_aoPeriod = Param(nameof(AoPeriod), 5)
			.SetDisplay("AO Period", "Period for the Awesome Oscillator.", "Indicators");

		_lookback = Param(nameof(Lookback), 3)
			.SetDisplay("Lookback", "Number of AO values to look back for signal.", "Indicators");
	}

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

	public int AoPeriod
	{
		get => _aoPeriod.Value;
		set => _aoPeriod.Value = value;
	}

	public int Lookback
	{
		get => _lookback.Value;
		set => _lookback.Value = value;
	}

	/// <inheritdoc />
	protected override void OnReseted()
	{
		base.OnReseted();

		_aoHistory.Clear();
		_entryPrice = 0;
	}

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

		var ao = new AwesomeOscillator();

		var subscription = SubscribeCandles(CandleType);
		subscription
			.Bind(ao, ProcessCandle)
			.Start();

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

	private void ProcessCandle(ICandleMessage candle, decimal aoValue)
	{
		if (candle.State != CandleStates.Finished)
			return;

		_aoHistory.Add(aoValue);
		if (_aoHistory.Count > 50)
			_aoHistory.RemoveAt(0);

		if (_aoHistory.Count < Lookback + 1)
			return;

		var close = candle.ClosePrice;
		var current = _aoHistory[_aoHistory.Count - 1];
		var prev = _aoHistory[_aoHistory.Count - 1 - Lookback];

		// AO momentum: current vs lookback periods ago
		var rising = current > prev && current > 0;
		var falling = current < prev && current < 0;

		// Manage positions
		if (Position > 0)
		{
			// Exit long if AO turns negative or stop-loss
			if (current < 0 || (_entryPrice > 0 && close < _entryPrice * 0.98m))
			{
				SellMarket();
			}
		}
		else if (Position < 0)
		{
			// Exit short if AO turns positive or stop-loss
			if (current > 0 || (_entryPrice > 0 && close > _entryPrice * 1.02m))
			{
				BuyMarket();
			}
		}

		// Entry
		if (Position == 0)
		{
			if (rising)
			{
				_entryPrice = close;
				BuyMarket();
			}
			else if (falling)
			{
				_entryPrice = close;
				SellMarket();
			}
		}
	}
}