La Estrategia Alexav SpeedUp M1 es una adaptación directa del asesor experto MetaTrader 4 "Alexav_SpeedUp_M1". Evalúa los cuerpos de las velas intradiarias completadas y reacciona inmediatamente con órdenes de mercado cada vez que el cuerpo de la vela excede un umbral configurable. Después de una entrada, la estrategia emula la gestión de riesgos al estilo MetaTrader adjuntando órdenes stop-loss, take-profit y trailing stop a la posición abierta.
La conversión se basa en el StockSharp nivel alto API. Las velas se consumen a través de SubscribeCandles, la información de precios para el seguimiento se recibe de los datos de nivel 1 y las órdenes de protección se realizan con los ayudantes estándar BuyStop, SellStop, BuyLimit y SellLimit. No se requieren cálculos manuales de indicadores.
Generación de señal
Se inspecciona cada vela terminada en el período de tiempo configurado.
Cuando la vela cierra por encima de su apertura por más del umbral corporal, la estrategia abre (o revierte) una posición larga en el mercado.
Cuando la vela cierra por debajo de su apertura por más del mismo umbral, la estrategia abre (o revierte) una posición corta en el mercado.
La exposición existente en la dirección opuesta se cierra automáticamente aumentando el volumen de la orden de mercado, reproduciendo fielmente el comportamiento del asesor experto original.
Gestión de pedidos
Stop-loss inicial: Tan pronto como aumenta el volumen de la posición, se registra una orden de stop de protección al precio de entrada menos (para largos) o más (para cortos) el número de puntos configurado.
Take-profit: Se coloca una orden límite coincidente en la dirección de la operación a la distancia especificada en Take Profit (puntos).
Parada dinámica: las actualizaciones de oferta/demanda de nivel 1 monitorean el beneficio actual. Cuando el beneficio no realizado supera la distancia de seguimiento, el stop protector se mueve hacia el precio, manteniendo la brecha configurada sin retroceder nunca.
Todas las órdenes de protección se cancelan cuando la posición vuelve a estabilizarse.
La conversión mantiene la lógica intencionalmente simple: no se agregan filtros, indicadores o controles de riesgo adicionales más allá de lo que estaba presente en la implementación MQL.
Parámetros
Nombre
Descripción
Tamaño del lote
Volumen de negociación base (en lotes) utilizado para cada orden de mercado. Al invertir una posición existente, el volumen requerido se agrega automáticamente.
Obtener ganancias (puntos)
Distancia desde el precio de entrada hasta el nivel de obtención de beneficios medida en MetaTrader puntos (convertida utilizando el paso del precio del valor).
Parada inicial (puntos)
Distancia desde el precio de entrada hasta el stop de protección inicial expresada en puntos.
Parada dinámica (puntos)
Distancia de seguimiento que se mantiene después de que el precio se mueve a favor de la posición. Un valor de cero desactiva la lógica de seguimiento.
Umbral corporal
Diferencia absoluta mínima entre el cierre y la apertura de la vela requerida para activar una nueva operación.
Tipo de vela
Serie de velas (marco de tiempo) utilizada para la evaluación de señales. El valor predeterminado coincide con el gráfico original de un minuto.
Notas de uso
Asegúrese de que la seguridad proporcione un PriceStep válido. Cuando no está disponible, la estrategia recurre a interpretar las distancias entre puntos como compensaciones de precios brutos.
La lógica del trailing stop requiere datos de nivel 1 (mejor oferta/demanda). Cuando solo hay datos de velas disponibles, la funcionalidad de seguimiento permanece inactiva.
La estrategia está diseñada para operaciones intradía y refleja el comportamiento de una operación por vela aplicado por el experto original MQL a través de sus contadores internos.
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>
/// Alexav SpeedUp M1 Body strategy.
/// Trades based on large candle body breakouts.
/// Buys after a large bullish candle, sells after a large bearish candle.
/// Uses ATR to define "large" body threshold.
/// </summary>
public class AlexavSpeedUpM1BodyBreakStrategy : Strategy
{
private readonly StrategyParam<int> _atrPeriod;
private readonly StrategyParam<decimal> _bodyMultiplier;
private readonly StrategyParam<DataType> _candleType;
public int AtrPeriod { get => _atrPeriod.Value; set => _atrPeriod.Value = value; }
public decimal BodyMultiplier { get => _bodyMultiplier.Value; set => _bodyMultiplier.Value = value; }
public DataType CandleType { get => _candleType.Value; set => _candleType.Value = value; }
public AlexavSpeedUpM1BodyBreakStrategy()
{
_atrPeriod = Param(nameof(AtrPeriod), 14)
.SetDisplay("ATR Period", "ATR period for body threshold", "Indicators");
_bodyMultiplier = Param(nameof(BodyMultiplier), 1.0m)
.SetDisplay("Body Multiplier", "Body must exceed ATR * multiplier", "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();
}
protected override void OnStarted2(DateTime time)
{
base.OnStarted2(time);
var atr = new AverageTrueRange { Length = AtrPeriod };
var subscription = SubscribeCandles(CandleType);
subscription
.Bind(atr, ProcessCandle)
.Start();
}
private void ProcessCandle(ICandleMessage candle, decimal atrValue)
{
if (candle.State != CandleStates.Finished)
return;
var body = candle.ClosePrice - candle.OpenPrice;
var absBody = Math.Abs(body);
var threshold = atrValue * BodyMultiplier;
if (absBody < threshold)
return;
// Large bullish candle - buy
if (body > 0 && Position <= 0)
{
if (Position < 0)
BuyMarket();
BuyMarket();
}
// Large bearish candle - sell
else if (body < 0 && Position >= 0)
{
if (Position > 0)
SellMarket();
SellMarket();
}
}
}
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 AverageTrueRange
from StockSharp.Algo.Strategies import Strategy
class alexav_speed_up_m1_body_break_strategy(Strategy):
"""Alexav SpeedUp M1 Body strategy.
Trades based on large candle body breakouts.
Buys after a large bullish candle, sells after a large bearish candle.
Uses ATR to define large body threshold."""
def __init__(self):
super(alexav_speed_up_m1_body_break_strategy, self).__init__()
self._atr_period = self.Param("AtrPeriod", 14) \
.SetDisplay("ATR Period", "ATR period for body threshold", "Indicators")
self._body_multiplier = self.Param("BodyMultiplier", 1.0) \
.SetDisplay("Body Multiplier", "Body must exceed ATR * multiplier", "Indicators")
self._candle_type = self.Param("CandleType", DataType.TimeFrame(TimeSpan.FromHours(4))) \
.SetDisplay("Candle Type", "Candle timeframe", "General")
@property
def CandleType(self):
return self._candle_type.Value
@CandleType.setter
def CandleType(self, value):
self._candle_type.Value = value
@property
def AtrPeriod(self):
return self._atr_period.Value
@property
def BodyMultiplier(self):
return self._body_multiplier.Value
def OnReseted(self):
super(alexav_speed_up_m1_body_break_strategy, self).OnReseted()
def OnStarted2(self, time):
super(alexav_speed_up_m1_body_break_strategy, self).OnStarted2(time)
atr = AverageTrueRange()
atr.Length = self.AtrPeriod
subscription = self.SubscribeCandles(self.CandleType)
subscription.Bind(atr, self._process_candle).Start()
def _process_candle(self, candle, atr_value):
if candle.State != CandleStates.Finished:
return
close = float(candle.ClosePrice)
open_price = float(candle.OpenPrice)
body = close - open_price
abs_body = abs(body)
atr_val = float(atr_value)
threshold = atr_val * float(self.BodyMultiplier)
if abs_body < threshold:
return
# Large bullish candle - buy
if body > 0 and self.Position <= 0:
if self.Position < 0:
self.BuyMarket()
self.BuyMarket()
# Large bearish candle - sell
elif body < 0 and self.Position >= 0:
if self.Position > 0:
self.SellMarket()
self.SellMarket()
def CreateClone(self):
return alexav_speed_up_m1_body_break_strategy()