A Estratégia Expert AML MFI replica o MetaTrader 5 consultor especialista "Expert_AML_MFI" usando o StockSharp API de alto nível. Ele se concentra no padrão de velas Meeting Lines e valida cada sinal com o oscilador Money Flow Index (MFI). A estratégia mantém automaticamente as estatísticas de velas necessárias, identifica reversões de alta ou baixa e gerencia posições abertas sempre que a IMF ultrapassa os limites de sobrevenda ou sobrecompra.
Lógica de negociação
Preparação de velas – a estratégia segue o período de tempo selecionado (H1 por padrão) e mantém as duas últimas velas concluídas junto com a média móvel dos corpos das velas. O tamanho médio do corpo é calculado através de um SimpleMovingAverage aplicado ao tamanho absoluto do corpo da vela, espelhando a implementação MT5.
Detecção de padrões – dois ajudantes especializados reconhecem Linhas de reunião de alta e Linhas de reunião de baixa:
Configuração de alta: uma vela longa de baixa seguida por uma vela longa de alta que fecha perto do fechamento anterior (dentro de 10% do corpo médio).
Configuração de baixa: uma vela longa de alta seguida por uma vela longa de baixa com preços de fechamento semelhantes.
Confirmação da IMF – o valor anterior da IMF deve estar abaixo do nível de entrada de alta (padrão 40) para negociações longas ou acima do nível de entrada de baixa (padrão 60) para negociações curtas.
Gerenciamento de posição – as duas últimas leituras de MFI são rastreadas para detectar cruzamentos dos níveis de sobrevenda (30) e sobrecompra (70):
Uma cruz acima de qualquer nível sai das posições curtas.
Uma cruz abaixo do nível de sobrevenda ou acima do nível de sobrecompra sai das posições longas.
Execução de ordem – quando ocorre um padrão válido e confirmação de IMF, a estratégia fecha qualquer exposição oposta e abre uma nova posição no mercado com o volume base configurado.
Parâmetros
Nome
Descrição
Padrão
CandleType
Prazo usado para assinatura de velas.
Período de 1 hora
MfiPeriod
Número de barras do oscilador MFI.
12
BodyAveragePeriod
Comprimento da janela para cálculo do tamanho médio do corpo.
4
BullishEntryLevel
Valor máximo de MFI permitido para entradas otimistas.
40
BearishEntryLevel
Valor mínimo de IMF exigido para entradas de baixa.
60
OversoldLevel
Nível de sobrevenda usado para sinais de saída.
30
OverboughtLevel
Nível de sobrecompra usado para sinais de saída.
70
TradeVolume
Volume base do pedido aplicado a novas negociações.
1
Todos os parâmetros podem ser otimizados diretamente dentro do StockSharp Designer graças aos wrappers StrategyParam.
Indicadores e recursos visuais
Índice de Fluxo de Dinheiro – vinculado à assinatura da vela para confirmação e exibido no gráfico quando uma área do gráfico estiver disponível.
Média Móvel Simples dos corpos das velas – apenas para uso interno, reproduzindo o cálculo do corpo médio MT5.
Notas
A estratégia chama StartProtection() uma vez para ativar recursos integrados de proteção de posição.
Os comandos de negociação usam ajudantes BuyMarket e SellMarket para nivelar a posição atual antes de abrir uma nova, correspondendo ao comportamento do consultor especialista MetaTrader.
Nenhuma porta Python é fornecida de acordo com os requisitos do projeto.
namespace StockSharp.Samples.Strategies;
using System;
using Ecng.Common;
using StockSharp.Algo.Indicators;
using StockSharp.Algo.Strategies;
using StockSharp.Messages;
/// <summary>
/// Meeting Lines + MFI strategy.
/// Buys on bullish meeting lines with low MFI, sells on bearish meeting lines with high MFI.
/// </summary>
public class ExpertAmlMfiStrategy : Strategy
{
private readonly StrategyParam<DataType> _candleType;
private readonly StrategyParam<int> _mfiPeriod;
private readonly StrategyParam<decimal> _mfiLow;
private readonly StrategyParam<decimal> _mfiHigh;
private ICandleMessage _prevCandle;
public DataType CandleType { get => _candleType.Value; set => _candleType.Value = value; }
public int MfiPeriod { get => _mfiPeriod.Value; set => _mfiPeriod.Value = value; }
public decimal MfiLow { get => _mfiLow.Value; set => _mfiLow.Value = value; }
public decimal MfiHigh { get => _mfiHigh.Value; set => _mfiHigh.Value = value; }
public ExpertAmlMfiStrategy()
{
_candleType = Param(nameof(CandleType), TimeSpan.FromMinutes(5).TimeFrame())
.SetDisplay("Candle Type", "Candle timeframe", "General");
_mfiPeriod = Param(nameof(MfiPeriod), 14)
.SetGreaterThanZero()
.SetDisplay("MFI Period", "MFI period", "Indicators");
_mfiLow = Param(nameof(MfiLow), 40m)
.SetDisplay("MFI Low", "MFI level for bullish entry", "Signals");
_mfiHigh = Param(nameof(MfiHigh), 60m)
.SetDisplay("MFI High", "MFI level for bearish entry", "Signals");
}
/// <inheritdoc />
protected override void OnReseted()
{
base.OnReseted();
_prevCandle = null;
}
/// <inheritdoc />
protected override void OnStarted2(DateTime time)
{
base.OnStarted2(time);
_prevCandle = null;
var mfi = new MoneyFlowIndex { Length = MfiPeriod };
var subscription = SubscribeCandles(CandleType);
subscription.Bind(mfi, ProcessCandle).Start();
}
private void ProcessCandle(ICandleMessage candle, decimal mfiValue)
{
if (candle.State != CandleStates.Finished) return;
if (_prevCandle != null)
{
var avgBody = (Math.Abs(candle.ClosePrice - candle.OpenPrice) +
Math.Abs(_prevCandle.ClosePrice - _prevCandle.OpenPrice)) / 2m;
if (avgBody > 0)
{
var prevBearish = _prevCandle.OpenPrice > _prevCandle.ClosePrice;
var currBullish = candle.ClosePrice > candle.OpenPrice;
var closesNear = Math.Abs(candle.ClosePrice - _prevCandle.ClosePrice) < avgBody * 0.3m;
if (prevBearish && currBullish && closesNear && mfiValue < MfiLow && Position <= 0)
BuyMarket();
var prevBullish = _prevCandle.ClosePrice > _prevCandle.OpenPrice;
var currBearish = candle.OpenPrice > candle.ClosePrice;
var closesNear2 = Math.Abs(candle.ClosePrice - _prevCandle.ClosePrice) < avgBody * 0.3m;
if (prevBullish && currBearish && closesNear2 && mfiValue > MfiHigh && Position >= 0)
SellMarket();
}
}
_prevCandle = candle;
}
}
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 MoneyFlowIndex
from StockSharp.Algo.Strategies import Strategy
class expert_aml_mfi_strategy(Strategy):
def __init__(self):
super(expert_aml_mfi_strategy, self).__init__()
self._candle_type = self.Param("CandleType", DataType.TimeFrame(TimeSpan.FromMinutes(5)))
self._mfi_period = self.Param("MfiPeriod", 14)
self._mfi_low = self.Param("MfiLow", 40.0)
self._mfi_high = self.Param("MfiHigh", 60.0)
self._prev_candle = None
@property
def CandleType(self):
return self._candle_type.Value
@CandleType.setter
def CandleType(self, value):
self._candle_type.Value = value
@property
def MfiPeriod(self):
return self._mfi_period.Value
@MfiPeriod.setter
def MfiPeriod(self, value):
self._mfi_period.Value = value
@property
def MfiLow(self):
return self._mfi_low.Value
@MfiLow.setter
def MfiLow(self, value):
self._mfi_low.Value = value
@property
def MfiHigh(self):
return self._mfi_high.Value
@MfiHigh.setter
def MfiHigh(self, value):
self._mfi_high.Value = value
def OnReseted(self):
super(expert_aml_mfi_strategy, self).OnReseted()
self._prev_candle = None
def OnStarted2(self, time):
super(expert_aml_mfi_strategy, self).OnStarted2(time)
self._prev_candle = None
mfi = MoneyFlowIndex()
mfi.Length = self.MfiPeriod
subscription = self.SubscribeCandles(self.CandleType)
subscription.Bind(mfi, self._process_candle).Start()
def _process_candle(self, candle, mfi_value):
if candle.State != CandleStates.Finished:
return
mfi_val = float(mfi_value)
if self._prev_candle is not None:
avg_body = (abs(float(candle.ClosePrice) - float(candle.OpenPrice))
+ abs(float(self._prev_candle.ClosePrice) - float(self._prev_candle.OpenPrice))) / 2.0
if avg_body > 0:
prev_bearish = float(self._prev_candle.OpenPrice) > float(self._prev_candle.ClosePrice)
curr_bullish = float(candle.ClosePrice) > float(candle.OpenPrice)
closes_near = abs(float(candle.ClosePrice) - float(self._prev_candle.ClosePrice)) < avg_body * 0.3
if prev_bearish and curr_bullish and closes_near and mfi_val < self.MfiLow and self.Position <= 0:
self.BuyMarket()
prev_bullish = float(self._prev_candle.ClosePrice) > float(self._prev_candle.OpenPrice)
curr_bearish = float(candle.OpenPrice) > float(candle.ClosePrice)
closes_near2 = abs(float(candle.ClosePrice) - float(self._prev_candle.ClosePrice)) < avg_body * 0.3
if prev_bullish and curr_bearish and closes_near2 and mfi_val > self.MfiHigh and self.Position >= 0:
self.SellMarket()
self._prev_candle = candle
def CreateClone(self):
return expert_aml_mfi_strategy()