A Estratégia do Sistema Smart Forex é uma versão StockSharp do MetaTrader consultor especialista "Smart Forex System". O robô combina um filtro de impulso de vela única com uma grade de média estilo martingale. A primeira negociação é aberta quando a vela anterior mostra um forte fechamento direcional e o preço atual se afastou suficientemente do fechamento de referência. Entradas adicionais são adicionadas em intervalos fixos de pip na direção adversa, com o tamanho da posição aumentando por um multiplicador configurável. A estratégia gerencia as saídas por meio de níveis médios de lucro e um stop-loss de segurança vinculado à última ordem de rede.
Lógica de negociação
Geração de sinal
Avalie a última vela concluída no período selecionado.
Calcule uma taxa de impulso: (current close - previous close) / previous close * 10,000.
Se a vela anterior for de baixa e o momentum for inferior ao limite negativo, uma cesta longa pode começar.
Se a vela anterior for de alta e o momentum exceder o limite positivo, uma cesta curta poderá começar.
A negociação pode ser limitada apenas a posições compradas, apenas vendidas, em ambas as direções ou totalmente desativada por meio do parâmetro Trading Mode.
Expansão da rede
Uma vez existente uma cesta, novas entradas são adicionadas sempre que o preço se move contra a posição em pelo menos Grid Step pips em relação ao preço da última ordem.
Cada novo volume de pedido é multiplicado por Lot Multiplier. Os volumes são limitados aos limites do corretor e ao Max Volume configurado.
A cesta para de crescer quando o número de pedidos atinge Max Trades.
Gerenciamento de saídas
Um stop loss rígido é colocado a Stop Loss pips de distância do preço do pedido mais recente. Romper essa distância fecha a cesta inteira.
Os níveis de lucro dependem do tamanho da cesta:
Um único pedido usa First Take Profit pips do preço médio de entrada ponderado pelo volume.
Vários pedidos usam Grid Take Profit pips do mesmo preço médio de entrada para capturar rebotes menores.
As saídas são processadas nas velas finalizadas para garantir que os indicadores tenham valores finais.
Notas de gerenciamento de risco
O dimensionamento da posição tipo martingale aumenta dramaticamente a exposição em tendências adversas. Use multiplicadores conservadores e tamanhos de cesta em instrumentos altamente voláteis.
O stop-loss padrão (400 pips) é intencionalmente amplo para espelhar o EA original. Considere alinhá-lo com o ATR do instrumento se forem necessárias perdas menores.
A negociação em grade consome margem rapidamente. Certifique-se de que a alavancagem da conta, o tamanho do contrato e os parâmetros Start Volume sejam consistentes com as especificações do corretor.
Parâmetros
Nome
Descrição
Padrão
Modo de negociação
Direção comercial permitida (somente longa, somente curta, ambas ou desativada).
Longo e curto
Limite de impulso
Momento mínimo em pseudo-pips necessário para acionar um sinal.
1
Volume inicial
Volume do primeiro pedido em uma nova cesta.
0,01
Volume máximo
Limite rígido aplicado a qualquer volume de pedido único.
2
Multiplicador de lote
Multiplicador usado ao dimensionar pedidos de grade subsequentes.
1,5
Etapa da grade
Distância mínima em pips antes de adicionar o próximo pedido.
26
Máximo de negociações
Número máximo de pedidos permitidos por direção.
12
Primeiro obtenha lucro
Distância de lucro em pips quando apenas uma ordem está aberta.
30
Grade obtém lucro
Distância de lucro em pips quando a cesta contém vários pedidos.
7
Parar perda
Pare a distância em pips do último preço do pedido.
400
Tipo de vela
Prazo usado para avaliação do sinal.
Velas de 1 hora
Uso recomendado
Anexe a estratégia a um símbolo Forex com liquidez suficiente e um spread previsível.
Defina o Candle Type para corresponder ao período operacional original do EA (H1 por padrão) ou adapte-o ao seu horizonte preferido.
Otimize o espaçamento da grade, o multiplicador e o filtro de impulso em dados históricos antes da implantação em tempo real.
Monitore de perto o uso da margem. A cesta pode crescer rapidamente, portanto considere combinar a estratégia com proteção de patrimônio em toda a conta.
Evite a sobreposição com outros sistemas baseados em grade no mesmo instrumento para reduzir o risco de rebaixamentos agravados.
Diferenças em comparação com a versão MetaTrader
A porta StockSharp funciona com velas finalizadas em vez de atualizações tick-by-tick, o que reduz o ruído e torna a lógica determinística.
Os volumes de pedidos são ajustados usando StockSharp metadados de segurança (mínimo, máximo e passo), garantindo compatibilidade com uma ampla variedade de corretores.
As verificações de take-profit e stop-loss são tratadas dentro da lógica da estratégia, em vez de enviar modificações de pedidos individuais para cada nível da grade.
namespace StockSharp.Samples.Strategies;
using System;
using Ecng.Common;
using StockSharp.Algo.Indicators;
using StockSharp.Algo.Strategies;
using StockSharp.Messages;
/// <summary>
/// Smart Forex System strategy: Triple EMA alignment.
/// Enters when fast > mid > slow (buy) or fast < mid < slow (sell).
/// </summary>
public class SmartForexSystemStrategy : Strategy
{
private readonly StrategyParam<DataType> _candleType;
private readonly StrategyParam<int> _fastPeriod;
private readonly StrategyParam<int> _midPeriod;
private readonly StrategyParam<int> _slowPeriod;
private bool _wasBullishAlignment;
private bool _hasPrevAlignment;
public DataType CandleType { get => _candleType.Value; set => _candleType.Value = value; }
public int FastPeriod { get => _fastPeriod.Value; set => _fastPeriod.Value = value; }
public int MidPeriod { get => _midPeriod.Value; set => _midPeriod.Value = value; }
public int SlowPeriod { get => _slowPeriod.Value; set => _slowPeriod.Value = value; }
public SmartForexSystemStrategy()
{
_candleType = Param(nameof(CandleType), TimeSpan.FromMinutes(60).TimeFrame())
.SetDisplay("Candle Type", "Candle timeframe", "General");
_fastPeriod = Param(nameof(FastPeriod), 10)
.SetGreaterThanZero()
.SetDisplay("Fast EMA", "Fast EMA period", "Indicators");
_midPeriod = Param(nameof(MidPeriod), 25)
.SetGreaterThanZero()
.SetDisplay("Mid EMA", "Mid EMA period", "Indicators");
_slowPeriod = Param(nameof(SlowPeriod), 50)
.SetGreaterThanZero()
.SetDisplay("Slow EMA", "Slow EMA period", "Indicators");
}
/// <inheritdoc />
protected override void OnReseted()
{
base.OnReseted();
_wasBullishAlignment = false;
_hasPrevAlignment = false;
}
/// <inheritdoc />
protected override void OnStarted2(DateTime time)
{
base.OnStarted2(time);
_wasBullishAlignment = false;
_hasPrevAlignment = false;
var fast = new ExponentialMovingAverage { Length = FastPeriod };
var mid = new ExponentialMovingAverage { Length = MidPeriod };
var slow = new ExponentialMovingAverage { Length = SlowPeriod };
var subscription = SubscribeCandles(CandleType);
subscription.Bind(fast, mid, slow, ProcessCandle).Start();
}
private void ProcessCandle(ICandleMessage candle, decimal fastValue, decimal midValue, decimal slowValue)
{
if (candle.State != CandleStates.Finished) return;
var bullishAlignment = fastValue > midValue && midValue > slowValue;
var bearishAlignment = fastValue < midValue && midValue < slowValue;
var crossedUp = bullishAlignment && (!_hasPrevAlignment || !_wasBullishAlignment);
var crossedDown = bearishAlignment && (!_hasPrevAlignment || _wasBullishAlignment);
if (crossedUp && Position <= 0)
BuyMarket();
else if (crossedDown && Position >= 0)
SellMarket();
if (bullishAlignment || bearishAlignment)
{
_wasBullishAlignment = bullishAlignment;
_hasPrevAlignment = true;
}
}
}
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 ExponentialMovingAverage
from StockSharp.Algo.Strategies import Strategy
class smart_forex_system_strategy(Strategy):
def __init__(self):
super(smart_forex_system_strategy, self).__init__()
self._candle_type = self.Param("CandleType", DataType.TimeFrame(TimeSpan.FromMinutes(60)))
self._fast_period = self.Param("FastPeriod", 10)
self._mid_period = self.Param("MidPeriod", 25)
self._slow_period = self.Param("SlowPeriod", 50)
self._was_bullish_alignment = False
self._has_prev_alignment = False
@property
def CandleType(self):
return self._candle_type.Value
@CandleType.setter
def CandleType(self, value):
self._candle_type.Value = value
@property
def FastPeriod(self):
return self._fast_period.Value
@FastPeriod.setter
def FastPeriod(self, value):
self._fast_period.Value = value
@property
def MidPeriod(self):
return self._mid_period.Value
@MidPeriod.setter
def MidPeriod(self, value):
self._mid_period.Value = value
@property
def SlowPeriod(self):
return self._slow_period.Value
@SlowPeriod.setter
def SlowPeriod(self, value):
self._slow_period.Value = value
def OnReseted(self):
super(smart_forex_system_strategy, self).OnReseted()
self._was_bullish_alignment = False
self._has_prev_alignment = False
def OnStarted2(self, time):
super(smart_forex_system_strategy, self).OnStarted2(time)
self._was_bullish_alignment = False
self._has_prev_alignment = False
fast = ExponentialMovingAverage()
fast.Length = self.FastPeriod
mid = ExponentialMovingAverage()
mid.Length = self.MidPeriod
slow = ExponentialMovingAverage()
slow.Length = self.SlowPeriod
subscription = self.SubscribeCandles(self.CandleType)
subscription.Bind(fast, mid, slow, self._process_candle).Start()
def _process_candle(self, candle, fast_value, mid_value, slow_value):
if candle.State != CandleStates.Finished:
return
fast_val = float(fast_value)
mid_val = float(mid_value)
slow_val = float(slow_value)
bullish_alignment = fast_val > mid_val and mid_val > slow_val
bearish_alignment = fast_val < mid_val and mid_val < slow_val
crossed_up = bullish_alignment and (not self._has_prev_alignment or not self._was_bullish_alignment)
crossed_down = bearish_alignment and (not self._has_prev_alignment or self._was_bullish_alignment)
if crossed_up and self.Position <= 0:
self.BuyMarket()
elif crossed_down and self.Position >= 0:
self.SellMarket()
if bullish_alignment or bearish_alignment:
self._was_bullish_alignment = bullish_alignment
self._has_prev_alignment = True
def CreateClone(self):
return smart_forex_system_strategy()