La Estrategia ExpICustomV1 es un puerto StockSharp del MetaTrader experto exp_iCustom_v1. La estrategia lee señales comerciales de una instancia de indicador configurable y reacciona a valores distintos de cero en los buffers seleccionados. Cuando el colchón de compra es distinto de cero, la estrategia abre una posición larga, mientras que el colchón de venta activa una entrada corta. La lógica protectora de stop-loss, take-profit, trailing y breakeven reproduce las opciones de gestión del dinero del experto original.
Nota: Solo se proporciona la implementación de C#. Aún no hay una versión de Python disponible.
Lógica de trading
Suscríbase al período de tiempo principal especificado por Tipo de vela y procese únicamente velas cerradas.
Cree una instancia del indicador definido por Nombre del indicador y aplique los Parámetros del indicador separados por barras (admite tanto pares Name=Value como valores numéricos ordenados).
Almacene las salidas finales del indicador en un búfer de historial para que se pueda acceder a cualquier cambio en velas posteriores.
Cuando el valor del buffer de compra en Indicator Shift no es cero, la estrategia abre/mantiene una posición larga. Cuando el buffer de venta es distinto de cero, la estrategia abre/mantiene una posición corta.
Si ambos buffers devuelven valores distintos de cero simultáneamente, las señales se cancelan entre sí para evitar entradas ambiguas.
Opcional Cerrar en reversa sale de la posición actual antes de reaccionar a la señal opuesta.
La lógica de suspensión impone un número mínimo de barras entre entradas consecutivas en la misma dirección. El temporizador se puede cancelar cuando se activa la señal opuesta si Cancelar Dormir está habilitado.
Las posiciones están protegidas por stop-loss, take-profit, trailing stop opcional y bloqueo de equilibrio. Todas las distancias se expresan en puntos de precio.
Configuración del indicador
Nombre del indicador: nombre completo o nombre corto del indicador StockSharp (por ejemplo, SMA, MACD, BollingerBands).
Parámetros del indicador: lista separada por barras aplicada al indicador. Se admiten tanto Length=14/Width=2 como valores ordenados como 14/2/0.7.
Anular bloques: hasta cinco reemplazos le permiten ajustar los valores de los parámetros por índice durante la optimización, similar a las entradas Opt_X en el experto original. Los índices tienen base cero.
Gestión de riesgos y dinero
Volumen Base – Monto enviado con cada orden de mercado.
Stop Loss / Take Profit – Distancias absolutas en puntos desde el precio de entrada.
Trailing Stop: se activa después de la ganancia especificada y mantiene la distancia configurada desde el precio extremo.
Break Even: mueve el stop hacia el precio de entrada después de la ganancia especificada y, opcionalmente, bloquea puntos adicionales.
Referencia de parámetros
Parámetro
Descripción
Tipo de vela
Plazo utilizado para la evaluación de indicadores y señales.
Nombre del indicador
Escriba el nombre de la instancia del indicador.
Parámetros del indicador
Lista de parámetros de indicador separados por barras.
Comprar búfer / Vender búfer
Índices de búfer que contienen los marcadores de compra/venta.
Cambio de indicador
Cambio histórico aplicado al leer los buffers del indicador.
Anular bloques
Reemplace posiciones de parámetros específicos durante el tiempo de ejecución.
Barras para dormir
Barras mínimas entre entradas en la misma dirección.
Cancelar Dormir
Reinicie el temporizador de apagado después de una señal opuesta.
Cerrar al revés
Cierre la posición existente cuando aparezca la señal opuesta.
Órdenes máximas/Compra máxima/Venta máxima
Tapas blandas que limitan el número de posiciones simultáneas.
Detener pérdidas / Tomar ganancias
Distancia en puntos por órdenes de protección.
Configuración de parada móvil
Parámetros que controlan la activación y la distancia del trailing stop.
Configuración de punto de equilibrio
Parámetros que controlan la activación del punto de equilibrio y la distancia de bloqueo.
Volumen básico
Volumen de cada entrada al mercado.
Uso
Agregue la estrategia a su contenedor de estrategias y configure Seguridad y Cartera.
Configure Nombre del indicador y Parámetros del indicador para que coincidan con el indicador personalizado de destino.
Ajuste la configuración de riesgo (stop, take, trailing, breakeven) y el volumen de la orden base.
Ejecute la estrategia. Se suscribirá al plazo elegido, evaluará los colchones del indicador y enviará órdenes de mercado cuando se cumplan las condiciones.
Limitaciones
El indicador debe estar disponible como tipo de indicador StockSharp. Los indicadores binarios MetaTrader no se pueden cargar directamente.
Los modos de administración de dinero que dependen del margen libre del corredor se simplifican a un volumen base fijo.
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>
/// ExpICustomV1 - custom indicator signal strategy.
/// Uses fast/slow EMA crossover to generate entry/exit signals.
/// Reverses position on opposite crossover.
/// </summary>
public class ExpICustomV1Strategy : Strategy
{
private readonly StrategyParam<int> _fastPeriod;
private readonly StrategyParam<int> _slowPeriod;
private readonly StrategyParam<DataType> _candleType;
private decimal _prevFast;
private decimal _prevSlow;
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 ExpICustomV1Strategy()
{
_fastPeriod = Param(nameof(FastPeriod), 10)
.SetDisplay("Fast EMA", "Fast EMA period", "Indicators");
_slowPeriod = Param(nameof(SlowPeriod), 21)
.SetDisplay("Slow EMA", "Slow EMA 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();
_prevFast = 0m;
_prevSlow = 0m;
_hasPrev = false;
}
protected override void OnStarted2(DateTime time)
{
base.OnStarted2(time);
_hasPrev = false;
var fast = new ExponentialMovingAverage { Length = FastPeriod };
var slow = new ExponentialMovingAverage { 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;
if (!_hasPrev)
{
_prevFast = fast;
_prevSlow = slow;
_hasPrev = true;
return;
}
var bullCross = _prevFast <= _prevSlow && fast > slow;
var bearCross = _prevFast >= _prevSlow && fast < slow;
if (bullCross && Position <= 0)
{
if (Position < 0)
BuyMarket();
BuyMarket();
}
else if (bearCross && Position >= 0)
{
if (Position > 0)
SellMarket();
SellMarket();
}
_prevFast = fast;
_prevSlow = slow;
}
}
import clr
clr.AddReference("StockSharp.Messages")
clr.AddReference("StockSharp.Algo")
clr.AddReference("StockSharp.Algo.Indicators")
clr.AddReference("StockSharp.Algo.Strategies")
from System import TimeSpan, Math
from StockSharp.Messages import DataType, CandleStates
from StockSharp.Algo.Indicators import ExponentialMovingAverage
from StockSharp.Algo.Strategies import Strategy
class exp_i_custom_v1_strategy(Strategy):
"""Fast/slow EMA crossover strategy. Reverses position on opposite crossover."""
def __init__(self):
super(exp_i_custom_v1_strategy, self).__init__()
self._fast_period = self.Param("FastPeriod", 10) \
.SetDisplay("Fast EMA", "Fast EMA period", "Indicators")
self._slow_period = self.Param("SlowPeriod", 21) \
.SetDisplay("Slow EMA", "Slow EMA period", "Indicators")
self._candle_type = self.Param("CandleType", DataType.TimeFrame(TimeSpan.FromHours(4))) \
.SetDisplay("Candle Type", "Candle timeframe", "General")
self._prev_fast = 0.0
self._prev_slow = 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 FastPeriod(self):
return self._fast_period.Value
@property
def SlowPeriod(self):
return self._slow_period.Value
def OnReseted(self):
super(exp_i_custom_v1_strategy, self).OnReseted()
self._prev_fast = 0.0
self._prev_slow = 0.0
self._has_prev = False
def OnStarted2(self, time):
super(exp_i_custom_v1_strategy, self).OnStarted2(time)
self._has_prev = False
fast = ExponentialMovingAverage()
fast.Length = self.FastPeriod
slow = ExponentialMovingAverage()
slow.Length = self.SlowPeriod
subscription = self.SubscribeCandles(self.CandleType)
subscription.Bind(fast, slow, self._process_candle).Start()
def _process_candle(self, candle, fast, slow):
if candle.State != CandleStates.Finished:
return
fast_val = float(fast)
slow_val = float(slow)
if not self._has_prev:
self._prev_fast = fast_val
self._prev_slow = slow_val
self._has_prev = True
return
bull_cross = self._prev_fast <= self._prev_slow and fast_val > slow_val
bear_cross = self._prev_fast >= self._prev_slow and fast_val < slow_val
if bull_cross and self.Position <= 0:
if self.Position < 0:
self.BuyMarket()
self.BuyMarket()
elif bear_cross and self.Position >= 0:
if self.Position > 0:
self.SellMarket()
self.SellMarket()
self._prev_fast = fast_val
self._prev_slow = slow_val
def CreateClone(self):
return exp_i_custom_v1_strategy()