Strategy trades AUDUSD on the daily timeframe using MACD line crossovers.
The strategy opens a long position when the MACD main line crosses above the signal line and a short position when it crosses below. Trading is allowed only between 06:00 and 14:00 server time, and only one position can be open at a time. Each trade sets a stop loss of 40 pips and a take profit three times larger by default.
Details
Entry Criteria: MACD main line crossing the signal line.
Long/Short: Both directions.
Exit Criteria: Stop loss or take profit.
Stops: Yes.
Default Values:
Volume = 0.1
StopLossPips = 40
RewardRatio = 3
CandleType = TimeSpan.FromDays(1)
Filters:
Category: Trend
Direction: Both
Indicators: MACD
Stops: Yes
Complexity: Basic
Timeframe: Daily
Seasonality: No
Neural Networks: No
Divergence: No
Risk Level: Medium
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>
/// Strategy that trades MACD crossovers.
/// </summary>
public class MacdCrossAudusdD1Strategy : Strategy
{
private readonly StrategyParam<DataType> _candleType;
private bool _prevIsMacdAboveSignal;
private bool _hasPrev;
public DataType CandleType
{
get => _candleType.Value;
set => _candleType.Value = value;
}
public MacdCrossAudusdD1Strategy()
{
_candleType = Param(nameof(CandleType), TimeSpan.FromHours(4).TimeFrame())
.SetDisplay("Candle Type", "Timeframe for candles", "General");
}
public override IEnumerable<(Security sec, DataType dt)> GetWorkingSecurities()
=> [(Security, CandleType)];
protected override void OnReseted()
{
base.OnReseted();
_prevIsMacdAboveSignal = false;
_hasPrev = false;
}
/// <inheritdoc />
protected override void OnStarted2(DateTime time)
{
base.OnStarted2(time);
var macd = new MovingAverageConvergenceDivergenceSignal
{
Macd =
{
ShortMa = { Length = 12 },
LongMa = { Length = 26 }
},
SignalMa = { Length = 9 }
};
var subscription = SubscribeCandles(CandleType);
subscription
.BindEx(macd, ProcessCandle)
.Start();
}
private void ProcessCandle(ICandleMessage candle, IIndicatorValue macdValue)
{
if (candle.State != CandleStates.Finished)
return;
var macdTyped = (MovingAverageConvergenceDivergenceSignalValue)macdValue;
var macdVal = macdTyped.Macd;
var signalVal = macdTyped.Signal;
if (macdVal is not decimal m || signalVal is not decimal s)
return;
var isMacdAboveSignal = m > s;
if (!_hasPrev)
{
_prevIsMacdAboveSignal = isMacdAboveSignal;
_hasPrev = true;
return;
}
var crossedUp = isMacdAboveSignal && !_prevIsMacdAboveSignal;
var crossedDown = !isMacdAboveSignal && _prevIsMacdAboveSignal;
if (crossedUp && Position <= 0)
{
BuyMarket();
}
else if (crossedDown && Position >= 0)
{
SellMarket();
}
_prevIsMacdAboveSignal = isMacdAboveSignal;
}
}
import clr
clr.AddReference("StockSharp.Messages")
clr.AddReference("StockSharp.Algo")
clr.AddReference("StockSharp.Algo.Indicators")
clr.AddReference("StockSharp.Algo.Strategies")
from System import TimeSpan
from StockSharp.Messages import DataType, CandleStates
from StockSharp.Algo.Indicators import MovingAverageConvergenceDivergenceSignal
from StockSharp.Algo.Strategies import Strategy
class macd_cross_audusd_d1_strategy(Strategy):
def __init__(self):
super(macd_cross_audusd_d1_strategy, self).__init__()
self._candle_type = self.Param("CandleType", DataType.TimeFrame(TimeSpan.FromHours(4))) \
.SetDisplay("Candle Type", "Timeframe for candles", "General")
self._prev_is_macd_above_signal = False
self._has_prev = False
@property
def candle_type(self):
return self._candle_type.Value
def OnReseted(self):
super(macd_cross_audusd_d1_strategy, self).OnReseted()
self._prev_is_macd_above_signal = False
self._has_prev = False
def OnStarted2(self, time):
super(macd_cross_audusd_d1_strategy, self).OnStarted2(time)
macd = MovingAverageConvergenceDivergenceSignal()
macd.Macd.ShortMa.Length = 12
macd.Macd.LongMa.Length = 26
macd.SignalMa.Length = 9
subscription = self.SubscribeCandles(self.candle_type)
subscription.BindEx(macd, self.on_process).Start()
area = self.CreateChartArea()
if area is not None:
self.DrawCandles(area, subscription)
self.DrawIndicator(area, macd)
self.DrawOwnTrades(area)
def on_process(self, candle, macd_value):
if candle.State != CandleStates.Finished:
return
m = macd_value.Macd
s = macd_value.Signal
if m is None or s is None:
return
macd_line = float(m)
signal_line = float(s)
is_macd_above_signal = macd_line > signal_line
if not self._has_prev:
self._prev_is_macd_above_signal = is_macd_above_signal
self._has_prev = True
return
crossed_up = is_macd_above_signal and not self._prev_is_macd_above_signal
crossed_down = not is_macd_above_signal and self._prev_is_macd_above_signal
if crossed_up and self.Position <= 0:
self.BuyMarket()
elif crossed_down and self.Position >= 0:
self.SellMarket()
self._prev_is_macd_above_signal = is_macd_above_signal
def CreateClone(self):
return macd_cross_audusd_d1_strategy()