A estratégia ValidateMe transporta a estrutura de validação básica do consultor especialista MQL4 original. A lógica centra-se na verificação da disponibilidade de fundos, verificando se as distâncias stop-loss e take-profit respeitam as restrições cambiais e, em seguida, disparando uma ordem de mercado única na direção escolhida. A estratégia monitoriza continuamente os eventos de execução de negociações e abre uma nova posição apenas quando não existem posições ou ordens ativas.
Lógica de negociação
A estratégia assina os dados de tick da segurança configurada.
Quando a estratégia está online, formada e a negociação é permitida, ela verifica se nenhuma posição aberta e nenhuma ordem ativa está presente.
Em seguida, envia uma ordem de mercado na direção configurada (compra ou venda) usando o tamanho de lote definido.
Um módulo de proteção anexa imediatamente ordens de take-profit e stop-loss calculadas a partir de distâncias de pip, garantindo a conformidade com os níveis de stop da corretora (ajustados para preços fracionários).
Assim que a posição for fechada, a estratégia aguarda o próximo tick e repete a validação antes de enviar uma nova ordem.
Parâmetros
Parâmetro
Descrição
Take Profit (pips)
Distância do preço de entrada ao take-profit em pips. Deve ser maior que zero.
Stop Loss (pips)
Distância do preço de entrada ao stop loss em pips. Deve ser maior que zero.
Muitos
Volume de negociação em lotes utilizados para cada ordem de mercado.
Direção
Direção da ordem de mercado (Compra ou Venda).
Gestão de risco
A estratégia usa StartProtection com compensações absolutas para registrar ordens de take-profit e stop-loss.
O tamanho do pip é calculado a partir da etapa do preço do título e da precisão decimal para imitar o comportamento MetaTrader (símbolos de 5 e 3 dígitos usam um tamanho de ponto dez vezes maior).
A estratégia dispara novos pedidos somente se nenhum pedido existente estiver ativo, evitando o empilhamento de pedidos.
Notas de uso
Anexe a estratégia a um título e defina o volume e a direção desejados.
Configure as distâncias de take-profit e stop-loss em pips de acordo com os requisitos da corretora.
A estratégia não se baseia em indicadores e pretende ser um quadro de validação e não um sistema comercial completo.
O controle de risco do portfólio (por exemplo, redução máxima) pode ser combinado externamente, se necessário.
namespace StockSharp.Samples.Strategies;
using System;
using Ecng.Common;
using StockSharp.Algo.Indicators;
using StockSharp.Algo.Strategies;
using StockSharp.Messages;
/// <summary>
/// ValidateMe strategy: RSI crossover at oversold/overbought levels.
/// Buys when RSI crosses above 30, sells when RSI crosses below 70.
/// </summary>
public class ValidateMeStrategy : Strategy
{
private readonly StrategyParam<DataType> _candleType;
private readonly StrategyParam<int> _period;
private decimal _prevRsi;
private bool _hasPrev;
public DataType CandleType { get => _candleType.Value; set => _candleType.Value = value; }
public int Period { get => _period.Value; set => _period.Value = value; }
public ValidateMeStrategy()
{
_candleType = Param(nameof(CandleType), TimeSpan.FromMinutes(5).TimeFrame())
.SetDisplay("Candle Type", "Candle timeframe", "General");
_period = Param(nameof(Period), 14)
.SetGreaterThanZero()
.SetDisplay("Period", "RSI period", "Indicators");
}
/// <inheritdoc />
protected override void OnReseted()
{
base.OnReseted();
_prevRsi = 0;
_hasPrev = false;
}
/// <inheritdoc />
protected override void OnStarted2(DateTime time)
{
base.OnStarted2(time);
_hasPrev = false;
var rsi = new RelativeStrengthIndex { Length = Period };
var subscription = SubscribeCandles(CandleType);
subscription.Bind(rsi, ProcessCandle).Start();
}
private void ProcessCandle(ICandleMessage candle, decimal rsiValue)
{
if (candle.State != CandleStates.Finished) return;
if (_hasPrev)
{
if (_prevRsi < 30 && rsiValue >= 30 && Position <= 0)
BuyMarket();
else if (_prevRsi > 70 && rsiValue <= 70 && Position >= 0)
SellMarket();
}
_prevRsi = rsiValue;
_hasPrev = 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 RelativeStrengthIndex
from StockSharp.Algo.Strategies import Strategy
class validate_me_strategy(Strategy):
def __init__(self):
super(validate_me_strategy, self).__init__()
self._candle_type = self.Param("CandleType", DataType.TimeFrame(TimeSpan.FromMinutes(5)))
self._period = self.Param("Period", 14)
self._prev_rsi = 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 Period(self):
return self._period.Value
@Period.setter
def Period(self, value):
self._period.Value = value
def OnReseted(self):
super(validate_me_strategy, self).OnReseted()
self._prev_rsi = 0.0
self._has_prev = False
def OnStarted2(self, time):
super(validate_me_strategy, self).OnStarted2(time)
self._has_prev = False
rsi = RelativeStrengthIndex()
rsi.Length = self.Period
subscription = self.SubscribeCandles(self.CandleType)
subscription.Bind(rsi, self._process_candle).Start()
def _process_candle(self, candle, rsi_value):
if candle.State != CandleStates.Finished:
return
rsi_val = float(rsi_value)
if self._has_prev:
if self._prev_rsi < 30 and rsi_val >= 30 and self.Position <= 0:
self.BuyMarket()
elif self._prev_rsi > 70 and rsi_val <= 70 and self.Position >= 0:
self.SellMarket()
self._prev_rsi = rsi_val
self._has_prev = True
def CreateClone(self):
return validate_me_strategy()