La Estrategia de control del Panel de operaciones replica la funcionalidad de la utilidad "Panel de operaciones" MetaTrader 4 dentro de StockSharp. El panel original MQL permitía al operador cambiar el período de tiempo del gráfico activo y saltar entre instrumentos haciendo clic en los botones de la interfaz de usuario. La versión StockSharp expone los mismos controles a través de parámetros de estrategia para que la aplicación host (Designer, Terminal o panel personalizado) pueda ajustarlos sobre la marcha.
A diferencia del Asesor Experto original, este puerto no envía órdenes comerciales. Su objetivo es mantener la suscripción del gráfico sincronizada con el marco temporal y el instrumento seleccionados actualmente y registrar los últimos cierres de velas, proporcionando comentarios similares a las etiquetas de texto en el panel original.
Conceptos clave
Control dinámico de plazos: elija entre M1, M5, M15, M30, H1, H4, D1 o W1. Al cambiar el parámetro se reconstruye inmediatamente la suscripción de la vela.
Búsqueda de instrumentos: especifique un identificador de seguridad a seguir. Cuando está habilitada, la estrategia busca los ISecurityProvider conectados; de lo contrario, vuelve a recurrir a la seguridad ya adjunta a la estrategia.
Retroalimentación de velas: cada vela terminada se registra con su precio de cierre para que el operador pueda verificar la combinación activa de símbolo y período de tiempo.
Parámetros
Parámetro
Descripción
TimeFrameName
Código de período de tiempo preferido (M1, M5, M15, M30, H1, H4, D1, W1). El valor predeterminado es M15.
SecurityId
Identificador opcional del instrumento a controlar. Déjelo en blanco para utilizar la propiedad Security de la estrategia.
AutoLookupSecurity
Cuando true, la estrategia resuelve SecurityId hasta SecurityProvider. Deshabilítelo para aceptar la seguridad ya asignada tal como está.
DefaultCandleType
Se utiliza el respaldo DataType cuando se ingresa un período de tiempo desconocido. El valor predeterminado es velas de un minuto.
Flujo de trabajo
Inicio: el OnStarted la estrategia resuelve la seguridad objetivo y el período de tiempo, luego comienza una suscripción de vela para esa combinación.
Ajustes de tiempo de ejecución: cambiar TimeFrameName, SecurityId o AutoLookupSecurity mientras se ejecuta la estrategia reinicia la suscripción con la nueva configuración.
Procesamiento de velas: cada vela terminada actualiza la propiedad LastFinishedCandle y escribe una entrada de registro que contiene el identificador de seguridad, el código de período de tiempo y el precio de cierre.
Apagar: las suscripciones se detienen durante OnStopped o cuando la estrategia necesita reconstruirlas porque los parámetros cambiaron.
Consejos de uso
Combine la estrategia con un widget de gráfico en StockSharp Designer para reproducir el flujo de trabajo del panel MT4. Los editores de parámetros actúan como botones/combos.
Deje SecurityId en blanco si el host ya asigna un Security a la instancia de estrategia.
La salida del registro se puede conectar a una etiqueta o consola de UI para imitar las etiquetas informativas del script original.
Diferencias con la versión MQL
Sin botones gráficos; en su lugar se utilizan cambios de parámetros.
No se envían acciones comerciales; la lógica se limita a la gestión y el registro de suscripciones de datos.
La lista de plazos es idéntica al panel original, lo que garantiza un comportamiento familiar para los operadores que migran desde MT4.
namespace StockSharp.Samples.Strategies;
using System;
using Ecng.Common;
using StockSharp.Algo.Indicators;
using StockSharp.Algo.Strategies;
using StockSharp.Messages;
/// <summary>
/// Trading Panel Control strategy: Williams %R crossover.
/// Buys when Williams %R crosses above -80, sells when crosses below -20.
/// </summary>
public class TradingPanelControlStrategy : Strategy
{
private readonly StrategyParam<DataType> _candleType;
private readonly StrategyParam<int> _period;
private readonly StrategyParam<int> _signalCooldownCandles;
private decimal _prevWr;
private int _candlesSinceTrade;
private bool _hasPrev;
public DataType CandleType { get => _candleType.Value; set => _candleType.Value = value; }
public int Period { get => _period.Value; set => _period.Value = value; }
public int SignalCooldownCandles { get => _signalCooldownCandles.Value; set => _signalCooldownCandles.Value = value; }
public TradingPanelControlStrategy()
{
_candleType = Param(nameof(CandleType), TimeSpan.FromMinutes(60).TimeFrame())
.SetDisplay("Candle Type", "Candle timeframe", "General");
_period = Param(nameof(Period), 14)
.SetGreaterThanZero()
.SetDisplay("Period", "Williams %R period", "Indicators");
_signalCooldownCandles = Param(nameof(SignalCooldownCandles), 4)
.SetGreaterThanZero()
.SetDisplay("Signal Cooldown", "Bars to wait between trades", "Trading");
}
/// <inheritdoc />
protected override void OnReseted()
{
base.OnReseted();
_prevWr = 0;
_candlesSinceTrade = SignalCooldownCandles;
_hasPrev = false;
}
/// <inheritdoc />
protected override void OnStarted2(DateTime time)
{
base.OnStarted2(time);
_prevWr = 0;
_candlesSinceTrade = SignalCooldownCandles;
_hasPrev = false;
var wr = new RelativeStrengthIndex { Length = Period };
var subscription = SubscribeCandles(CandleType);
subscription.Bind(wr, ProcessCandle).Start();
}
private void ProcessCandle(ICandleMessage candle, decimal wrValue)
{
if (candle.State != CandleStates.Finished) return;
if (_candlesSinceTrade < SignalCooldownCandles)
_candlesSinceTrade++;
if (_hasPrev)
{
if (_prevWr < 35 && wrValue >= 35 && Position <= 0 && _candlesSinceTrade >= SignalCooldownCandles)
{
BuyMarket();
_candlesSinceTrade = 0;
}
else if (_prevWr > 65 && wrValue <= 65 && Position >= 0 && _candlesSinceTrade >= SignalCooldownCandles)
{
SellMarket();
_candlesSinceTrade = 0;
}
}
_prevWr = wrValue;
_hasPrev = true;
}
}