Estrategia Diez Puntos 3 v005
Descripción general
Esta estrategia es una versión StockSharp del asesor experto MetaTrader 4 "10points 3 v005". Sigue la pendiente MACD para decidir si la cesta promedio actual debe ser larga o corta y sigue abriendo órdenes martingala cada vez que el precio se mueve contra la posición activa en una distancia configurable. La versión mejorada "v005" agrega reglas de protección basadas en acciones, filtros de día y hora y la opción de desactivar el ciclo largo o corto.
Lógica comercial
- Lea la dirección de la línea principal MACD. Cuando el indicador sube, la siguiente cesta será larga; cuando baje, la cesta será corta. Una opción permite invertir la interpretación.
- Abra la primera posición de mercado inmediatamente una vez que exista una dirección. Se agregan entradas posteriores cada vez que el precio se mueve
EntryDistancePips contra la posición flotante.
- Los tamaños de los pedidos crecen geométricamente. El multiplicador está controlado por
MartingaleFactor (o HighTradeFactor cuando se permiten más de 12 operaciones). Los volúmenes están alineados con el paso de volumen del instrumento y tienen un límite de 100 lotes.
- Cada entrada actualiza los niveles agregados de stop-loss y take-profit. Los valores iniciales se compensan con
InitialStopPips y TakeProfitPips, mientras que la lógica de seguimiento se activa después de que la posición gana EntryDistancePips + TrailingStopPips a favor.
- Si la protección de la cuenta está habilitada, la estrategia puede alinear el objetivo con la mejor entrada (
ReboundLock) y cerrar la orden más reciente una vez que la ganancia flotante alcance SecureProfit.
- Las reglas de protección del capital cierran toda la canasta cuando la pérdida flotante excede
StopLossAmount, cuando el capital sube por encima de ProfitTarget + ProfitBuffer o cuando el capital cae por debajo de StartProtectionLevel.
- El comercio está limitado a la ventana
OpenHour/CloseHour y está completamente deshabilitado los viernes de forma predeterminada.
gestión del dinero
Cuando UseMoneyManagement está deshabilitado, el primer pedido utiliza el LotSize fijo. Cuando la bandera está habilitada, el volumen base se calcula a partir del valor actual de la cartera y el parámetro RiskPercent. El escalado de minicuentas se puede simular a través de IsStandardAccount.
Parámetros
| Parámetro |
Descripción |
TakeProfitPips |
Distancia (en pips) de la toma de ganancias aplicada a cada entrada. |
LotSize |
Tamaño del lote base cuando la administración del dinero está deshabilitada. |
InitialStopPips |
Distancia inicial de stop-loss para cada orden. |
TrailingStopPips |
Distancia de trailing stop una vez que se alcanza el umbral de activación. |
MaxTrades |
Maximum number of simultaneous martingale entries. |
EntryDistancePips |
Movimiento adverso mínimo requerido para agregar el siguiente pedido. |
SecureProfit |
Beneficio flotante (en unidades monetarias) necesario para activar la salida de protección de cuenta. |
UseAccountProtection |
Habilita la lógica de bloqueo de rebote y beneficio seguro. |
OrdersToProtect |
Número de pasos finales de martingala protegidos por la regla de beneficio seguro. |
ReverseSignals |
Invierte la interpretación de la pendiente MACD. |
UseMoneyManagement |
Permite dimensionamiento basado en equilibrio. |
RiskPercent |
Porcentaje de riesgo utilizado por la fórmula de gestión del dinero. |
IsStandardAccount |
Utiliza escala de lote estándar en lugar de escala mini. |
EurUsdPipValue, GbpUsdPipValue, UsdChfPipValue, UsdJpyPipValue, DefaultPipValue |
Valores de pip utilizados para convertir las ganancias flotantes en moneda. |
CandleType |
Plazo de vela utilizado para la generación de señales. |
MacdFastLength, MacdSlowLength, MacdSignalLength |
Configuración MACD. |
EnableLong, EnableShort |
Activa o desactiva la cesta larga/corta. |
OpenHour, CloseHour, MinuteToStop |
Configuración de la ventana de negociación. |
StopLossProtection, StopLossAmount |
Guardia de stop-loss basada en acciones. |
ProfitTargetEnabled, ProfitTarget, ProfitBuffer |
Bloqueo de ganancias basado en acciones. |
StartProtectionEnabled, StartProtectionLevel |
Guardia de piso de equidad. |
ReboundLock |
Alinea las salidas con la mejor entrada cuando la protección está activa. |
MartingaleFactor, HighTradeFactor |
Martingale multiplicadores. |
CloseOnFriday |
Desactiva el comercio durante los viernes. |
Notas
- La estrategia utiliza el nivel alto StockSharp API (
SubscribeCandles + BindEx) y no expone buffers de indicador sin procesar.
- Cada guardia de acciones cierra la cesta activa utilizando órdenes de mercado para replicar el comportamiento original EA.
- Valide siempre los valores de los parámetros, el tamaño del pip y el valor del pip con las especificaciones de su corredor antes de utilizar la estrategia en producción.
using System;
using StockSharp.Algo.Indicators;
using StockSharp.Algo.Strategies;
using StockSharp.BusinessEntities;
using StockSharp.Messages;
namespace StockSharp.Samples.Strategies;
/// <summary>
/// 10 Points 3 V005: Dual EMA crossover with RSI confirmation and ATR stops.
/// </summary>
public class TenPoints3V005Strategy : Strategy
{
private readonly StrategyParam<DataType> _candleType;
private readonly StrategyParam<int> _fastEmaLength;
private readonly StrategyParam<int> _slowEmaLength;
private readonly StrategyParam<int> _rsiLength;
private readonly StrategyParam<int> _atrLength;
private decimal _prevFast;
private decimal _prevSlow;
private decimal _entryPrice;
public TenPoints3V005Strategy()
{
_candleType = Param(nameof(CandleType), TimeSpan.FromMinutes(5).TimeFrame())
.SetDisplay("Candle Type", "Timeframe.", "General");
_fastEmaLength = Param(nameof(FastEmaLength), 10)
.SetDisplay("Fast EMA", "Fast EMA period.", "Indicators");
_slowEmaLength = Param(nameof(SlowEmaLength), 30)
.SetDisplay("Slow EMA", "Slow EMA period.", "Indicators");
_rsiLength = Param(nameof(RsiLength), 14)
.SetDisplay("RSI Length", "RSI period.", "Indicators");
_atrLength = Param(nameof(AtrLength), 14)
.SetDisplay("ATR Length", "ATR period.", "Indicators");
}
public DataType CandleType { get => _candleType.Value; set => _candleType.Value = value; }
public int FastEmaLength { get => _fastEmaLength.Value; set => _fastEmaLength.Value = value; }
public int SlowEmaLength { get => _slowEmaLength.Value; set => _slowEmaLength.Value = value; }
public int RsiLength { get => _rsiLength.Value; set => _rsiLength.Value = value; }
public int AtrLength { get => _atrLength.Value; set => _atrLength.Value = value; }
/// <inheritdoc />
protected override void OnReseted()
{
base.OnReseted();
_prevFast = 0; _prevSlow = 0; _entryPrice = 0;
}
protected override void OnStarted2(DateTime time)
{
base.OnStarted2(time);
_prevFast = 0; _prevSlow = 0; _entryPrice = 0;
var fastEma = new ExponentialMovingAverage { Length = FastEmaLength };
var slowEma = new ExponentialMovingAverage { Length = SlowEmaLength };
var rsi = new RelativeStrengthIndex { Length = RsiLength };
var atr = new AverageTrueRange { Length = AtrLength };
var subscription = SubscribeCandles(CandleType);
subscription.Bind(fastEma, slowEma, rsi, atr, ProcessCandle).Start();
var area = CreateChartArea();
if (area != null) { DrawCandles(area, subscription); DrawIndicator(area, fastEma); DrawIndicator(area, slowEma); DrawOwnTrades(area); }
}
private void ProcessCandle(ICandleMessage candle, decimal fastVal, decimal slowVal, decimal rsiVal, decimal atrVal)
{
if (candle.State != CandleStates.Finished) return;
if (_prevFast == 0 || _prevSlow == 0 || atrVal <= 0) { _prevFast = fastVal; _prevSlow = slowVal; return; }
var close = candle.ClosePrice;
if (Position > 0)
{
if ((fastVal < slowVal && _prevFast >= _prevSlow) || close <= _entryPrice - atrVal * 1.5m) { SellMarket(); _entryPrice = 0; }
}
else if (Position < 0)
{
if ((fastVal > slowVal && _prevFast <= _prevSlow) || close >= _entryPrice + atrVal * 1.5m) { BuyMarket(); _entryPrice = 0; }
}
if (Position == 0)
{
if (fastVal > slowVal && _prevFast <= _prevSlow && rsiVal > 50) { _entryPrice = close; BuyMarket(); }
else if (fastVal < slowVal && _prevFast >= _prevSlow && rsiVal < 50) { _entryPrice = close; SellMarket(); }
}
_prevFast = fastVal; _prevSlow = slowVal;
}
}
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 ExponentialMovingAverage, RelativeStrengthIndex, AverageTrueRange
from StockSharp.Algo.Strategies import Strategy
class ten_points_3_v005_strategy(Strategy):
"""Dual EMA crossover with RSI confirmation and ATR stops."""
def __init__(self):
super(ten_points_3_v005_strategy, self).__init__()
self._fast_ema = self.Param("FastEmaLength", 10).SetDisplay("Fast EMA", "Fast EMA period", "Indicators")
self._slow_ema = self.Param("SlowEmaLength", 30).SetDisplay("Slow EMA", "Slow EMA period", "Indicators")
self._rsi_length = self.Param("RsiLength", 14).SetDisplay("RSI Length", "RSI period", "Indicators")
self._atr_length = self.Param("AtrLength", 14).SetDisplay("ATR Length", "ATR period", "Indicators")
self._candle_type = self.Param("CandleType", DataType.TimeFrame(TimeSpan.FromMinutes(5))).SetDisplay("Candle Type", "Timeframe", "General")
@property
def CandleType(self): return self._candle_type.Value
@CandleType.setter
def CandleType(self, value): self._candle_type.Value = value
def OnReseted(self):
super(ten_points_3_v005_strategy, self).OnReseted()
self._prev_fast = 0
self._prev_slow = 0
self._entry_price = 0
def OnStarted2(self, time):
super(ten_points_3_v005_strategy, self).OnStarted2(time)
self._prev_fast = 0
self._prev_slow = 0
self._entry_price = 0
fast = ExponentialMovingAverage()
fast.Length = self._fast_ema.Value
slow = ExponentialMovingAverage()
slow.Length = self._slow_ema.Value
rsi = RelativeStrengthIndex()
rsi.Length = self._rsi_length.Value
atr = AverageTrueRange()
atr.Length = self._atr_length.Value
sub = self.SubscribeCandles(self.CandleType)
sub.Bind(fast, slow, rsi, atr, self.OnProcess).Start()
area = self.CreateChartArea()
if area is not None:
self.DrawCandles(area, sub)
self.DrawIndicator(area, fast)
self.DrawIndicator(area, slow)
self.DrawOwnTrades(area)
def OnProcess(self, candle, fast_val, slow_val, rsi_val, atr_val):
if candle.State != CandleStates.Finished:
return
if self._prev_fast == 0 or self._prev_slow == 0 or atr_val <= 0:
self._prev_fast = fast_val
self._prev_slow = slow_val
return
close = float(candle.ClosePrice)
if self.Position > 0:
if (fast_val < slow_val and self._prev_fast >= self._prev_slow) or close <= self._entry_price - atr_val * 1.5:
self.SellMarket()
self._entry_price = 0
elif self.Position < 0:
if (fast_val > slow_val and self._prev_fast <= self._prev_slow) or close >= self._entry_price + atr_val * 1.5:
self.BuyMarket()
self._entry_price = 0
if self.Position == 0:
if fast_val > slow_val and self._prev_fast <= self._prev_slow and rsi_val > 50:
self._entry_price = close
self.BuyMarket()
elif fast_val < slow_val and self._prev_fast >= self._prev_slow and rsi_val < 50:
self._entry_price = close
self.SellMarket()
self._prev_fast = fast_val
self._prev_slow = slow_val
def CreateClone(self):
return ten_points_3_v005_strategy()