A Estratégia ExpICustomV1 é uma versão StockSharp do MetaTrader especialista exp_iCustom_v1. A estratégia lê sinais comerciais de uma instância de indicador configurável e reage a valores diferentes de zero nos buffers selecionados. Quando o buffer de compra é diferente de zero, a estratégia abre uma posição longa, enquanto o buffer de venda desencadeia uma entrada curta. A lógica protetora de stop-loss, take-profit, trailing e ponto de equilíbrio reproduz as opções de gerenciamento de dinheiro do especialista original.
Observação: Somente a implementação C# é fornecida. Uma versão Python ainda não está disponível.
Lógica de negociação
Assine o período primário especificado por Tipo de vela e processe apenas velas fechadas.
Instancie o indicador definido por Indicator Name e aplique os Indicator Parameters separados por barras (suporta pares Name=Value e valores numéricos ordenados).
Armazene as saídas finais do indicador em um buffer de histórico para que qualquer mudança possa ser acessada em velas posteriores.
Quando o valor do buffer de compra em Indicator Shift não é zero, a estratégia abre/mantém uma posição longa. Quando o buffer de venda é diferente de zero, a estratégia abre/mantém uma posição curta.
Se ambos os buffers retornarem valores diferentes de zero simultaneamente, os sinais se cancelarão para evitar entradas ambíguas.
Opcional Close On Reverse sai da posição atual antes de reagir ao sinal oposto.
A lógica de suspensão impõe um número mínimo de barras entre entradas consecutivas na mesma direção. O temporizador pode ser cancelado quando o sinal oposto dispara se Cancelar sono estiver ativado.
As posições são protegidas por stop-loss, take-profit, trailing stop opcional e bloqueio de ponto de equilíbrio. Todas as distâncias são expressas em faixas de preço.
Configuração do indicador
Nome do indicador – Nome completo do tipo ou nome abreviado do indicador StockSharp (por exemplo SMA, MACD, BollingerBands).
Parâmetros do Indicador – Lista separada por barras aplicada ao indicador. Tanto Length=14/Width=2 quanto valores ordenados como 14/2/0.7 são suportados.
Blocos de substituição – Até cinco substituições permitem ajustar os valores dos parâmetros por índice durante a otimização, semelhante às entradas Opt_X no especialista original. Os índices são baseados em zero.
Gestão de risco e dinheiro
Volume Base – Valor enviado com cada ordem de mercado.
Stop Loss / Take Profit – Distâncias absolutas em pontos do preço de entrada.
Trailing Stop – Ativa após o lucro especificado e mantém a distância configurada do preço extremo.
Break Even – Move o stop em direção ao preço de entrada após o lucro especificado e, opcionalmente, bloqueia pontos adicionais.
Referência de parâmetro
Parâmetro
Descrição
Tipo de vela
Prazo utilizado para avaliação do indicador e sinal.
Nome do indicador
Digite o nome da instância do indicador.
Parâmetros do Indicador
Lista de parâmetros do indicador separada por barras.
Comprar buffer / vender buffer
Índices de buffer que contêm os marcadores de compra/venda.
Mudança de indicador
Mudança histórica aplicada na leitura dos buffers do indicador.
Substituir blocos
Substitua posições de parâmetros específicos durante o tempo de execução.
Barras de dormir
Barras mínimas entre entradas na mesma direção.
Cancelar dormir
Reinicie o temporizador após um sinal oposto.
Fechar no sentido inverso
Fechar a posição existente quando o sinal oposto aparecer.
Máximo de pedidos / Máximo de compra / Máximo de venda
Soft caps que limitam o número de posições simultâneas.
Stop Loss / Take Profit
Distância em pontos para ordens de proteção.
Configurações de Trailing Stop
Parâmetros que controlam a ativação e a distância do trailing stop.
Configurações de ponto de equilíbrio
Parâmetros que controlam a ativação do ponto de equilíbrio e a distância de bloqueio.
Volume básico
Volume de cada entrada no mercado.
Uso
Adicione a estratégia ao seu contêiner de estratégia e defina Segurança e Portfólio.
Configure Nome do indicador e Parâmetros do indicador para corresponder ao indicador personalizado de destino.
Ajuste as configurações de risco (stop, take, trailing, break even) e o volume base do pedido.
Execute a estratégia. Ele assinará o prazo escolhido, avaliará os buffers do indicador e enviará ordens de mercado quando as condições forem atendidas.
Limitações
O indicador deve estar disponível como um tipo de indicador StockSharp. Os indicadores binários MetaTrader não podem ser carregados diretamente.
Os modos de gestão de dinheiro que dependem da margem livre do corretor são simplificados para um volume base fixo.
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>
/// ExpICustomV1 - custom indicator signal strategy.
/// Uses fast/slow EMA crossover to generate entry/exit signals.
/// Reverses position on opposite crossover.
/// </summary>
public class ExpICustomV1Strategy : Strategy
{
private readonly StrategyParam<int> _fastPeriod;
private readonly StrategyParam<int> _slowPeriod;
private readonly StrategyParam<DataType> _candleType;
private decimal _prevFast;
private decimal _prevSlow;
private bool _hasPrev;
public int FastPeriod { get => _fastPeriod.Value; set => _fastPeriod.Value = value; }
public int SlowPeriod { get => _slowPeriod.Value; set => _slowPeriod.Value = value; }
public DataType CandleType { get => _candleType.Value; set => _candleType.Value = value; }
public ExpICustomV1Strategy()
{
_fastPeriod = Param(nameof(FastPeriod), 10)
.SetDisplay("Fast EMA", "Fast EMA period", "Indicators");
_slowPeriod = Param(nameof(SlowPeriod), 21)
.SetDisplay("Slow EMA", "Slow EMA period", "Indicators");
_candleType = Param(nameof(CandleType), TimeSpan.FromHours(4).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();
_prevFast = 0m;
_prevSlow = 0m;
_hasPrev = false;
}
protected override void OnStarted2(DateTime time)
{
base.OnStarted2(time);
_hasPrev = false;
var fast = new ExponentialMovingAverage { Length = FastPeriod };
var slow = new ExponentialMovingAverage { Length = SlowPeriod };
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)
{
_prevFast = fast;
_prevSlow = slow;
_hasPrev = true;
return;
}
var bullCross = _prevFast <= _prevSlow && fast > slow;
var bearCross = _prevFast >= _prevSlow && fast < slow;
if (bullCross && Position <= 0)
{
if (Position < 0)
BuyMarket();
BuyMarket();
}
else if (bearCross && Position >= 0)
{
if (Position > 0)
SellMarket();
SellMarket();
}
_prevFast = fast;
_prevSlow = slow;
}
}
import clr
clr.AddReference("StockSharp.Messages")
clr.AddReference("StockSharp.Algo")
clr.AddReference("StockSharp.Algo.Indicators")
clr.AddReference("StockSharp.Algo.Strategies")
from System import TimeSpan, Math
from StockSharp.Messages import DataType, CandleStates
from StockSharp.Algo.Indicators import ExponentialMovingAverage
from StockSharp.Algo.Strategies import Strategy
class exp_i_custom_v1_strategy(Strategy):
"""Fast/slow EMA crossover strategy. Reverses position on opposite crossover."""
def __init__(self):
super(exp_i_custom_v1_strategy, self).__init__()
self._fast_period = self.Param("FastPeriod", 10) \
.SetDisplay("Fast EMA", "Fast EMA period", "Indicators")
self._slow_period = self.Param("SlowPeriod", 21) \
.SetDisplay("Slow EMA", "Slow EMA period", "Indicators")
self._candle_type = self.Param("CandleType", DataType.TimeFrame(TimeSpan.FromHours(4))) \
.SetDisplay("Candle Type", "Candle timeframe", "General")
self._prev_fast = 0.0
self._prev_slow = 0.0
self._has_prev = 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
@property
def SlowPeriod(self):
return self._slow_period.Value
def OnReseted(self):
super(exp_i_custom_v1_strategy, self).OnReseted()
self._prev_fast = 0.0
self._prev_slow = 0.0
self._has_prev = False
def OnStarted2(self, time):
super(exp_i_custom_v1_strategy, self).OnStarted2(time)
self._has_prev = False
fast = ExponentialMovingAverage()
fast.Length = self.FastPeriod
slow = ExponentialMovingAverage()
slow.Length = self.SlowPeriod
subscription = self.SubscribeCandles(self.CandleType)
subscription.Bind(fast, slow, self._process_candle).Start()
def _process_candle(self, candle, fast, slow):
if candle.State != CandleStates.Finished:
return
fast_val = float(fast)
slow_val = float(slow)
if not self._has_prev:
self._prev_fast = fast_val
self._prev_slow = slow_val
self._has_prev = True
return
bull_cross = self._prev_fast <= self._prev_slow and fast_val > slow_val
bear_cross = self._prev_fast >= self._prev_slow and fast_val < slow_val
if bull_cross and self.Position <= 0:
if self.Position < 0:
self.BuyMarket()
self.BuyMarket()
elif bear_cross and self.Position >= 0:
if self.Position > 0:
self.SellMarket()
self.SellMarket()
self._prev_fast = fast_val
self._prev_slow = slow_val
def CreateClone(self):
return exp_i_custom_v1_strategy()