Die Strategie repliziert den MetaTrader 4 Expert Advisor ArtificialIntelligence_Right.mq4. Es wertet eine Einzelschicht aus
Perzeptron basiert auf dem Beschleunigungs-/Verzögerungsoszillator (AC), um zu entscheiden, wann die Marktdynamik die Richtung ändert. Die
Perceptron verwendet vier verzögerte Wechselstromproben und wandelt diese in ein vorzeichenbehaftetes Signal um, das sowohl Ein- als auch Umkehrungen steuert.
Im Gegensatz zum ursprünglichen EA funktioniert der Port StockSharp mit der High-Level-Kerze API. Preisaktionen werden jeweils am Ende durchgeführt
fertige Kerze, wodurch die Logik für Backtests und Optimierungsworkflows deterministisch bleibt.
Indikatoren und Berechnungen
Der Beschleunigungs-/Verzögerungsoszillator wird aus dem Awesome Oscillator neu aufgebaut, indem ein 5-Perioden-SMA vom AO subtrahiert wird
Werte (5-Perioden SMA von HL2 minus 34-Perioden SMA von HL2).
Ein Ringpuffer speichert die 22 aktuellsten AC-Werte, sodass das Perzeptron auf die Offsets 0, 7, 14 und 21 zugreifen kann, die genau übereinstimmen
die MetaTrader-Implementierung.
Die Perzeptrongewichte werden um -100 vor dem Skalarprodukt verschoben, wodurch die w = x - 100-Logik des Quellcodes reproduziert wird.
Handelsregeln
Eintrittsbedingungen
Wenn der Perzeptron-Output positiv ist und die Strategie flach ist, wird eine Marktkauforder übermittelt.
Wenn der Perzeptron-Output negativ ist und die Strategie flach ist, wird ein Marktverkaufsauftrag erteilt.
Stop-Loss-Management
Nach jedem Eintritt wird in einer Entfernung von StopLossPoints * PriceStep ein virtueller Schutzstopp zugewiesen
Eintrittspreis. Dies emuliert den Point-Multiplikator von MetaTrader.
Wenn der Schlusskurs dieses Niveau überschreitet, wird die Position zum Marktwert aufgelöst, um die Ausführung der Stop-Loss-Order nachzuahmen.
Trailing und Umkehr
Sobald die Position um (2 * StopLossPoints + SpreadPoints) Punkte im Gewinn schwankt, startet entweder der ursprüngliche Roboter
Der Stop wird um die Stop-Loss-Distanz nachgezogen oder umgekehrt, wenn das Perzeptron sein Vorzeichen ändert.
Die StockSharp-Version verwendet denselben Auslöser: Wenn die Gewinnschwelle erreicht ist und das Perzeptron die Richtung umgekehrt hat,
Es wird eine Marktorder mit dem Doppelten des aktuellen Risikos erteilt, um den Handel rückgängig zu machen. andernfalls wird der virtuelle Stopp angefahren
Behalten Sie den ursprünglichen Abstand vom aktuellen Schlusskurs bei.
Alle Umkehrungen werden durch den Handel mit dem doppelten offenen Volumen durchgeführt, sodass die resultierende Position die MetaTrader OrderCloseBy widerspiegelt.
Verhalten, was zu einer entgegengesetzten Richtung, aber derselben Losgröße führt.
Parameter
Name
Beschreibung
X1 … X4
Perzeptrongewichte. Die Standardwerte replizieren die .mq4-Quelle (135, 127, 16, 93).
StopLoss
Stop-Loss-Distanz, ausgedrückt in MetaTrader Punkten. Es wird mit dem Instrument PriceStep multipliziert, um einen echten Preisversatz zu erhalten.
Spread
Zusätzlicher Spread-Puffer (Standard 3 Punkte), der in der Trailing-Trigger-Bedingung verwendet wird.
Candle Type
Für Berechnungen verwendete Kerzenreihe. Standardmäßig ist der Zeitrahmen 1 Minute.
Die Eigenschaft Volume ist voreingestellt auf 1 Los und spiegelt den Eingabeparameter lots des ursprünglichen Experten wider.
Implementierungshinweise
Indikatorberechnungen und der Perzeptronstatus werden jedes Mal zurückgesetzt, wenn die Strategie zurückgesetzt wird, um zu verhindern, dass veraltete Werte verursacht werden
falsche Auslöser.
Wenn das Wertpapier keinen PriceStep bereitstellt, greift die Strategie auf einen Punktwert von 1 zurück, um die Kompatibilität aufrechtzuerhalten
mit generischen Backtesting-Instrumenten.
Es werden keine echten Stop-Orders registriert; Stattdessen wird die Stopplogik über Marktaufträge im Candle-Handler ausgeführt. Dadurch bleibt die
konsistentes Verhalten bei allen Brokern und Simulatoren.
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>
/// Artificial Intelligence Right strategy - perceptron-like logic.
/// Uses fast/slow SMA difference (Awesome Oscillator approximation).
/// Buys when AO crosses above 0, sells when below.
/// </summary>
public class ArtificialIntelligenceRightStrategy : Strategy
{
private readonly StrategyParam<int> _fastPeriod;
private readonly StrategyParam<int> _slowPeriod;
private readonly StrategyParam<DataType> _candleType;
private decimal _prevDiff;
private bool _hasPrev;
public int FastPeriod { get => _fastPeriod.Value; set => _fastPeriod.Value = value; }
public int SlowPeriod { get => _slowPeriod.Value; set => _slowPeriod.Value = value; }
public DataType CandleType { get => _candleType.Value; set => _candleType.Value = value; }
public ArtificialIntelligenceRightStrategy()
{
_fastPeriod = Param(nameof(FastPeriod), 5)
.SetDisplay("Fast SMA", "Fast SMA period", "Indicators");
_slowPeriod = Param(nameof(SlowPeriod), 34)
.SetDisplay("Slow SMA", "Slow SMA period", "Indicators");
_candleType = Param(nameof(CandleType), TimeSpan.FromHours(4).TimeFrame())
.SetDisplay("Candle Type", "Candle timeframe", "General");
}
/// <inheritdoc />
public override IEnumerable<(Security sec, DataType dt)> GetWorkingSecurities()
{
return [(Security, CandleType)];
}
/// <inheritdoc />
protected override void OnReseted()
{
base.OnReseted();
_prevDiff = 0m;
_hasPrev = false;
}
protected override void OnStarted2(DateTime time)
{
base.OnStarted2(time);
_hasPrev = false;
var fast = new SimpleMovingAverage { Length = FastPeriod };
var slow = new SimpleMovingAverage { Length = SlowPeriod };
var subscription = SubscribeCandles(CandleType);
subscription
.Bind(fast, slow, ProcessCandle)
.Start();
}
private void ProcessCandle(ICandleMessage candle, decimal fast, decimal slow)
{
if (candle.State != CandleStates.Finished)
return;
var diff = fast - slow;
if (!_hasPrev)
{
_prevDiff = diff;
_hasPrev = true;
return;
}
// AO crosses above 0
if (_prevDiff <= 0 && diff > 0 && Position <= 0)
{
if (Position < 0)
BuyMarket();
BuyMarket();
}
// AO crosses below 0
else if (_prevDiff >= 0 && diff < 0 && Position >= 0)
{
if (Position > 0)
SellMarket();
SellMarket();
}
_prevDiff = diff;
}
}