Smart Ass Trade ist eine Multi-Zeitrahmen-Trendfolgestrategie, die aus der MQL-Implementierung konvertiert wurde.
Sie analysiert das MACD-Histogramm (OsMA) und einfache gleitende Durchschnitte mit Periode 20 auf 5-, 15- und 30-Minuten-Charts.
Ein täglicher Williams-%R-Filter blockiert Trades bei überkauften oder überverkauften Bedingungen.
Algorithmus
MACD-Histogramm und SMA(20) auf den Zeitrahmen 5m, 15m und 30m berechnen.
Aufwärtstrend definieren, wenn das Histogramm steigt und SMA auf allen drei Zeitrahmen steigt.
Abwärtstrend definieren, wenn das Histogramm fällt und SMA auf allen drei Zeitrahmen fällt.
Täglichen Williams %R (Periode 26) verwenden, um Käufe über -2 oder Verkäufe unter -98 zu vermeiden.
Wenn alle Bedingungen übereinstimmen, einen Marktauftrag in der entsprechenden Richtung eröffnen.
Positionsgröße kann fest oder aus dem Kontowert optimiert werden.
Parameter
Hedging – ermöglicht das Eröffnen entgegengesetzter Positionen.
Lots – festes Handelsvolumen, wenn Optimierung deaktiviert ist.
AutomaticTakeProfit – Platzhalter für dynamischen Take-Profit, derzeit nicht verwendet.
MinimumTakeProfit – Gewinnziel in Punkten für manuellen Modus.
AutomaticStopLoss – Platzhalter für dynamischen Stop-Loss, derzeit nicht verwendet.
StopLoss – Stop-Loss in Punkten für manuellen Modus.
CandleType – Basis-Zeitrahmen für Abonnements (Standard: 5 Minuten).
Hinweise
Die Strategie verwendet die High-Level-API mit SubscribeCandles- und Bind-Aufrufen.
Take-Profit- und Stop-Loss-Werte sind für eine weitere Erweiterung vorgesehen; die aktuelle Version konzentriert sich auf
Signalgenerierung und Orderausführung.
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>
/// Smart trade strategy using EMA crossover.
/// </summary>
public class SmartAssTradeStrategy : 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;
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 SmartAssTradeStrategy()
{
_fastPeriod = Param(nameof(FastPeriod), 12)
.SetGreaterThanZero()
.SetDisplay("Fast Period", "Fast EMA period", "Parameters");
_slowPeriod = Param(nameof(SlowPeriod), 26)
.SetGreaterThanZero()
.SetDisplay("Slow Period", "Slow EMA period", "Parameters");
_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 = FastPeriod };
var slow = new ExponentialMovingAverage { Length = SlowPeriod };
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;
}
}