Стратегия торгует парой AUDUSD на дневном таймфрейме, используя пересечения линий MACD.
Длинная позиция открывается, когда основная линия MACD пересекает сигнальную снизу вверх, короткая — при пересечении сверху вниз. Торговля возможна только с 06:00 до 14:00 серверного времени, и одновременно может быть открыта только одна позиция. Для каждой сделки устанавливается стоп-лосс 40 пунктов и тейк-профит в три раза больше по умолчанию.
Детали
Критерий входа: пересечение основной линии MACD и сигнальной.
Длинные/короткие: оба направления.
Критерий выхода: стоп-лосс или тейк-профит.
Стопы: да.
Значения по умолчанию:
Volume = 0.1
StopLossPips = 40
RewardRatio = 3
CandleType = TimeSpan.FromDays(1)
Фильтры:
Категория: Trend
Направление: Both
Индикаторы: MACD
Стопы: Yes
Сложность: Basic
Таймфрейм: Daily
Сезонность: No
Нейросети: No
Дивергенция: No
Уровень риска: 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()