Die Breadandbutter2-Strategie ist eine direkte Umsetzung des MT4 Expert Advisors von MQL/7710/Breadandbutter2.mq4. Das System überwacht einstündige Kerzen und verfolgt drei linear gewichtete gleitende Durchschnitte (LWMA), die auf den Eröffnungspreisen der Kerzen basieren. Ein synchronisierter Schnittpunkt der drei Durchschnittswerte deutet auf eine Trendumkehr hin. Die Strategie dreht die Position sofort um, um sie an die neue Richtung anzupassen, und verteilt optional zusätzliche Aufträge, während der Trend anhält.
Kernlogik
Abonnieren Sie einstündige Kerzen (konfigurierbar über Kerzentyp).
Berechnen Sie LWMA(5), LWMA(10) und LWMA(15) bei Kerzeneröffnungen.
Erkennen Sie eine zinsbullische Umkehr, wenn die vorherige Kerze LWMA5 < LWMA10 < LWMA15 hatte und die aktuelle Kerze LWMA5 > LWMA10 > LWMA15 anzeigt. Erkennen Sie eine rückläufige Umkehr mit der entgegengesetzten Ungleichungssequenz.
Bei einem bullischen Crossover sollten Sie eine Long-Position mit Volumen-Lots anstreben. Zielen Sie bei einem bearischen Crossover auf eine gleich große Short-Position. Die Strategie passt die bestehende Position an, indem sie nur die Differenz zwischen dem aktuellen und dem Zielengagement kauft oder verkauft.
Nach jeder Eingabe wird der Intervallzähler zurückgesetzt. Sobald die fertigen Kerzen im Intervall ohne einen neuen Crossover vergehen, fügt die Strategie eine weitere Order in der aktuellen Richtung hinzu (Pyramidenbildung) und aktualisiert die Schutzorder.
Gewinnziel und Verlustlimit werden jeder resultierenden Position mithilfe der in Preisschritten ausgedrückten Take-Profit- und Stop-Loss-Abstände zugeordnet. Wenn Sie einen der beiden Werte auf Null setzen, wird der entsprechende Schutz deaktiviert.
Parameter
Name
Standard
Beschreibung
Volumen
0,1
Bestellgröße in Losen für jeden Basiseingang und jede Pyramidenschicht.
Gewinn mitnehmen
20
Abstand in Preisschritten für die Take-Profit-Order. Zum Deaktivieren auf 0 setzen.
Stop-Loss
20
Abstand in Preisschritten für den Schutzstopp. Zum Deaktivieren auf 0 setzen.
Intervall
4
Anzahl der fertigen Kerzen, die gewartet werden müssen, bevor eine weitere Pyramidenposition hinzugefügt wird. Null deaktiviert die Pyramidenbildung.
Kreuzfilter
1.1
Reservierter Parameter, der aus dem Originalcode für zukünftige ADX-Filterung übernommen wurde (derzeit nicht verwendet).
Kerzentyp
1-stündiger Zeitrahmen
Kerzendatenquelle für die LWMA-Berechnungen.
Positionsmanagement
Die Hilfsmethode AdjustPosition stellt sicher, dass die endgültige Position nach jedem Crossover genau mit der gewünschten Belichtung übereinstimmt.
Pyramiding-Trades basieren auf dem aktuellen Vorzeichen von Position, um nur Lots in der bestehenden Richtung hinzuzufügen.
SetTakeProfit und SetStopLoss werden nach jedem Trade aufgerufen, um die Risikokontrollen mit der neuesten Positionsgröße synchron zu halten.
Notizen
Das MT4-Skript hat einen ADX-Wert berechnet, ihn aber nie verwendet; Der Parameter Kreuzfilter wird aus Kompatibilitätsgründen und für zukünftige Erweiterungen beibehalten.
Bei der ursprünglichen MQL-Implementierung war der Intervallzähler auskommentiert. Die StockSharp-Version aktiviert das beabsichtigte Pyramidenverhalten durch das Zählen fertiger Kerzen.
StartProtection() wird während OnStarted aufgerufen, um integrierte Positionsschutzdienste zu aktivieren.
using System;
using System.Collections.Generic;
using StockSharp.Algo.Indicators;
using StockSharp.Algo.Strategies;
using StockSharp.BusinessEntities;
using StockSharp.Messages;
namespace StockSharp.Samples.Strategies;
/// <summary>
/// Bread and Butter strategy - triple WMA crossover.
/// Buys when WMA(5) crosses above WMA(10) and WMA(10) is above WMA(15).
/// Sells when WMA(5) crosses below WMA(10) and WMA(10) is below WMA(15).
/// </summary>
public class Breadandbutter2Strategy : Strategy
{
private readonly StrategyParam<DataType> _candleType;
private decimal _prevWma5;
private decimal _prevWma10;
private bool _hasPrev;
public DataType CandleType { get => _candleType.Value; set => _candleType.Value = value; }
public Breadandbutter2Strategy()
{
_candleType = Param(nameof(CandleType), TimeSpan.FromHours(4).TimeFrame())
.SetDisplay("Candle Type", "Candle timeframe", "General");
}
public override IEnumerable<(Security sec, DataType dt)> GetWorkingSecurities() => [(Security, CandleType)];
protected override void OnReseted() { base.OnReseted(); _prevWma5 = 0m; _prevWma10 = 0m; _hasPrev = false; }
protected override void OnStarted2(DateTime time)
{
base.OnStarted2(time);
_hasPrev = false;
var wma5 = new WeightedMovingAverage { Length = 5 };
var wma10 = new WeightedMovingAverage { Length = 10 };
var wma15 = new WeightedMovingAverage { Length = 15 };
var subscription = SubscribeCandles(CandleType);
subscription
.Bind(wma5, wma10, wma15, ProcessCandle)
.Start();
}
private void ProcessCandle(ICandleMessage candle, decimal wma5, decimal wma10, decimal wma15)
{
if (candle.State != CandleStates.Finished)
return;
if (!_hasPrev)
{
_prevWma5 = wma5;
_prevWma10 = wma10;
_hasPrev = true;
return;
}
if (_prevWma5 <= _prevWma10 && wma5 > wma10 && wma10 > wma15 && Position <= 0)
{
if (Position < 0)
BuyMarket();
BuyMarket();
}
else if (_prevWma5 >= _prevWma10 && wma5 < wma10 && wma10 < wma15 && Position >= 0)
{
if (Position > 0)
SellMarket();
SellMarket();
}
_prevWma5 = wma5;
_prevWma10 = wma10;
}
}