Estrategia de comerciante de aire acondicionado inteligente
Descripción general
Smart AC Trader adapta la idea original de MetaTrader "Smart AC Trader" al alto nivel de StockSharp API. El experto MQL evaluó la fortaleza relativa de las monedas dentro de un par y reaccionó cuando la moneda base superó a la moneda cotizada. En StockSharp nos centramos en el mismo comportamiento impulsado por el impulso, pero operamos con un único instrumento al que está vinculada la estrategia. La fuerza se aproxima mediante una combinación de promedios móviles exponenciales (EMA) y el indicador de tasa de cambio (ROC):
Un EMA rápido mide la dirección de la tendencia a corto plazo.
Un EMA lento representa la tendencia principal.
ROC confirma que el impulso del precio se alinea con la tendencia antes de que se permitan las entradas.
Una vez que se abre una posición, la estrategia gestiona activamente la operación utilizando reglas de stop-loss, take-profit, trailing stop y punto de equilibrio que reflejan la amplia configuración de gestión del dinero del experto original.
Lógica de trading
Suscríbase al tipo de vela configurado (período de tiempo) y calcule el EMA rápido, el } lento y el ROC en el cierre de la vela.
Ingrese una posición larga cuando el EMA rápido esté por encima del EMA lento y ROC sea mayor o igual que el umbral de impulso de compra. La exposición corta existente se cierra antes de que se abra la nueva exposición larga.
Ingrese una posición corta cuando el EMA rápido esté por debajo del EMA lento y ROC sea menor o igual al umbral de impulso de venta negativo. La exposición larga existente se cierra antes de que se abra la nueva posición corta.
Administre una posición abierta en cada vela terminada:
Cierre la operación a las distancias configuradas de obtención de beneficios o límite de pérdidas (expresadas en incrementos de precio).
Opcionalmente, arme una salida de equilibrio una vez que el precio se mueva a favor de la operación en la distancia de activación y liquide si el precio regresa a la compensación preservada.
Opcionalmente, siga la parada por la distancia configurada desde el máximo más alto (largo) o el mínimo más bajo (corto) observado después de la entrada.
Parámetros
Parámetro
Descripción
EMA rápida
Longitud del filtro de tendencia EMA rápida.
EMA lenta
Longitud del filtro de tendencia EMA lenta.
ROC Período
Ventana retrospectiva para el filtro de impulso de tasa de cambio.
Comprar impulso
Se requiere un ROC positivo mínimo para abrir operaciones largas.
Impulso de venta
Mínimo negativo absoluto ROC requerido para abrir operaciones cortas.
Detener pérdidas
Distancia de stop-loss expresada en pasos de precio.
Obtener ganancias
Distancia de obtención de beneficios expresada en incrementos de precio.
Usar seguimiento
Permite la gestión de trailing stop.
Arrastrándose
Distancia del trailing stop en pasos de precio.
Usar punto de equilibrio
Habilita la lógica de protección del punto de equilibrio.
Gatillo de equilibrio
Se requieren ganancias en los escalones de precios para armar la lógica del equilibrio.
Compensación de equilibrio
Distancia en los pasos de precios que se mantiene después de alcanzar el punto de equilibrio.
Tipo de vela
Tipo de vela utilizada para alimentar los indicadores.
Notas
La estrategia utiliza Strategy.StartProtection() una vez al inicio para garantizar que el sistema de protección de posición incorporado esté activo según lo recomendado por las pautas del proyecto.
El tamaño de la posición depende de la propiedad base Strategy.Volume. Las órdenes de reversión incluyen automáticamente la exposición actual de modo que una señal opuesta cierra la posición existente y establece una nueva.
Todos los parámetros de riesgo se expresan en pasos de precio porque el asesor experto original utilizó distancias basadas en pips. Asegúrese de que el instrumento tenga un PriceStep válido configurado.
namespace StockSharp.Samples.Strategies;
using System;
using Ecng.Common;
using StockSharp.Algo.Indicators;
using StockSharp.Algo.Strategies;
using StockSharp.Messages;
/// <summary>
/// Smart AC Trader: EMA trend + ROC momentum filter.
/// Buys when fast EMA above slow EMA and ROC positive.
/// Sells when fast EMA below slow EMA and ROC negative.
/// </summary>
public class SmartAcTraderStrategy : Strategy
{
private readonly StrategyParam<DataType> _candleType;
private readonly StrategyParam<int> _fastPeriod;
private readonly StrategyParam<int> _slowPeriod;
private readonly StrategyParam<int> _rocPeriod;
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 RocPeriod
{
get => _rocPeriod.Value;
set => _rocPeriod.Value = value;
}
public SmartAcTraderStrategy()
{
_candleType = Param(nameof(CandleType), TimeSpan.FromMinutes(30).TimeFrame())
.SetDisplay("Candle Type", "Candle timeframe", "General");
_fastPeriod = Param(nameof(FastPeriod), 10)
.SetGreaterThanZero()
.SetDisplay("Fast EMA", "Fast EMA period", "Indicators");
_slowPeriod = Param(nameof(SlowPeriod), 50)
.SetGreaterThanZero()
.SetDisplay("Slow EMA", "Slow EMA period", "Indicators");
_rocPeriod = Param(nameof(RocPeriod), 13)
.SetGreaterThanZero()
.SetDisplay("ROC Period", "Rate of Change period", "Indicators");
}
protected override void OnStarted2(DateTime time)
{
base.OnStarted2(time);
var fast = new ExponentialMovingAverage { Length = FastPeriod };
var slow = new ExponentialMovingAverage { Length = SlowPeriod };
var roc = new RateOfChange { Length = RocPeriod };
decimal? prevFast = null;
decimal? prevSlow = null;
var subscription = SubscribeCandles(CandleType);
subscription
.Bind(fast, slow, roc, (candle, fastVal, slowVal, rocVal) =>
{
if (candle.State != CandleStates.Finished)
return;
if (!IsFormedAndOnlineAndAllowTrading())
return;
if (prevFast.HasValue && prevSlow.HasValue)
{
var crossUp = prevFast.Value <= prevSlow.Value && fastVal > slowVal;
var crossDown = prevFast.Value >= prevSlow.Value && fastVal < slowVal;
if (crossUp && rocVal > 0 && Position <= 0)
BuyMarket();
else if (crossDown && rocVal < 0 && Position >= 0)
SellMarket();
}
prevFast = fastVal;
prevSlow = slowVal;
})
.Start();
var area = CreateChartArea();
if (area != null)
{
DrawCandles(area, subscription);
DrawIndicator(area, fast);
DrawIndicator(area, slow);
DrawOwnTrades(area);
}
}
}
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, RateOfChange
from StockSharp.Algo.Strategies import Strategy
class smart_ac_trader_strategy(Strategy):
def __init__(self):
super(smart_ac_trader_strategy, self).__init__()
self._candle_type = self.Param("CandleType", DataType.TimeFrame(TimeSpan.FromMinutes(30))) \
.SetDisplay("Candle Type", "Candle timeframe", "General")
self._fast_period = self.Param("FastPeriod", 10) \
.SetGreaterThanZero() \
.SetDisplay("Fast EMA", "Fast EMA period", "Indicators")
self._slow_period = self.Param("SlowPeriod", 50) \
.SetGreaterThanZero() \
.SetDisplay("Slow EMA", "Slow EMA period", "Indicators")
self._roc_period = self.Param("RocPeriod", 13) \
.SetGreaterThanZero() \
.SetDisplay("ROC Period", "Rate of Change period", "Indicators")
self._prev_fast = None
self._prev_slow = None
@property
def candle_type(self):
return self._candle_type.Value
def OnReseted(self):
super(smart_ac_trader_strategy, self).OnReseted()
self._prev_fast = None
self._prev_slow = None
def OnStarted2(self, time):
super(smart_ac_trader_strategy, self).OnStarted2(time)
self._fast_ind = ExponentialMovingAverage()
self._fast_ind.Length = self._fast_period.Value
self._slow_ind = ExponentialMovingAverage()
self._slow_ind.Length = self._slow_period.Value
self._roc_ind = RateOfChange()
self._roc_ind.Length = self._roc_period.Value
subscription = self.SubscribeCandles(self.candle_type)
subscription.Bind(self._fast_ind, self._slow_ind, self._roc_ind, self._process_candle).Start()
def _process_candle(self, candle, fast_value, slow_value, roc_value):
if candle.State != CandleStates.Finished:
return
if not self.IsFormedAndOnlineAndAllowTrading():
return
fast_val = float(fast_value)
slow_val = float(slow_value)
roc_val = float(roc_value)
if self._prev_fast is not None and self._prev_slow is not None:
cross_up = self._prev_fast <= self._prev_slow and fast_val > slow_val
cross_down = self._prev_fast >= self._prev_slow and fast_val < slow_val
if cross_up and roc_val > 0 and self.Position <= 0:
self.BuyMarket()
elif cross_down and roc_val < 0 and self.Position >= 0:
self.SellMarket()
self._prev_fast = fast_val
self._prev_slow = slow_val
def CreateClone(self):
return smart_ac_trader_strategy()