Auf GitHub ansehen

ForexLine-Strategie

Die ForexLine-Strategie ist ein Trendfolge-System, das vom MetaTrader-Indikator "ForexLine" abgeleitet ist. Es wendet zwei Stufen gewichteter gleitender Durchschnitte auf den Kurs an, um schnelle und langsame Linien zu erstellen. Kreuzungen zwischen diesen doppelt geglätteten Linien werden zur Bestimmung von Einstiegssignalen verwendet.

Die Strategie kauft, wenn die schnelle Linie über die langsame Linie kreuzt, und verkauft, wenn die schnelle Linie unter die langsame Linie kreuzt. Jeder gleitende Durchschnitt verwendet einen zweistufigen Glättungsprozess, der hilft, Marktlärm herauszufiltern.

Details

  • Einstiegskriterien:
    • Long: Schnelle doppelt geglättete WMA kreuzt über die langsame doppelt geglättete WMA.
    • Short: Schnelle doppelt geglättete WMA kreuzt unter die langsame doppelt geglättete WMA.
  • Long/Short: Beide Seiten.
  • Ausstiegskriterien:
    • Entgegengesetzte Kreuzung schließt bestehende Position.
  • Stops: Nicht enthalten; können extern hinzugefügt werden.
  • Standardwerte:
    • FastLength1 = 5
    • FastLength2 = 10
    • SlowLength1 = 20
    • SlowLength2 = 20
    • CandleType = 8-Stunden-Zeitrahmen
  • Filter:
    • Kategorie: Trendfolge
    • Richtung: Beide
    • Indikatoren: Gewichtete gleitende Durchschnitte
    • Stops: Nein
    • Komplexität: Moderat
    • Zeitrahmen: Mittelfristig
    • Saisonalität: Nein
    • Neuronale Netze: Nein
    • Divergenz: Nein
    • Risikolevel: Mittel
using System;
using System.Linq;
using System.Collections.Generic;

using Ecng.Common;
using Ecng.Collections;
using Ecng.Serialization;

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

namespace StockSharp.Samples.Strategies;

/// <summary>
/// Forex Line strategy using fast/slow WMA crossover.
/// </summary>
public class ForexLineStrategy : Strategy
{
	private readonly StrategyParam<int> _fastLength;
	private readonly StrategyParam<int> _slowLength;
	private readonly StrategyParam<DataType> _candleType;

	private decimal? _prevFast;
	private decimal? _prevSlow;

	public int FastLength { get => _fastLength.Value; set => _fastLength.Value = value; }
	public int SlowLength { get => _slowLength.Value; set => _slowLength.Value = value; }
	public DataType CandleType { get => _candleType.Value; set => _candleType.Value = value; }

	public ForexLineStrategy()
	{
		_fastLength = Param(nameof(FastLength), 10)
			.SetGreaterThanZero()
			.SetDisplay("Fast WMA Length", "Fast line period", "Parameters");

		_slowLength = Param(nameof(SlowLength), 30)
			.SetGreaterThanZero()
			.SetDisplay("Slow WMA Length", "Slow line period", "Parameters");

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

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

	protected override void OnReseted()
	{
		base.OnReseted();
		_prevFast = _prevSlow = null;
	}

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

		var fast = new WeightedMovingAverage { Length = FastLength };
		var slow = new WeightedMovingAverage { Length = SlowLength };

		var subscription = SubscribeCandles(CandleType);
		subscription
			.Bind(fast, slow, ProcessCandle)
			.Start();

		var area = CreateChartArea();
		if (area != null)
		{
			DrawCandles(area, subscription);
			DrawIndicator(area, fast);
			DrawIndicator(area, slow);
			DrawOwnTrades(area);
		}
	}

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

		if (!IsFormedAndOnlineAndAllowTrading())
		{
			_prevFast = fast;
			_prevSlow = slow;
			return;
		}

		if (_prevFast is decimal pf && _prevSlow is decimal ps)
		{
			if (pf <= ps && fast > slow && Position <= 0)
				BuyMarket();
			else if (pf >= ps && fast < slow && Position >= 0)
				SellMarket();
		}

		_prevFast = fast;
		_prevSlow = slow;
	}
}