TemplateEAbyMarket es una adaptación directa StockSharp del asesor experto original MetaTrader 4 TemplateEAbyMarket.mq4. La estrategia utiliza el indicador de divergencia de convergencia de media móvil (MACD) para detectar cambios de impulso. Cuando la línea principal MACD cruza la línea de señal mientras ambos componentes están en la misma zona positiva o negativa, la estrategia abre una posición de mercado en la dirección del cruce. Las salidas se gestionan exclusivamente a través de órdenes de protección (takeprofit y stop loss) configuradas a través del asistente integrado StartProtection.
La versión StockSharp mantiene el comportamiento del programa MQL: solo abre nuevas posiciones sin intentar cerrar automáticamente el lado opuesto. Una vez que se cubre una posición, la operación se deja gestionar mediante niveles de protección o intervención manual.
Lógica de trading
Suscríbase al tipo de vela seleccionado por el usuario (predeterminado: período de tiempo de 15 minutos).
Calcule MACD (26/12/9 de forma predeterminada) en cada vela terminada.
Realice un seguimiento de la posición relativa de las líneas principal y de señal MACD para detectar un evento de cruce:
Configuración alcista: la vela anterior tenía la línea principal debajo de la línea de señal, la vela actual cierra con la línea principal por encima de la línea de señal y ambas líneas están por encima de cero. Se envía una orden de compra de mercado con OrderVolume si la exposición actual es inferior a MaxOrders * OrderVolume.
Configuración bajista: la vela anterior tenía la línea principal por encima de la línea de señal, la vela actual cierra con la línea principal por debajo de la línea de señal y ambas líneas están por debajo de cero. Se envía una orden de venta de mercado con OrderVolume sujeta al mismo límite de exposición.
Los niveles de protección takeProfit y stopLoss se activan una vez al inicio. La estrategia no cierra automáticamente posiciones opuestas; El riesgo es controlado por el módulo de protección o por el usuario.
Parámetros
Nombre
Descripción
MacdFastPeriod
Longitud rápida de EMA para el cálculo de MACD.
MacdSlowPeriod
Longitud lenta de EMA para el cálculo de MACD.
MacdSignalPeriod
Longitud de la señal EMA para el cálculo MACD.
CandleType
Tipo de vela (marco de tiempo) que alimenta el indicador.
OrderVolume
Volumen presentado con cada orden de mercado.
MaxOrders
Número máximo de pedidos simultáneos, expresado como múltiplos de OrderVolume. La estrategia verifica abs(Position) < MaxOrders * OrderVolume antes de enviar un nuevo pedido.
TakeProfitPoints
Distancia de obtención de beneficios en puntos de precio. El valor 0 deshabilita la toma de ganancias.
StopLossPoints
Distancia de stop-loss en puntos de precio. El valor 0 desactiva el stop loss.
Notas
Las configuraciones de deslizamiento y números mágicos de la versión MQL se omiten intencionalmente porque se manejan de manera diferente en StockSharp.
Asegúrese de que el conector proporcione metadatos de pasos de precios adecuados; StartProtection interpreta distancias en puntos de precio de instrumentos.
La plantilla es intencionalmente minimalista y no gestiona rellenos parciales ni entradas de pirámide más allá del límite MaxOrders.
namespace StockSharp.Samples.Strategies;
using System;
using Ecng.Common;
using StockSharp.Algo.Indicators;
using StockSharp.Algo.Strategies;
using StockSharp.Messages;
/// <summary>
/// Template EA by Market strategy: MACD histogram crossover with signal line.
/// </summary>
public class TemplateEAbyMarketStrategy : Strategy
{
private readonly StrategyParam<DataType> _candleType;
private readonly StrategyParam<int> _fastPeriod;
private readonly StrategyParam<int> _slowPeriod;
private readonly StrategyParam<int> _signalPeriod;
private decimal _prevMacd;
private decimal _prevSignal;
private bool _hasPrev;
public DataType CandleType { get => _candleType.Value; set => _candleType.Value = value; }
public int FastPeriod { get => _fastPeriod.Value; set => _fastPeriod.Value = value; }
public int SlowPeriod { get => _slowPeriod.Value; set => _slowPeriod.Value = value; }
public int SignalPeriod { get => _signalPeriod.Value; set => _signalPeriod.Value = value; }
public TemplateEAbyMarketStrategy()
{
_candleType = Param(nameof(CandleType), TimeSpan.FromMinutes(30).TimeFrame())
.SetDisplay("Candle Type", "Candle timeframe", "General");
_fastPeriod = Param(nameof(FastPeriod), 12)
.SetGreaterThanZero()
.SetDisplay("Fast Period", "MACD fast EMA", "Indicators");
_slowPeriod = Param(nameof(SlowPeriod), 26)
.SetGreaterThanZero()
.SetDisplay("Slow Period", "MACD slow EMA", "Indicators");
_signalPeriod = Param(nameof(SignalPeriod), 9)
.SetGreaterThanZero()
.SetDisplay("Signal Period", "MACD signal period", "Indicators");
}
/// <inheritdoc />
protected override void OnReseted()
{
base.OnReseted();
_prevMacd = 0m;
_prevSignal = 0m;
_hasPrev = false;
}
/// <inheritdoc />
protected override void OnStarted2(DateTime time)
{
base.OnStarted2(time);
_hasPrev = false;
var macd = new MovingAverageConvergenceDivergenceSignal
{
Macd = { ShortMa = { Length = FastPeriod }, LongMa = { Length = SlowPeriod } },
SignalMa = { Length = SignalPeriod }
};
var subscription = SubscribeCandles(CandleType);
subscription.BindEx(macd, ProcessCandle).Start();
}
private void ProcessCandle(ICandleMessage candle, IIndicatorValue macdValue)
{
if (candle.State != CandleStates.Finished) return;
if (!macdValue.IsFinal) return;
var v = (MovingAverageConvergenceDivergenceSignalValue)macdValue;
if (v.Macd is not decimal macdLine || v.Signal is not decimal signal) return;
if (_hasPrev)
{
var prevHist = _prevMacd - _prevSignal;
var currHist = macdLine - signal;
if (prevHist <= 0 && currHist > 0 && Position <= 0)
BuyMarket();
else if (prevHist >= 0 && currHist < 0 && Position >= 0)
SellMarket();
}
_prevMacd = macdLine;
_prevSignal = signal;
_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 MovingAverageConvergenceDivergenceSignal
from StockSharp.Algo.Strategies import Strategy
class template_e_aby_market_strategy(Strategy):
def __init__(self):
super(template_e_aby_market_strategy, self).__init__()
self._candle_type = self.Param("CandleType", DataType.TimeFrame(TimeSpan.FromMinutes(30)))
self._fast_period = self.Param("FastPeriod", 12)
self._slow_period = self.Param("SlowPeriod", 26)
self._signal_period = self.Param("SignalPeriod", 9)
self._prev_macd = 0.0
self._prev_signal = 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
@FastPeriod.setter
def FastPeriod(self, value):
self._fast_period.Value = value
@property
def SlowPeriod(self):
return self._slow_period.Value
@SlowPeriod.setter
def SlowPeriod(self, value):
self._slow_period.Value = value
@property
def SignalPeriod(self):
return self._signal_period.Value
@SignalPeriod.setter
def SignalPeriod(self, value):
self._signal_period.Value = value
def OnReseted(self):
super(template_e_aby_market_strategy, self).OnReseted()
self._prev_macd = 0.0
self._prev_signal = 0.0
self._has_prev = False
def OnStarted2(self, time):
super(template_e_aby_market_strategy, self).OnStarted2(time)
self._has_prev = False
macd = MovingAverageConvergenceDivergenceSignal()
macd.Macd.ShortMa.Length = self.FastPeriod
macd.Macd.LongMa.Length = self.SlowPeriod
macd.SignalMa.Length = self.SignalPeriod
subscription = self.SubscribeCandles(self.CandleType)
subscription.BindEx(macd, self._process_candle).Start()
def _process_candle(self, candle, macd_value):
if candle.State != CandleStates.Finished:
return
if not macd_value.IsFinal:
return
macd_line = macd_value.Macd
signal = macd_value.Signal
if macd_line is None or signal is None:
return
macd_line = float(macd_line)
signal = float(signal)
if self._has_prev:
prev_hist = self._prev_macd - self._prev_signal
curr_hist = macd_line - signal
if prev_hist <= 0 and curr_hist > 0 and self.Position <= 0:
self.BuyMarket()
elif prev_hist >= 0 and curr_hist < 0 and self.Position >= 0:
self.SellMarket()
self._prev_macd = macd_line
self._prev_signal = signal
self._has_prev = True
def CreateClone(self):
return template_e_aby_market_strategy()