Die ValidateMe-Strategie portiert das grundlegende Validierungs-Framework des ursprünglichen MQL4-Expertenberaters. Die Logik konzentriert sich darauf, die Verfügbarkeit von Geldern zu prüfen, zu überprüfen, ob die Stop-Loss- und Take-Profit-Abstände den Wechselkursbeschränkungen entsprechen, und dann eine einzelne Marktorder in die gewählte Richtung auszulösen. Die Strategie überwacht kontinuierlich Handelsausführungsereignisse und eröffnet nur dann eine neue Position, wenn keine Positionen oder aktiven Aufträge vorhanden sind.
Handelslogik
Die Strategie abonniert Tickdaten des konfigurierten Wertpapiers.
Wenn die Strategie online ist, erstellt wurde und der Handel zulässig ist, wird überprüft, ob keine offenen Positionen und keine aktiven Aufträge vorhanden sind.
Anschließend wird eine Marktorder in der konfigurierten Richtung (Kauf oder Verkauf) unter Verwendung der definierten Losgröße gesendet.
Ein Schutzmodul fügt sofort Take-Profit- und Stop-Loss-Orders hinzu, die aus Pip-Abständen berechnet werden, und stellt so die Einhaltung der Stop-Levels des Brokers sicher (angepasst an Bruchpreise).
Sobald die Position geschlossen ist, wartet die Strategie auf den nächsten Tick und wiederholt die Validierung, bevor sie eine neue Order sendet.
Parameter
Parameter
Beschreibung
Gewinnmitnahme (Pips)
Abstand vom Einstiegspreis zum Take-Profit in Pips. Muss größer als Null sein.
Stop-Loss (Pips)
Abstand vom Einstiegspreis zum Stop-Loss in Pips. Muss größer als Null sein.
Viele
Handelsvolumen in Lots, das für jede Marktorder verwendet wird.
Richtung
Richtung der Marktorder (Kauf oder Verkauf).
Risikomanagement
Die Strategie verwendet StartProtection mit absoluten Offsets, um sowohl Take-Profit- als auch Stop-Loss-Orders zu registrieren.
Die Pip-Größe wird aus dem Wertpapierpreisschritt und der Dezimalgenauigkeit berechnet, um das MetaTrader-Verhalten nachzuahmen (5- und 3-stellige Symbole verwenden eine zehnfache Punktgröße).
Die Strategie löst neue Aufträge nur dann aus, wenn keine bestehenden Aufträge aktiv sind, wodurch eine Stapelung von Aufträgen vermieden wird.
Nutzungshinweise
Befestigen Sie die Strategie an einem Wertpapier und stellen Sie das gewünschte Volumen und die gewünschte Richtung ein.
Konfigurieren Sie die Take-Profit- und Stop-Loss-Abstände in Pips entsprechend den Anforderungen des Brokers.
Die Strategie basiert nicht auf Indikatoren und ist als Validierungsrahmen und nicht als vollständiges Handelssystem gedacht.
Die Portfolio-Risikokontrolle (z. B. Max Drawdown) kann bei Bedarf extern kombiniert werden.
namespace StockSharp.Samples.Strategies;
using System;
using Ecng.Common;
using StockSharp.Algo.Indicators;
using StockSharp.Algo.Strategies;
using StockSharp.Messages;
/// <summary>
/// ValidateMe strategy: RSI crossover at oversold/overbought levels.
/// Buys when RSI crosses above 30, sells when RSI crosses below 70.
/// </summary>
public class ValidateMeStrategy : Strategy
{
private readonly StrategyParam<DataType> _candleType;
private readonly StrategyParam<int> _period;
private decimal _prevRsi;
private bool _hasPrev;
public DataType CandleType { get => _candleType.Value; set => _candleType.Value = value; }
public int Period { get => _period.Value; set => _period.Value = value; }
public ValidateMeStrategy()
{
_candleType = Param(nameof(CandleType), TimeSpan.FromMinutes(5).TimeFrame())
.SetDisplay("Candle Type", "Candle timeframe", "General");
_period = Param(nameof(Period), 14)
.SetGreaterThanZero()
.SetDisplay("Period", "RSI period", "Indicators");
}
/// <inheritdoc />
protected override void OnReseted()
{
base.OnReseted();
_prevRsi = 0;
_hasPrev = false;
}
/// <inheritdoc />
protected override void OnStarted2(DateTime time)
{
base.OnStarted2(time);
_hasPrev = false;
var rsi = new RelativeStrengthIndex { Length = Period };
var subscription = SubscribeCandles(CandleType);
subscription.Bind(rsi, ProcessCandle).Start();
}
private void ProcessCandle(ICandleMessage candle, decimal rsiValue)
{
if (candle.State != CandleStates.Finished) return;
if (_hasPrev)
{
if (_prevRsi < 30 && rsiValue >= 30 && Position <= 0)
BuyMarket();
else if (_prevRsi > 70 && rsiValue <= 70 && Position >= 0)
SellMarket();
}
_prevRsi = rsiValue;
_hasPrev = true;
}
}
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 RelativeStrengthIndex
from StockSharp.Algo.Strategies import Strategy
class validate_me_strategy(Strategy):
def __init__(self):
super(validate_me_strategy, self).__init__()
self._candle_type = self.Param("CandleType", DataType.TimeFrame(TimeSpan.FromMinutes(5)))
self._period = self.Param("Period", 14)
self._prev_rsi = 0.0
self._has_prev = False
@property
def CandleType(self):
return self._candle_type.Value
@CandleType.setter
def CandleType(self, value):
self._candle_type.Value = value
@property
def Period(self):
return self._period.Value
@Period.setter
def Period(self, value):
self._period.Value = value
def OnReseted(self):
super(validate_me_strategy, self).OnReseted()
self._prev_rsi = 0.0
self._has_prev = False
def OnStarted2(self, time):
super(validate_me_strategy, self).OnStarted2(time)
self._has_prev = False
rsi = RelativeStrengthIndex()
rsi.Length = self.Period
subscription = self.SubscribeCandles(self.CandleType)
subscription.Bind(rsi, self._process_candle).Start()
def _process_candle(self, candle, rsi_value):
if candle.State != CandleStates.Finished:
return
rsi_val = float(rsi_value)
if self._has_prev:
if self._prev_rsi < 30 and rsi_val >= 30 and self.Position <= 0:
self.BuyMarket()
elif self._prev_rsi > 70 and rsi_val <= 70 and self.Position >= 0:
self.SellMarket()
self._prev_rsi = rsi_val
self._has_prev = True
def CreateClone(self):
return validate_me_strategy()