Die Strategie Scalping Assistant ist eine direkte Umsetzung des MetaTrader 4 Expertenberaters „Scalper Assistant v1.0“. Es generiert keine eigenen Einträge. Stattdessen überwacht es offene Positionen auf dem konfigurierten Wertpapier und verwaltet Schutzaufträge auf MetaTrader-ähnliche Weise.
Wie es funktioniert
Wenn eine neue Position erkannt wird, registriert die Strategie sofort Stop-Loss- und Take-Profit-Orders unter Verwendung der konfigurierten Distanzen (ausgedrückt in Preisschritten).
Die Strategie nutzt Level-1-Daten und verfolgt kontinuierlich den besten Geld-/Briefkurs, um den aktuellen Gewinn der Position abzuschätzen.
Sobald der nicht realisierte Gewinn BreakEvenTriggerPoints erreicht, wird der anfängliche Stopp aufgehoben und zum Break-Even-Preis zuzüglich des konfigurierten Offsets neu registriert.
Das Stop-Level bleibt beim Break-Even; Es wird kein weiteres Nachziehen durchgeführt. Die Take-Profit-Order bleibt davon unberührt.
Sobald die Position geschlossen ist, werden alle Schutzaufträge gelöscht und der interne Status zurückgesetzt, bereit für den nächsten manuellen Handel.
Nutzungshinweise
Hängen Sie die Strategie an einen Connector/Portfolio an und eröffnen Sie Trades manuell oder über einen anderen Algorithmus. Der Assistent übernimmt die Vertretung dieser Positionen.
Die Logik basiert auf Anführungszeichen der Ebene 1; Stellen Sie sicher, dass der ausgewählte Connector die besten Bid/Ask-Updates bietet.
Der Begriff Punkte bezieht sich auf die Preisstufe des Instruments (Security.PriceStep). Bei Forex-Symbolen mit fünf Dezimalstellen entspricht dies einem Pip.
Parameter
Name
Typ
Standard
Beschreibung
StopLossPoints
decimal
30
Abstand (in Preisschritten), der beim Platzieren des ersten Schutzstopps verwendet wird. Auf 0 setzen, um das Senden einer Stop-Order zu überspringen.
TakeProfitPoints
decimal
100
Distanz (in Preisschritten), die bei der Platzierung der ersten Take-Profit-Order verwendet wird. Auf 0 setzen, um den Take-Profit zu überspringen.
BreakEvenTriggerPoints
decimal
15
Profitieren Sie von Preisschritten, die erreicht werden müssen, bevor der Stop auf die Gewinnschwelle verschoben wird.
BreakEvenOffsetPoints
decimal
5
Zusätzlicher Abstand (in Preisschritten), der über/unter dem Einstiegspreis hinzugefügt wird, wenn der Stop auf die Gewinnschwelle verschoben wird.
Konvertierungsstatus
✅ Kernlogik: Break-Even-Stop-Verarbeitung basierend auf MetaTrader-Eingabeparametern.
✅ API-Nutzung auf hoher Ebene: SubscribeLevel1() mit Delegatenbindung.
✅ Schutzbefehle: erstellt über die Helfer SellStop, BuyStop, SellLimit und BuyLimit.
❌ Kein Python-Port – es wird nur die C#-Strategie entsprechend der Anfrage bereitgestellt.
namespace StockSharp.Samples.Strategies;
using System;
using Ecng.Common;
using StockSharp.Algo.Indicators;
using StockSharp.Algo.Strategies;
using StockSharp.Messages;
/// <summary>
/// Scalping Assistant strategy: RSI + EMA filter.
/// Buys when RSI crosses above 30 with price above EMA, sells when RSI crosses below 70 with price below EMA.
/// </summary>
public class ScalpingAssistantStrategy : Strategy
{
private readonly StrategyParam<DataType> _candleType;
private readonly StrategyParam<int> _rsiPeriod;
private readonly StrategyParam<int> _emaPeriod;
private decimal _prevRsi;
private bool _hasPrev;
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 ScalpingAssistantStrategy()
{
_candleType = Param(nameof(CandleType), TimeSpan.FromMinutes(5).TimeFrame())
.SetDisplay("Candle Type", "Candle timeframe", "General");
_rsiPeriod = Param(nameof(RsiPeriod), 14)
.SetGreaterThanZero()
.SetDisplay("RSI Period", "RSI period", "Indicators");
_emaPeriod = Param(nameof(EmaPeriod), 20)
.SetGreaterThanZero()
.SetDisplay("EMA Period", "EMA trend filter 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 = RsiPeriod };
var ema = new ExponentialMovingAverage { Length = EmaPeriod };
var subscription = SubscribeCandles(CandleType);
subscription.Bind(rsi, ema, ProcessCandle).Start();
}
private void ProcessCandle(ICandleMessage candle, decimal rsiValue, decimal emaValue)
{
if (candle.State != CandleStates.Finished) return;
if (_hasPrev)
{
if (_prevRsi < 30 && rsiValue >= 30 && candle.ClosePrice > emaValue && Position <= 0)
BuyMarket();
else if (_prevRsi > 70 && rsiValue <= 70 && candle.ClosePrice < emaValue && 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, ExponentialMovingAverage
from StockSharp.Algo.Strategies import Strategy
class scalping_assistant_strategy(Strategy):
def __init__(self):
super(scalping_assistant_strategy, self).__init__()
self._candle_type = self.Param("CandleType", DataType.TimeFrame(TimeSpan.FromMinutes(5)))
self._rsi_period = self.Param("RsiPeriod", 14)
self._ema_period = self.Param("EmaPeriod", 20)
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 RsiPeriod(self):
return self._rsi_period.Value
@RsiPeriod.setter
def RsiPeriod(self, value):
self._rsi_period.Value = value
@property
def EmaPeriod(self):
return self._ema_period.Value
@EmaPeriod.setter
def EmaPeriod(self, value):
self._ema_period.Value = value
def OnReseted(self):
super(scalping_assistant_strategy, self).OnReseted()
self._prev_rsi = 0.0
self._has_prev = False
def OnStarted2(self, time):
super(scalping_assistant_strategy, self).OnStarted2(time)
self._has_prev = False
rsi = RelativeStrengthIndex()
rsi.Length = self.RsiPeriod
ema = ExponentialMovingAverage()
ema.Length = self.EmaPeriod
subscription = self.SubscribeCandles(self.CandleType)
subscription.Bind(rsi, ema, self._process_candle).Start()
def _process_candle(self, candle, rsi_value, ema_value):
if candle.State != CandleStates.Finished:
return
rsi_val = float(rsi_value)
ema_val = float(ema_value)
close = float(candle.ClosePrice)
if self._has_prev:
if self._prev_rsi < 30 and rsi_val >= 30 and close > ema_val and self.Position <= 0:
self.BuyMarket()
elif self._prev_rsi > 70 and rsi_val <= 70 and close < ema_val and self.Position >= 0:
self.SellMarket()
self._prev_rsi = rsi_val
self._has_prev = True
def CreateClone(self):
return scalping_assistant_strategy()