Estrategia que opera AUDUSD en el marco temporal diario utilizando cruces de líneas MACD.
La estrategia abre una posición larga cuando la línea principal del MACD cruza por encima de la línea de señal y una posición corta cuando la cruza por debajo. Las operaciones están permitidas únicamente entre las 06:00 y las 14:00 hora del servidor, y solo puede haber una posición abierta a la vez. Cada operación establece un stop loss de 40 pips y un take profit tres veces mayor por defecto.
Detalles
Criterios de entrada: La línea principal del MACD cruza la línea de señal.
Largo/Corto: Ambas direcciones.
Criterios de salida: Stop loss o take profit.
Stops: Sí.
Valores predeterminados:
Volume = 0.1
StopLossPips = 40
RewardRatio = 3
CandleType = TimeSpan.FromDays(1)
Filtros:
Categoría: Tendencia
Dirección: Ambos
Indicadores: MACD
Stops: Sí
Complejidad: Básico
Marco temporal: Diario
Estacionalidad: No
Redes neuronales: No
Divergencia: No
Nivel de riesgo: Medio
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()