Inicio
/
Ejemplos de estrategias
Ver en GitHub
Estrategia MLTrendE
Esta estrategia opera en la dirección de una media móvil ponderada (WMA) y opcionalmente incrementa posiciones cuando el precio se mueve favorablemente.
Lógica
Calcular una WMA de la serie de velas seleccionada.
Si no hay posición abierta:
Tipo de operación 0 : abrir una posición larga cuando el precio de cierre está por encima de la WMA, o una posición corta cuando está por debajo.
Tipo de operación 1 : siempre abrir una posición larga.
Tipo de operación 2 : siempre abrir una posición corta.
Cuando una posición está abierta y alcanza el objetivo de beneficio especificado, se añade otra operación con volumen escalado.
Una vez alcanzado el número máximo de operaciones, toda la posición se cierra en el siguiente objetivo de beneficio.
Parámetros
Volume – volumen base de operación.
Multiplier1 – multiplicador de volumen para la segunda operación.
Multiplier2 – multiplicador de volumen para la tercera operación.
TakeProfit – beneficio en unidades de precio requerido para escalar o cerrar.
Map – período de la media móvil ponderada.
MaxTrades – número máximo de operaciones consecutivas.
TradeType – 0 seguimiento de tendencia, 1 forzar largo, 2 forzar corto.
CandleType – marco temporal de las velas analizadas.
Notas
La estrategia usa únicamente velas completadas y órdenes de mercado. No gestiona stops ni riesgo; use protección de cuenta si es necesario.
using System;
using System.Collections.Generic;
using Ecng.Common;
using StockSharp.Algo.Indicators;
using StockSharp.Algo.Strategies;
using StockSharp.BusinessEntities;
using StockSharp.Messages;
namespace StockSharp.Samples.Strategies;
/// <summary>
/// Weighted moving average trend strategy.
/// Buys when close crosses above WMA, sells when below.
/// </summary>
public class MLTrendEStrategy : Strategy
{
private readonly StrategyParam<int> _wmaPeriod;
private readonly StrategyParam<DataType> _candleType;
private decimal _prevClose;
private decimal _prevWma;
private bool _hasPrev;
public int WmaPeriod { get => _wmaPeriod.Value; set => _wmaPeriod.Value = value; }
public DataType CandleType { get => _candleType.Value; set => _candleType.Value = value; }
public MLTrendEStrategy()
{
_wmaPeriod = Param(nameof(WmaPeriod), 34)
.SetGreaterThanZero()
.SetDisplay("WMA Length", "Weighted moving average period", "Indicators");
_candleType = Param(nameof(CandleType), TimeSpan.FromHours(4).TimeFrame())
.SetDisplay("Candle Type", "Timeframe for analysis", "General");
}
public override IEnumerable<(Security sec, DataType dt)> GetWorkingSecurities()
=> [(Security, CandleType)];
protected override void OnReseted()
{
base.OnReseted();
_prevClose = 0;
_prevWma = 0;
_hasPrev = false;
}
protected override void OnStarted2(DateTime time)
{
base.OnStarted2(time);
var wma = new WeightedMovingAverage { Length = WmaPeriod };
SubscribeCandles(CandleType).Bind(wma, ProcessCandle).Start();
}
private void ProcessCandle(ICandleMessage candle, decimal wmaValue)
{
if (candle.State != CandleStates.Finished) return;
var close = candle.ClosePrice;
if (!_hasPrev)
{
_prevClose = close;
_prevWma = wmaValue;
_hasPrev = true;
return;
}
// Cross above WMA
if (_prevClose <= _prevWma && close > wmaValue && Position <= 0)
{
if (Position < 0) BuyMarket();
BuyMarket();
}
// Cross below WMA
else if (_prevClose >= _prevWma && close < wmaValue && Position >= 0)
{
if (Position > 0) SellMarket();
SellMarket();
}
_prevClose = close;
_prevWma = wmaValue;
}
}
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 WeightedMovingAverage
from StockSharp.Algo.Strategies import Strategy
class ml_trend_e_strategy(Strategy):
def __init__(self):
super(ml_trend_e_strategy, self).__init__()
self._wma_period = self.Param("WmaPeriod", 34) \
.SetDisplay("WMA Length", "Weighted moving average period", "Indicators")
self._candle_type = self.Param("CandleType", DataType.TimeFrame(TimeSpan.FromHours(4))) \
.SetDisplay("Candle Type", "Timeframe for analysis", "General")
self._prev_close = 0.0
self._prev_wma = 0.0
self._has_prev = False
@property
def wma_period(self):
return self._wma_period.Value
@property
def candle_type(self):
return self._candle_type.Value
def OnReseted(self):
super(ml_trend_e_strategy, self).OnReseted()
self._prev_close = 0.0
self._prev_wma = 0.0
self._has_prev = False
def OnStarted2(self, time):
super(ml_trend_e_strategy, self).OnStarted2(time)
wma = WeightedMovingAverage()
wma.Length = self.wma_period
subscription = self.SubscribeCandles(self.candle_type)
subscription.Bind(wma, self.on_process).Start()
area = self.CreateChartArea()
if area is not None:
self.DrawCandles(area, subscription)
self.DrawOwnTrades(area)
def on_process(self, candle, wma_value):
if candle.State != CandleStates.Finished:
return
close = candle.ClosePrice
if not self._has_prev:
self._prev_close = close
self._prev_wma = wma_value
self._has_prev = True
return
# Cross above WMA
if self._prev_close <= self._prev_wma and close > wma_value and self.Position <= 0:
if self.Position < 0:
self.BuyMarket()
self.BuyMarket()
# Cross below WMA
elif self._prev_close >= self._prev_wma and close < wma_value and self.Position >= 0:
if self.Position > 0:
self.SellMarket()
self.SellMarket()
self._prev_close = close
self._prev_wma = wma_value
def CreateClone(self):
return ml_trend_e_strategy()