Porta de alto nível do consultor especialista MetaTrader 4 simplefx2.mq4 (Simple FX 2.0).
Negocia cruzamentos entre uma média móvel simples rápida e lenta em velas acabadas.
Mantém apenas uma posição aberta e muda quando a tendência dominante se inverte.
Lógica de negociação
Construa velas usando o parâmetro de prazo configurável.
Calcule duas médias móveis simples (rápida e lenta) nos preços de fechamento das velas.
Confirme uma tendência de alta quando a vela atual e a anterior mostrarem a MM rápida acima da MM lenta. Confirme uma tendência de baixa quando ambas as velas mostrarem a MM rápida abaixo da MM lenta.
Quando a tendência confirmada diferir do estado de tendência armazenado, feche qualquer posição oposta e abra imediatamente uma ordem de mercado na nova direção usando o volume configurado.
Podem ser habilitadas proteções opcionais de stop-loss e take-profit expressas em etapas de preço. Eles usam o serviço de proteção integrado do StockSharp para emular as configurações de risco do MT4.
A estratégia processa apenas velas finalizadas, nunca ticks intrabar, para permanecer próxima do comportamento original do consultor especialista. O registro é fornecido em cada nova entrada para que cada decisão cruzada possa ser auditada.
Parâmetros
Nome
Descrição
Padrão
Otimização
ShortPeriod
Comprimento da média móvel simples rápida.
50
10 → 150 passo 5
LongPeriod
Comprimento da média móvel simples lenta.
200
50 → 400 passo 10
Volume
Volume de pedidos enviado em cada negociação no mercado.
0,1
0,1 → 2 passo 0,1
StopLossPoints
Distância de parada protetora nas etapas de preço do instrumento (0 desabilita).
0
-
TakeProfitPoints
Distância alvo de lucro nas etapas de preço do instrumento (0 desativa).
0
-
CandleType
Candle timeframe used for analysis.
1 hora
-
Notas e diferenças da versão MT4
O arquivo de persistência MT4 (simplefx.dat) não é necessário; a última direção da tendência é rastreada na memória pelo estado da estratégia.
As opções de derrapagem, comentário do pedido, número mágico e cor da seta do consultor especialista original não são expostas porque StockSharp lida com o roteamento de maneira diferente.
As distâncias de stop-loss e take-profit são interpretadas em etapas de preço (ticks do instrumento). Ajuste-os para corresponder à definição de pip do seu corretor.
Apenas uma posição pode ser aberta por vez; a estratégia depende de ClosePosition() antes de mudar de direção, garantindo uma mudança clara entre negociações longas e curtas.
Uso
Anexe a estratégia a um título/instrumento e defina o período de vela desejado.
Configure períodos de média móvel e parâmetros de risco.
Inicie a estratégia; ele assinará velas, gerenciará o estado da tendência e enviará ordens de mercado quando um cruzamento for confirmado em duas velas consecutivas.
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>
/// Simple FX crossover strategy.
/// Uses fast and slow SMA crossover for trend detection.
/// Buys on golden cross, sells on death cross.
/// </summary>
public class SimpleFxCrossoverStrategy : Strategy
{
private readonly StrategyParam<int> _shortPeriod;
private readonly StrategyParam<int> _longPeriod;
private readonly StrategyParam<DataType> _candleType;
private decimal _prevShort;
private decimal _prevLong;
private bool _hasPrev;
public int ShortPeriod { get => _shortPeriod.Value; set => _shortPeriod.Value = value; }
public int LongPeriod { get => _longPeriod.Value; set => _longPeriod.Value = value; }
public DataType CandleType { get => _candleType.Value; set => _candleType.Value = value; }
public SimpleFxCrossoverStrategy()
{
_shortPeriod = Param(nameof(ShortPeriod), 10)
.SetDisplay("Fast SMA", "Fast SMA period", "Indicators");
_longPeriod = Param(nameof(LongPeriod), 30)
.SetDisplay("Slow SMA", "Slow SMA period", "Indicators");
_candleType = Param(nameof(CandleType), TimeSpan.FromHours(1).TimeFrame())
.SetDisplay("Candle Type", "Candle timeframe", "General");
}
/// <inheritdoc />
public override IEnumerable<(Security sec, DataType dt)> GetWorkingSecurities()
{
return [(Security, CandleType)];
}
/// <inheritdoc />
protected override void OnReseted()
{
base.OnReseted();
_prevShort = 0m;
_prevLong = 0m;
_hasPrev = false;
}
protected override void OnStarted2(DateTime time)
{
base.OnStarted2(time);
_hasPrev = false;
var fast = new SimpleMovingAverage { Length = ShortPeriod };
var slow = new SimpleMovingAverage { Length = LongPeriod };
var subscription = SubscribeCandles(CandleType);
subscription
.Bind(fast, slow, ProcessCandle)
.Start();
}
private void ProcessCandle(ICandleMessage candle, decimal fast, decimal slow)
{
if (candle.State != CandleStates.Finished)
return;
if (!_hasPrev)
{
_prevShort = fast;
_prevLong = slow;
_hasPrev = true;
return;
}
var crossUp = _prevShort <= _prevLong && fast > slow;
var crossDown = _prevShort >= _prevLong && fast < slow;
if (crossUp && Position <= 0)
{
if (Position < 0)
BuyMarket();
BuyMarket();
}
else if (crossDown && Position >= 0)
{
if (Position > 0)
SellMarket();
SellMarket();
}
_prevShort = fast;
_prevLong = slow;
}
}