Histo Scalper Strategy es una adaptación de C# del asesor experto MetaTrader HistoScalperEA v1.0. El algoritmo fusiona ocho indicadores de estilo histograma (ADX, ATR, Bollinger bandas, potencia de toros/osos, CCI, MACD, RSI y Stochastic) y requiere un acuerdo unánime de todos los filtros habilitados antes de abrir una operación. Un segundo requisito es que al menos un filtro informe la dirección opuesta en la barra anterior, lo que evita que la estrategia entre durante mercados planos e imita la lógica de confirmación original de "dos barras".
Generación de señal
Filtro ADX: comprueba si +DI es mayor que −DI. Opcionalmente, invierta la decisión.
Filtro ATR: compara el ATR actual con una línea base SMA y mide la desviación porcentual. Las operaciones largas requieren una desviación positiva por encima de AtrPositiveThreshold; Las operaciones cortas requieren una desviación negativa por debajo de AtrNegativeThreshold.
Bollinger ruptura: espera que el precio de cierre rompa la banda superior/inferior.
Poder de Bulls/Bears: utiliza Bulls Power para entradas largas y magnitud de Bears Power para entradas cortas.
CCI: se activa cuando el valor de CCI cruza los niveles de sobreventa/sobrecompra configurados.
MACD histograma: mide la distancia entre MACD y su línea de señal.
RSI – utiliza zonas clásicas de sobreventa/sobrecompra.
Stochastic: lee la línea %K y la compara con los límites configurados.
Si algún filtro habilitado produce un valor neutral, la estrategia cancela el procesamiento de la vela actual. El estado histórico de cada filtro se almacena para aplicar la regla de "barra anterior opuesta".
Gestión del riesgo
Las entradas al mercado utilizan el parámetro TradeVolume.
La piramidización opcional se suma a las posiciones abiertas; de lo contrario, la estrategia sólo cambia de dirección cuando cambia la señal.
Los niveles de toma de ganancias y límite de pérdidas se expresan en incrementos del precio del instrumento y se aplican inmediatamente después del envío de la orden a través de SetTakeProfit y SetStopLoss.
Un filtro de sesión (UseTimeFilter, SessionStart, SessionEnd) puede deshabilitar el comercio fuera del horario configurado.
Parámetros
Parámetro
Descripción
TradeVolume
Volumen base para nuevas operaciones.
AllowPyramiding
Permite acumular operaciones adicionales mientras ya está posicionada.
CloseOnOppositeSignal
Cierra posiciones existentes cuando la señal agregada cambia.
UseTimeFilter, SessionStart, SessionEnd
Restringe el comercio a una ventana diaria personalizada.
UseTakeProfit, TakeProfitPoints
Habilita y configura la toma de ganancias en pasos de precio.
UseStopLoss, StopLossPoints
Habilita y configura stop loss en pasos de precio.
UseIndicator1 … UseIndicator8
Habilite filtros individuales.
ModeIndicatorX
Cambie entre lógica directa e invertida para cada filtro.
Configuraciones específicas del indicador
Períodos, umbrales y niveles que replican los aportes originales del asesor experto.
Diferencias con el experto MQL
Se omiten intencionadamente la gestión de pérdidas y ganancias de la cesta, las alertas sonoras y la gestión de pedidos de la red.
No se incluye la automatización de riesgos (tamaño de lote de automóviles, equilibrio y lógica de seguimiento); utilice los parámetros de riesgo anteriores en su lugar.
Los controles de diferenciales y las protecciones específicas de los corredores no se transfieren.
Notas de uso
Establezca Security y Portfolio antes de comenzar la estrategia.
Ajuste el tipo de vela (CandleType) para que coincida con el período de tiempo deseado.
Configure los umbrales de los indicadores para que se ajusten a la volatilidad del instrumento objetivo.
Habilite o deshabilite los filtros individualmente para simplificar la optimización.
Utilice AllowPyramiding y CloseOnOppositeSignal para controlar la exposición durante los mercados rápidos.
namespace StockSharp.Samples.Strategies;
using System;
using Ecng.Common;
using StockSharp.Algo.Indicators;
using StockSharp.Algo.Strategies;
using StockSharp.Messages;
/// <summary>
/// Multi-indicator scalping strategy combining MACD, RSI, and CCI filters.
/// Buys when all indicators agree on bullish signal. Sells on bearish agreement.
/// </summary>
public class HistoScalperStrategy : Strategy
{
private readonly StrategyParam<DataType> _candleType;
private readonly StrategyParam<int> _rsiPeriod;
private readonly StrategyParam<int> _cciPeriod;
public DataType CandleType
{
get => _candleType.Value;
set => _candleType.Value = value;
}
public int RsiPeriod
{
get => _rsiPeriod.Value;
set => _rsiPeriod.Value = value;
}
public int CciPeriod
{
get => _cciPeriod.Value;
set => _cciPeriod.Value = value;
}
public HistoScalperStrategy()
{
_candleType = Param(nameof(CandleType), TimeSpan.FromMinutes(30).TimeFrame())
.SetDisplay("Candle Type", "Candle timeframe", "General");
_rsiPeriod = Param(nameof(RsiPeriod), 14)
.SetGreaterThanZero()
.SetDisplay("RSI Period", "RSI period", "Indicators");
_cciPeriod = Param(nameof(CciPeriod), 14)
.SetGreaterThanZero()
.SetDisplay("CCI Period", "CCI period", "Indicators");
}
protected override void OnStarted2(DateTime time)
{
base.OnStarted2(time);
var macd = new MovingAverageConvergenceDivergence();
var rsi = new RelativeStrengthIndex { Length = RsiPeriod };
var cci = new CommodityChannelIndex { Length = CciPeriod };
decimal? prevMacd = null;
var subscription = SubscribeCandles(CandleType);
subscription
.Bind(macd, rsi, cci, (candle, macdLine, rsiVal, cciVal) =>
{
if (candle.State != CandleStates.Finished)
return;
if (!IsFormedAndOnlineAndAllowTrading())
return;
if (prevMacd.HasValue)
{
if (prevMacd.Value <= 0 && macdLine > 0 && rsiVal < 70m && cciVal > -100m && Position <= 0)
BuyMarket();
else if (prevMacd.Value >= 0 && macdLine < 0 && rsiVal > 30m && cciVal < 100m && Position >= 0)
SellMarket();
}
prevMacd = macdLine;
})
.Start();
var area = CreateChartArea();
if (area != null)
{
DrawCandles(area, subscription);
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 MovingAverageConvergenceDivergence, RelativeStrengthIndex, CommodityChannelIndex
from StockSharp.Algo.Strategies import Strategy
class histo_scalper_strategy(Strategy):
def __init__(self):
super(histo_scalper_strategy, self).__init__()
self._rsi_period = self.Param("RsiPeriod", 14) \
.SetDisplay("RSI Period", "RSI period", "Indicators")
self._cci_period = self.Param("CciPeriod", 14) \
.SetDisplay("CCI Period", "CCI period", "Indicators")
self._macd = None
self._rsi = None
self._cci = None
self._prev_macd = None
@property
def rsi_period(self):
return self._rsi_period.Value
@property
def cci_period(self):
return self._cci_period.Value
def OnReseted(self):
super(histo_scalper_strategy, self).OnReseted()
self._macd = None
self._rsi = None
self._cci = None
self._prev_macd = None
def OnStarted2(self, time):
super(histo_scalper_strategy, self).OnStarted2(time)
self._macd = MovingAverageConvergenceDivergence()
self._rsi = RelativeStrengthIndex()
self._rsi.Length = self.rsi_period
self._cci = CommodityChannelIndex()
self._cci.Length = self.cci_period
subscription = self.SubscribeCandles(DataType.TimeFrame(TimeSpan.FromMinutes(30)))
subscription.Bind(self._macd, self._rsi, self._cci, self._process_candle)
subscription.Start()
def _process_candle(self, candle, macd_value, rsi_value, cci_value):
if candle.State != CandleStates.Finished:
return
if not self._macd.IsFormed or not self._rsi.IsFormed or not self._cci.IsFormed:
return
macd_line = float(macd_value)
rsi_val = float(rsi_value)
cci_val = float(cci_value)
if self._prev_macd is not None:
if self._prev_macd <= 0.0 and macd_line > 0.0 and rsi_val < 70.0 and cci_val > -100.0 and self.Position <= 0:
self.BuyMarket()
elif self._prev_macd >= 0.0 and macd_line < 0.0 and rsi_val > 30.0 and cci_val < 100.0 and self.Position >= 0:
self.SellMarket()
self._prev_macd = macd_line
def CreateClone(self):
return histo_scalper_strategy()