La estrategia Scalping Assistant es una conversión directa del MetaTrader 4 asesor experto "Scalper Assistant v1.0". No genera entradas por sí solo. En cambio, monitorea las posiciones abiertas en el valor configurado y administra las órdenes de protección de manera similar a MetaTrader.
como funciona
Cuando se detecta una nueva posición, la estrategia registra inmediatamente órdenes de stop-loss y take-profit utilizando las distancias configuradas (expresadas en pasos de precio).
La estrategia se suscribe a datos de nivel 1 y rastrea continuamente la mejor oferta/demanda para estimar el beneficio actual de la posición.
Una vez que la ganancia no realizada alcanza BreakEvenTriggerPoints, la parada inicial se cancela y se vuelve a registrar al precio de equilibrio más la compensación configurada.
El nivel stop permanece en el punto de equilibrio; no se realiza más seguimiento. La orden de toma de ganancias permanece intacta.
Tan pronto como se cierra la posición, todas las órdenes de protección se cancelan y el estado interno se restablece, listo para la siguiente operación manual.
Notas de uso
Adjunte la estrategia a un conector/cartera y abra operaciones manualmente o desde otro algoritmo. El asistente se hará cargo de la protección de dichos puestos.
La lógica se basa en comillas de nivel1; asegúrese de que el conector seleccionado proporcione las mejores actualizaciones de oferta y demanda.
El término puntos se refiere al paso del precio del instrumento (Security.PriceStep). Para los símbolos de Forex con cinco decimales, esto equivale a un pip.
Parámetros
Nombre
Tipo
Predeterminado
Descripción
StopLossPoints
decimal
30
Distancia (en pasos de precio) utilizada al colocar el stop de protección inicial. Establezca en 0 para omitir el envío de una orden de suspensión.
TakeProfitPoints
decimal
100
Distancia (en incrementos de precio) utilizada al realizar la orden inicial de obtención de beneficios. Establezca en 0 para omitir la toma de ganancias.
BreakEvenTriggerPoints
decimal
15
Beneficio en los escalones de precios que deben alcanzarse antes de que el tope se mueva al punto de equilibrio.
BreakEvenOffsetPoints
decimal
5
Distancia adicional (en pasos de precio) agregada por encima/por debajo del precio de entrada cuando el stop se desplaza al punto de equilibrio.
Estado de conversión
✅ Lógica central: manejo del punto de equilibrio basado en MetaTrader parámetros de entrada.
✅ Uso de API de alto nivel: SubscribeLevel1() con enlace delegado.
✅ Órdenes de protección: creadas a través de SellStop, BuyStop, SellLimit y BuyLimit ayudantes.
❌ Sin puerto Python: solo se proporciona la estrategia C#, que coincide con la solicitud.
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()