Auf GitHub ansehen

News-Trading EA-Strategie

Zeitbasierte Straddle-Strategie, die für den Handel rund um wirtschaftliche Nachrichtenveröffentlichungen entwickelt wurde. Zu einem geplanten Zeitpunkt platziert die Strategie symmetrische Buy-Stop- und Sell-Stop-Orders in einem festen Abstand vom aktuellen Preis. Orders werden in jedem Kerzenzeitraum während des Aktivierungsfensters aktualisiert, um dem Marktpreis zu folgen. Wenn eine Position eröffnet wird, wird die entgegengesetzte ausstehende Order storniert und optionale Take-Profit- und Stop-Loss-Niveaus steuern die Ausstiege.

Details

  • Einstiegskriterien:
    • Während des Straddle-Fensters Buy-Stop bei close + Distance * step und Sell-Stop bei close - Distance * step platzieren.
  • Long/Short: Beide
  • Ausstiegskriterien: Gegenläufiger Stop, Take-Profit/Stop-Loss oder Order-Ablauf
  • Stops: Fester Stop-Loss und Take-Profit
  • Standardwerte:
    • StartDateTime = DateTime.Now
    • StartStraddle = 0
    • StopStraddle = 15
    • Volume = 0.01m
    • Distance = 55m
    • TakeProfit = 30m
    • StopLoss = 30m
    • Expiration = 20
    • CandleType = TimeSpan.FromMinutes(1).TimeFrame()
  • Filter:
    • Kategorie: News
    • Richtung: Beide
    • Indikatoren: Keine
    • Stops: Ja
    • Komplexität: Anfänger
    • Zeitrahmen: Ereignis
    • Saisonalität: Nein
    • Neuronale Netze: Nein
    • Divergenz: Nein
    • Risikolevel: Hoch
using System;
using System.Collections.Generic;

using Ecng.Common;

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

namespace StockSharp.Samples.Strategies;

/// <summary>
/// Volatility breakout strategy using StdDev for big candle detection.
/// </summary>
public class NewsTradingEaStrategy : Strategy
{
	private readonly StrategyParam<int> _stdDevPeriod;
	private readonly StrategyParam<int> _emaPeriod;
	private readonly StrategyParam<DataType> _candleType;

	private decimal _prevFast;
	private decimal _prevSlow;
	private bool _hasPrev;

	public int StdDevPeriod { get => _stdDevPeriod.Value; set => _stdDevPeriod.Value = value; }
	public int EmaPeriod { get => _emaPeriod.Value; set => _emaPeriod.Value = value; }
	public DataType CandleType { get => _candleType.Value; set => _candleType.Value = value; }

	public NewsTradingEaStrategy()
	{
		_stdDevPeriod = Param(nameof(StdDevPeriod), 14)
			.SetGreaterThanZero()
			.SetDisplay("StdDev Period", "Volatility period", "Indicators");

		_emaPeriod = Param(nameof(EmaPeriod), 20)
			.SetGreaterThanZero()
			.SetDisplay("EMA Period", "EMA period", "Indicators");

		_candleType = Param(nameof(CandleType), TimeSpan.FromHours(4).TimeFrame())
			.SetDisplay("Candle Type", "Candle type", "General");
	}

	public override IEnumerable<(Security sec, DataType dt)> GetWorkingSecurities()
		=> [(Security, CandleType)];

	protected override void OnReseted()
	{
		base.OnReseted();
		_prevFast = 0;
		_prevSlow = 0;
		_hasPrev = false;
	}

	protected override void OnStarted2(DateTime time)
	{
		base.OnStarted2(time);

		var fast = new ExponentialMovingAverage { Length = 12 };
		var slow = new ExponentialMovingAverage { Length = EmaPeriod };

		SubscribeCandles(CandleType)
			.Bind(fast, slow, ProcessCandle)
			.Start();
	}

	private void ProcessCandle(ICandleMessage candle, decimal fastVal, decimal slowVal)
	{
		if (candle.State != CandleStates.Finished) return;

		if (!_hasPrev)
		{
			_prevFast = fastVal;
			_prevSlow = slowVal;
			_hasPrev = true;
			return;
		}

		var crossUp = _prevFast <= _prevSlow && fastVal > slowVal;
		var crossDown = _prevFast >= _prevSlow && fastVal < slowVal;

		if (crossUp && Position <= 0)
		{
			if (Position < 0) BuyMarket();
			BuyMarket();
		}
		else if (crossDown && Position >= 0)
		{
			if (Position > 0) SellMarket();
			SellMarket();
		}

		_prevFast = fastVal;
		_prevSlow = slowVal;
	}
}