La Estrategia de plantilla multimoneda es una conversión del asesor experto MetaTrader 4 Plantilla multimoneda v4. Reproduce la lógica de entrada cruzada EMA original junto con un promedio estilo martingala, niveles de protección basados en pips y gestión de seguimiento utilizando la API de alto nivel de StockSharp. El período de tiempo predeterminado son velas de cinco minutos, pero se puede cambiar mediante un parámetro.
Lógica comercial
Se calculan dos promedios móviles exponenciales (EMA 20 y EMA 50) en cada vela terminada del período de tiempo seleccionado.
Aparece una señal larga cuando el EMA rápido (20) cierra por encima del EMA lento (50). Aparece una señal corta cuando el EMA rápido cierra por debajo del EMA lento.
El parámetro Order Method decide si la estrategia actúa sobre ambas señales o restringe el comercio a operaciones solo largas o cortas.
Sólo se mantiene una posición neta por dirección. Cuando llega una nueva señal, la estrategia cierra cualquier posición opuesta antes de abrir el lado solicitado.
Gestión de Puestos
Stop Loss / Take Profit: las distancias se ingresan en MetaTrader pips. Se convierten a unidades de precio utilizando el paso del precio del valor, reproduciendo el manejo original de los símbolos Forex de 4 y 5 dígitos.
Trailing Stop: se activa una vez que el precio se mueve a favor de la posición en Trailing Stop (pts) y se ajusta después de cada mejora adicional de Trailing Step (pts).
Martingale Promedio: cuando está habilitado, se envían órdenes de mercado adicionales cada Step (pts) contra la posición actual. Cada nuevo volumen de pedido se escala en Lot Multiplier y el proceso se repite hasta que se cierra la posición.
Take Profit promedio: cuando se abren dos o más órdenes promedio, el objetivo de toma de ganancias puede usar opcionalmente el precio de la posición ponderada más Average TP Offset (pts) para emular el comportamiento de MetaTrader "promedio de TP".
Parámetros
Nombre
Descripción
Predeterminado
Método de pedido
Dirección comercial (Compra y venta, Solo compra, Solo venta).
Comprar y vender
Volumen (lotes)
Tamaño base de la orden del mercado.
0,01
Stop Loss (pips)
Distancia de parada de protección en MetaTrader pips.
50
Tomar ganancias (pips)
Distancia objetivo de ganancias en MetaTrader pips.
100
Trailing Stop (pts)
Umbral de activación del trailing stop en MetaTrader puntos.
15
Paso final (pts)
Se necesita una mejora mínima antes de mover el trailing stop.
5
Habilitar Martingale
Permite promediar hacia abajo/arriba con un volumen creciente.
cierto
Multiplicador de lote
Multiplicador de volumen aplicado a cada nuevo pedido promedio.
1.2
Paso (ptos)
MetaTrader distancia de puntos antes de realizar el siguiente pedido promedio.
150
Toma de ganancias promedio
Cambie entre toma de ganancias fija o promedio cuando existan múltiples órdenes.
cierto
Compensación promedio de TP (pts)
MetaTrader compensación de puntos aplicada a la toma de ganancias promedio.
20
Tipo de vela
Tipo de vela (marco de tiempo) utilizado para los cálculos del indicador.
velas de 5 minutos
Diferencias frente al Expert Advisor original
StockSharp ejecuta posiciones netas en lugar de gestionar tickets MetaTrader individuales. El módulo martingala aumenta el tamaño de la posición neta en lugar de adjuntar objetivos separados específicos del ticket.
El comercio con múltiples símbolos debe lograrse lanzando varias instancias de estrategia, una por valor. El asesor experto original admitía una lista multidivisa integrada dentro de una instancia EA.
Los controles de administración de dinero (CheckMoneyForTrade, CheckVolumeValue) y las restricciones específicas del corredor se reemplazan por la validación de órdenes StockSharp.
Notas de uso
Asegúrese de que los metadatos de seguridad (escalón de precio y decimales) coincidan con el instrumento para que la conversión de pips siga siendo precisa.
La lógica de trailing stop y martingala actúa sobre los precios de cierre de las velas de forma predeterminada. Para un comportamiento más reactivo, conecte fuentes de datos adicionales (cotizaciones u operaciones) y llame a los ayudantes de administración desde allí.
Debido a que se utilizan órdenes de mercado, el control de deslizamiento se delega al corredor o simulador conectado.
namespace StockSharp.Samples.Strategies;
using System;
using Ecng.Common;
using StockSharp.Algo.Indicators;
using StockSharp.Algo.Strategies;
using StockSharp.Messages;
/// <summary>
/// Multi Currency Template strategy: EMA crossover with trend confirmation.
/// Buys when fast EMA crosses above slow EMA, sells on the opposite cross.
/// </summary>
public class MultiCurrencyTemplateStrategy : Strategy
{
private readonly StrategyParam<DataType> _candleType;
private readonly StrategyParam<int> _fastPeriod;
private readonly StrategyParam<int> _slowPeriod;
private decimal _prevFast;
private decimal _prevSlow;
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 MultiCurrencyTemplateStrategy()
{
_candleType = Param(nameof(CandleType), TimeSpan.FromMinutes(5).TimeFrame())
.SetDisplay("Candle Type", "Candle timeframe", "General");
_fastPeriod = Param(nameof(FastPeriod), 20)
.SetGreaterThanZero()
.SetDisplay("Fast Period", "Fast EMA period", "Indicators");
_slowPeriod = Param(nameof(SlowPeriod), 50)
.SetGreaterThanZero()
.SetDisplay("Slow Period", "Slow EMA period", "Indicators");
}
/// <inheritdoc />
protected override void OnReseted()
{
base.OnReseted();
_prevFast = 0m;
_prevSlow = 0m;
_hasPrev = false;
}
/// <inheritdoc />
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)
{
if (_prevFast <= _prevSlow && fast > slow && Position <= 0) BuyMarket();
else if (_prevFast >= _prevSlow && fast < slow && Position >= 0) SellMarket();
}
_prevFast = fast;
_prevSlow = slow;
_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 ExponentialMovingAverage
from StockSharp.Algo.Strategies import Strategy
class multi_currency_template_strategy(Strategy):
"""
Multi Currency Template: fast/slow EMA crossover.
"""
def __init__(self):
super(multi_currency_template_strategy, self).__init__()
self._fast_period = self.Param("FastPeriod", 20).SetDisplay("Fast", "Fast EMA", "Indicators")
self._slow_period = self.Param("SlowPeriod", 50).SetDisplay("Slow", "Slow EMA", "Indicators")
self._candle_type = self.Param("CandleType", DataType.TimeFrame(TimeSpan.FromMinutes(5))).SetDisplay("Candle Type", "Candles", "General")
self._prev_fast = 0.0
self._prev_slow = 0.0
self._has_prev = False
@property
def candle_type(self):
return self._candle_type.Value
def OnReseted(self):
super(multi_currency_template_strategy, self).OnReseted()
self._prev_fast = 0.0
self._prev_slow = 0.0
self._has_prev = False
def OnStarted2(self, time):
super(multi_currency_template_strategy, self).OnStarted2(time)
fast = ExponentialMovingAverage()
fast.Length = self._fast_period.Value
slow = ExponentialMovingAverage()
slow.Length = self._slow_period.Value
subscription = self.SubscribeCandles(self.candle_type)
subscription.Bind(fast, slow, self._process_candle).Start()
area = self.CreateChartArea()
if area is not None:
self.DrawCandles(area, subscription)
self.DrawIndicator(area, fast)
self.DrawIndicator(area, slow)
self.DrawOwnTrades(area)
def _process_candle(self, candle, fast_val, slow_val):
if candle.State != CandleStates.Finished:
return
fast = float(fast_val)
slow = float(slow_val)
if not self._has_prev:
self._prev_fast = fast
self._prev_slow = slow
self._has_prev = True
return
if self._prev_fast <= self._prev_slow and fast > slow and self.Position <= 0:
self.BuyMarket()
elif self._prev_fast >= self._prev_slow and fast < slow and self.Position >= 0:
self.SellMarket()
self._prev_fast = fast
self._prev_slow = slow
def CreateClone(self):
return multi_currency_template_strategy()