在 GitHub 上查看

隔夜持仓EMA策略

该策略在所选市场收盘前几分钟建立多头仓位,并在开盘后不久退出。可选的EMA过滤用于确认入场。支持美国、亚洲和欧洲市场,并会在周末前平掉所有持仓。

详情

  • 入场:收盘前数分钟,当价格高于EMA(如果启用)。
  • 退出:开盘后设定分钟数或在周五收盘前五分钟。
  • 市场:美国、亚洲或欧洲。
  • 指标:EMA。
  • 方向:仅做多。
  • 止损:无。
using System;

using Ecng.Common;

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

namespace StockSharp.Samples.Strategies;

public class OvernightPositioningEmaStrategy : Strategy
{
	private readonly StrategyParam<int> _emaLen;
	private readonly StrategyParam<DataType> _candle;

	private DateTime _currentDay;
	private bool _tradeTakenToday;

	public int EmaLength { get => _emaLen.Value; set => _emaLen.Value = value; }
	public DataType CandleType { get => _candle.Value; set => _candle.Value = value; }

	public OvernightPositioningEmaStrategy()
	{
		_emaLen = Param(nameof(EmaLength), 100).SetGreaterThanZero();
		_candle = Param(nameof(CandleType), TimeSpan.FromMinutes(5).TimeFrame());
	}

	/// <inheritdoc />
	protected override void OnReseted()
	{
		base.OnReseted();
		_currentDay = default;
		_tradeTakenToday = false;
	}

	/// <inheritdoc />
	protected override void OnStarted2(DateTime time)
	{
		base.OnStarted2(time);

		_currentDay = default;
		_tradeTakenToday = false;

		var ema = new ExponentialMovingAverage { Length = EmaLength };
		var sub = SubscribeCandles(CandleType);
		sub.Bind(ema, (candle, emaVal) =>
		{
			if (candle.State != CandleStates.Finished)
				return;

			if (!ema.IsFormed)
				return;

			var day = candle.OpenTime.Date;
			if (_currentDay != day)
			{
				_currentDay = day;
				_tradeTakenToday = false;
			}

			if (_tradeTakenToday)
				return;

			var hour = candle.OpenTime.Hour;

			// Buy near end of day if above EMA
			if (hour >= 15 && hour < 16 && candle.ClosePrice > emaVal && Position <= 0)
			{
				BuyMarket();
				_tradeTakenToday = true;
			}
			// Sell near start of day
			else if (hour >= 9 && hour < 10 && Position > 0)
			{
				SellMarket();
				_tradeTakenToday = true;
			}
		}).Start();

		var area = CreateChartArea();
		if (area != null)
		{
			DrawCandles(area, sub);
			DrawIndicator(area, ema);
			DrawOwnTrades(area);
		}
	}
}