Ver en GitHub

Estrategia GTerminal

Descripción general

La estrategia GTerminal es un puerto C# del asesor experto MetaTrader 4 GTerminal_V5a. El guión original permitía el manual. Control de entradas y salidas dibujando líneas horizontales en el gráfico. Este puerto recrea el mismo comportamiento basado en líneas dentro el marco StockSharp exponiendo cada línea virtual como un parámetro configurable. Siempre que el precio de cierre del seleccionado La serie de velas cruza una de estas líneas virtuales, la estrategia abre, cierra o invierte posiciones de la misma manera que el MQL4 versión. Los niveles de protección automática opcionales emulan las líneas auxiliares "tpinit" y "slinit" de la herramienta original.

Lógica estratégica

Muestreo de precios

  • La estrategia funciona en velas terminadas de un período de tiempo definido por el usuario (CandleType).
  • StartShift controla qué vela se utiliza como cierre de referencia. Un valor de 0 usa el cierre de vela actual, 1 usa el vela anterior, etc. El cambio también afecta a la vela de comparación, por lo que el script siempre evalúa dos cierres consecutivos como el MetaTrader implementación.
  • CrossMethod refleja la entrada MQL4:
    • 0 – cruce estricto: el cierre anterior debe estar por debajo (para disparadores largos) o por encima (para disparadores cortos) del nivel y el El cierre actual debe terminar en el lado opuesto del nivel.
    • 1 – disparador instantáneo: el cierre actual solo necesita estar por encima/por debajo del nivel. El puerto aún verifica el cierre anterior de evitar múltiples activadores en la misma barra, replicando el comportamiento de "tocar una vez" obtenido en MetaTrader al eliminar la línea después de que se dispara.

Reglas de entrada

  • Línea de parada de compra: cuando el cierre se mueve desde abajo hacia arriba BuyStopLevel, la estrategia compra. Si hay una posición corta abierta, el tamaño del pedido incluye el volumen necesario para aplanar la exposición corta más el Volume configurado para la nueva exposición larga.
  • Línea de límite de compra: cuando el cierre cae hasta BuyLimitLevel, se abre una posición larga usando la misma lógica de volumen.
  • Línea de parada de venta: cuando el cierre se mueve de arriba a abajo SellStopLevel, la estrategia vende. Los largos existentes se cierran como parte de la cantidad del pedido.
  • Línea de límite de venta: cuando el cierre sube hasta SellLimitLevel, se abre una posición corta.
  • Las entradas se ignoran cuando Volume es 0 o PauseTrading está habilitado.

reglas de salida

  • Salidas direccionalesLongStopLevel y LongTakeProfitLevel cierran el lado largo cuando el cierre cruza el respectivo línea. ShortStopLevel y ShortTakeProfitLevel hacen lo mismo para exposiciones breves.
  • Salidas globales: AllLongStopLevel / AllLongTakeProfitLevel liquida cada posición larga independientemente de cómo se abrió. AllShortStopLevel / AllShortTakeProfitLevel reflejan la lógica de los cortos.
  • Protección inicial: configurar UseInitialProtection en true aplica InitialLongStopLevel, InitialLongTakeProfitLevel, InitialShortStopLevel y InitialShortTakeProfitLevel inmediatamente después de que se cubra un nuevo puesto. Estos niveles se comportan como el Líneas auxiliares "slinit" / "tpinit" del script original y permanecen activas hasta que se cierra la posición o se actualiza el nivel.
  • Solo se envía una acción de salida por vela. Cuando se cumple una condición de salida, la estrategia envía la orden de cierre y se salta la comprobaciones restantes para esa barra, justo cuando la versión MQL4 se detuvo después de que se disparó la línea.

control de pausa

  • PauseTrading reproduce la funcionalidad de la línea MetaTrader "PAUSA". Cuando está habilitado, no se evalúa ninguna lógica de entrada o salida. El estado se puede cambiar manualmente sin recargar la estrategia.

Parámetros

  • Volumen – volumen de pedidos para nuevas entradas. El tamaño final del pedido incluye automáticamente cualquier exposición opuesta que deba ser cerrado durante una reversión.
  • Método cruzado: seleccione el algoritmo de cruce (0 estricto, 1 instantáneo).
  • Start Shift: compensación de vela utilizada para el cálculo del cruce.
  • Pausar operaciones: desactiva todas las acciones comerciales mientras true.
  • Usar protección inicial: permite la aplicación automática de los niveles iniciales de parada/toma de ganancias después de cada llenado.
  • Nivel de parada de compra/Nivel de límite de compra: niveles de precios que activan entradas largas.
  • Nivel de parada de venta/Nivel de límite de venta: niveles de precios que activan entradas cortas.
  • Nivel de parada larga/Take Profit larga: líneas de salida para la posición larga activa.
  • Nivel de parada corta/Take Profit en corto: líneas de salida para la posición corta activa.
  • All Long Stop / All Long Take Profit: líneas de salida globales que cierran cada posición larga.
  • All Short Stop / All Short Take Profit: líneas de salida globales que cierran cada posición corta.
  • Initial Long Stop / Inicial Long Take Profit – niveles de protección activados después de cada entrada larga cuando la protección inicial es habilitado.
  • Parada corta inicial/Take Profit inicial en corta: niveles de protección activados después de cada entrada corta cuando la protección inicial está activa. habilitado.
  • Tipo de vela: período de tiempo que proporciona los precios de cierre utilizados para las comparaciones.

Notas de implementación

  • El puerto mantiene el flujo de trabajo basado en líneas pero expone cada línea como un parámetro en lugar de depender de los objetos del gráfico. Los usuarios pueden actualice los niveles sobre la marcha a través de la cuadrícula de parámetros, imitando la forma en que se movieron las líneas en un gráfico MetaTrader.
  • Los activadores de ventana de indicador del script original (RSI, CCI, Momentum, etc.) no están disponibles en esta versión. Todos los desencadenantes Utilice únicamente precios de cierre. El conjunto de parámetros aún se puede combinar con otros componentes StockSharp si el comportamiento está basado en indicadores. es necesario.
  • La estrategia se basa únicamente en órdenes de mercado (BuyMarket, SellMarket) al igual que el script MQL4, que utilizaba órdenes de mercado para emular la ejecución de la línea pendiente.
  • No existe una implementación de Python; En este paquete solo se proporciona la versión C#.
using System;

using StockSharp.Algo.Indicators;
using StockSharp.Algo.Strategies;
using StockSharp.BusinessEntities;
using StockSharp.Messages;

namespace StockSharp.Samples.Strategies;

public class GTerminalStrategy : Strategy
{
	private readonly StrategyParam<int> _fastPeriod;
	private readonly StrategyParam<int> _slowPeriod;
	private readonly StrategyParam<DataType> _candleType;

	private decimal _prevFast;
	private decimal _prevSlow;
	private bool _hasPrev;
	private int _cooldown;

	public int FastPeriod { get => _fastPeriod.Value; set => _fastPeriod.Value = value; }
	public int SlowPeriod { get => _slowPeriod.Value; set => _slowPeriod.Value = value; }
	public DataType CandleType { get => _candleType.Value; set => _candleType.Value = value; }

	public GTerminalStrategy()
	{
		_fastPeriod = Param(nameof(FastPeriod), 9).SetDisplay("Fast EMA", "Fast EMA period", "Indicators");
		_slowPeriod = Param(nameof(SlowPeriod), 26).SetDisplay("Slow EMA", "Slow EMA period", "Indicators");
		_candleType = Param(nameof(CandleType), TimeSpan.FromMinutes(15).TimeFrame()).SetDisplay("Candle Type", "Candle timeframe", "General");
	}

	/// <inheritdoc />
	protected override void OnReseted()
	{
		base.OnReseted();
		_prevFast = default;
		_prevSlow = default;
		_hasPrev = default;
		_cooldown = default;
	}

	/// <inheritdoc />
	protected override void OnStarted2(DateTime time)
	{
		base.OnStarted2(time);
		_hasPrev = false;
		var fast = new ExponentialMovingAverage { Length = FastPeriod };
		var slow = new ExponentialMovingAverage { Length = SlowPeriod };
		var subscription = SubscribeCandles(CandleType);
		subscription.Bind(fast, slow, ProcessCandle).Start();
	}

	private void ProcessCandle(ICandleMessage candle, decimal fast, decimal slow)
	{
		if (candle.State != CandleStates.Finished) return;
		if (!IsFormedAndOnlineAndAllowTrading()) return;

		if (!_hasPrev) { _prevFast = fast; _prevSlow = slow; _hasPrev = true; return; }
		if (_cooldown > 0)
		{
			_cooldown--;
			_prevFast = fast;
			_prevSlow = slow;
			return;
		}

		if (_prevFast <= _prevSlow && fast > slow && Position <= 0)
		{
			var volume = Volume + Math.Abs(Position);
			BuyMarket(volume);
			_cooldown = 2;
		}
		else if (_prevFast >= _prevSlow && fast < slow && Position >= 0)
		{
			var volume = Volume + Math.Abs(Position);
			SellMarket(volume);
			_cooldown = 2;
		}

		_prevFast = fast; _prevSlow = slow;
	}
}