Parabolic SAR Fibo Limits é uma porta StockSharp do MetaTrader 4 consultor especialista FT_0tk80i9uw4ep_Parabolic. O robô original combina uma pilha dupla Parabolic SAR com níveis de retração Fibonacci para preparar entradas de limite nas principais zonas de pullback. A estratégia C# preserva a colocação de pedidos escalonados, as proteções integradas de ponto de equilíbrio e de trilha e o filtro de sessão de negociação opcional para que o comportamento corresponda à origem EA quando anexado a um gráfico com velas finalizadas.
Lógica estratégica
Preparação de sinal
Alinhamento duplo Parabolic SAR – dois indicadores Parabolic SAR são calculados no mesmo período de tempo. O rápido SAR é usado como um aviso antecipado, enquanto o lento SAR confirma a mudança de estado. Quando o SAR rápido salta acima do preço enquanto o SAR lento permanece abaixo dele, a estratégia arma uma configuração longa em potencial. Quando o SAR rápido cai abaixo do preço enquanto o SAR lento permanece acima dele, uma possível configuração curta é armada. As configurações são apagadas assim que o SAR lento cruza o preço na respectiva direção.
Detecção de oscilação – a estratégia consulta o máximo mais alto e o mínimo mais baixo na janela Bar Search configurável para replicar o auxiliar MaximumMinimum do EA. A vela finalizada anteriormente fornece o extremo oposto (High[1] ou Low[1]) que ancora os cálculos Fibonacci.
Colocação e gerenciamento de pedidos
Fibonacci ordens pendentes – uma vez que ambos os SARs estejam no mesmo lado do preço e uma configuração esteja armada, a estratégia envia uma ordem com limite no nível de 50% Fibonacci (Entry Fibonacci %) da oscilação detectada. O stop de proteção é compensado do extremo da oscilação pelo número configurado de pontos e o take-profit é colocado na projeção Fibonacci estendida (Target Fibonacci %). As ordens só são aceitas quando o preço atual, a parada planejada e o alvo estão a pelo menos cinco etapas de preço um do outro, refletindo o filtro de segurança Point*5 do EA.
Limpeza automática de ordem – sempre que o SAR rápido ultrapassa o preço, a ordem com limite pendente para essa direção é cancelada para evitar entrar na fase errada do mercado. O preenchimento de uma ordem com limite cancela automaticamente a ordem pendente oposta.
Gestão de risco
Parada inicial e meta – os parâmetros de stop-loss e take-profit da ordem pendente do EA são emulados aplicando os níveis de parada e meta calculados assim que a ordem com limite é preenchida.
Mudança de ponto de equilíbrio – se Break Even (points) for maior que zero, o stop se move para o preço de entrada mais um passo de preço (ou menos um passo para posições vendidas) assim que a negociação ganhar o número especificado de pontos, reproduzindo a rotina original do BBU.
Trailing stop – quando Trailing Stop (points) está habilitado, a parada segue o preço na distância escolhida. A parada só é atualizada quando a nova parada melhora a anterior em pelo menos Trailing Step (points), correspondendo ao comportamento TrailingShag do EA.
Gatilhos de saída manuais – se o preço atingir o stop calculado ou os níveis-alvo em uma vela finalizada, a posição é fechada com uma ordem de mercado para simular a execução automática da ordem do MT4.
Filtro de tempo
Controle de sessão opcional – a ativação de Use Time Filter restringe novas entradas à janela inclusiva entre Start Hour e Stop Hour no tempo de troca. A lógica de proteção (ponto de equilíbrio, trailing, saídas) continua a operar mesmo fora da sessão, assim como na implementação MQL.
Parâmetros
Usar filtro de tempo – alterna o filtro da sessão de negociação.
Hora de início / Hora de término – horas de sessão incluídas quando o filtro de horário está ativado.
Fast SAR Step / Fast SAR Max – fator de aceleração e aceleração máxima para o rápido Parabolic SAR.
Lento SAR Passo / Lento SAR Máx – fator de aceleração e aceleração máxima para o lento Parabolic SAR.
Bar Search – número de barras incluídas no cálculo do swing alto/baixo.
Offset (pontos) – número de etapas de preço adicionadas além do extremo da oscilação ao calcular o stop-loss.
Entrada Fibonacci % – Fibonacci porcentagem (expressa como 0–200+) usada para o preço do pedido com limite.
Alvo Fibonacci % – Fibonacci porcentagem aplicada para calcular a projeção de lucro.
Break Even (pontos) – lucro em pontos necessários antes do stop saltar para o preço de entrada (+/- um passo). Defina como 0 para desativar.
Trailing Stop (pontos) – distância entre o preço e o trailing stop. Defina como 0 para desativar o rastreamento.
Trailing Step (pontos) – melhoria mínima (em pontos) antes do trailing stop ser avançado.
Tipo de vela – período de tempo que orienta os cálculos do indicador e da oscilação.
Volume – volume do pedido base herdado da classe StockSharp Strategy (padrão 0.1).
Notas adicionais
Todos os parâmetros baseados em pontos são automaticamente convertidos em compensações de preço usando a etapa de preço do instrumento. Símbolos FX de cinco dígitos, índices e outros ativos, portanto, reutilizam as configurações EA sem escalonamento manual.
A estratégia processa apenas velas finalizadas fornecidas pela assinatura configurada, correspondendo exatamente à execução barra por barra do EA.
Não existe uma versão Python desta estratégia; apenas a implementação C# está disponível no pacote API.
using System;
using StockSharp.Algo.Indicators;
using StockSharp.Algo.Strategies;
using StockSharp.BusinessEntities;
using StockSharp.Messages;
namespace StockSharp.Samples.Strategies;
/// <summary>
/// Parabolic SAR strategy with Fibonacci retracement-based targets.
/// Enters on SAR flip, uses Highest/Lowest range for Fibonacci levels.
/// </summary>
public class ParabolicSarFiboLimitsStrategy : Strategy
{
private readonly StrategyParam<DataType> _candleType;
private readonly StrategyParam<int> _lookback;
private decimal _prevSar;
private bool _hasPrevSar;
private decimal _entryPrice;
public ParabolicSarFiboLimitsStrategy()
{
_candleType = Param(nameof(CandleType), TimeSpan.FromHours(3).TimeFrame())
.SetDisplay("Candle Type", "Timeframe for analysis.", "General");
_lookback = Param(nameof(Lookback), 20)
.SetDisplay("Lookback", "Period for Highest/Lowest range.", "Indicators");
}
public DataType CandleType
{
get => _candleType.Value;
set => _candleType.Value = value;
}
public int Lookback
{
get => _lookback.Value;
set => _lookback.Value = value;
}
/// <inheritdoc />
/// <inheritdoc />
protected override void OnReseted()
{
base.OnReseted();
_prevSar = 0;
_hasPrevSar = false;
_entryPrice = 0;
}
protected override void OnStarted2(DateTime time)
{
base.OnStarted2(time);
_prevSar = 0;
_hasPrevSar = false;
_entryPrice = 0;
var sar = new ParabolicSar();
var highest = new Highest { Length = Lookback };
var lowest = new Lowest { Length = Lookback };
var subscription = SubscribeCandles(CandleType);
subscription
.Bind(sar, highest, lowest, ProcessCandle)
.Start();
var area = CreateChartArea();
if (area != null)
{
DrawCandles(area, subscription);
DrawIndicator(area, sar);
DrawOwnTrades(area);
}
}
private void ProcessCandle(ICandleMessage candle, decimal sarValue, decimal highestValue, decimal lowestValue)
{
if (candle.State != CandleStates.Finished)
return;
var close = candle.ClosePrice;
var range = highestValue - lowestValue;
// SAR flip detection
var sarBelow = sarValue < close;
var prevSarBelow = _hasPrevSar && _prevSar < close;
var sarAbove = sarValue > close;
var prevSarAbove = _hasPrevSar && _prevSar > close;
// Fibonacci levels from the range
var fib382 = lowestValue + range * 0.382m;
var fib618 = lowestValue + range * 0.618m;
// Position management
if (Position > 0)
{
// Exit at 61.8% Fibonacci or SAR flip above
if (close >= fib618 || sarAbove)
{
SellMarket();
}
}
else if (Position < 0)
{
// Exit at 38.2% Fibonacci or SAR flip below
if (close <= fib382 || sarBelow)
{
BuyMarket();
}
}
// Entry on SAR flip with range confirmation
if (Position == 0 && _hasPrevSar && range > 0)
{
if (sarBelow && !prevSarBelow && close > fib382)
{
// SAR flipped below price - bullish
_entryPrice = close;
BuyMarket();
}
else if (sarAbove && !prevSarAbove && close < fib618)
{
// SAR flipped above price - bearish
_entryPrice = close;
SellMarket();
}
}
_prevSar = sarValue;
_hasPrevSar = 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 ParabolicSar, Highest, Lowest
from StockSharp.Algo.Strategies import Strategy
class parabolic_sar_fibo_limits_strategy(Strategy):
def __init__(self):
super(parabolic_sar_fibo_limits_strategy, self).__init__()
self._candle_type = self.Param("CandleType", DataType.TimeFrame(TimeSpan.FromHours(3))).SetDisplay("Candle Type", "Timeframe", "General")
self._lookback = self.Param("Lookback", 20).SetDisplay("Lookback", "Period for Highest/Lowest range", "Indicators")
@property
def CandleType(self): return self._candle_type.Value
@CandleType.setter
def CandleType(self, value): self._candle_type.Value = value
def OnReseted(self):
super(parabolic_sar_fibo_limits_strategy, self).OnReseted()
self._prev_sar = 0
self._has_prev_sar = False
self._entry_price = 0
def OnStarted2(self, time):
super(parabolic_sar_fibo_limits_strategy, self).OnStarted2(time)
self._prev_sar = 0
self._has_prev_sar = False
self._entry_price = 0
sar = ParabolicSar()
highest = Highest()
highest.Length = self._lookback.Value
lowest = Lowest()
lowest.Length = self._lookback.Value
sub = self.SubscribeCandles(self.CandleType)
sub.Bind(sar, highest, lowest, self.OnProcess).Start()
area = self.CreateChartArea()
if area is not None:
self.DrawCandles(area, sub)
self.DrawIndicator(area, sar)
self.DrawOwnTrades(area)
def OnProcess(self, candle, sar_value, highest_value, lowest_value):
if candle.State != CandleStates.Finished:
return
close = candle.ClosePrice
rng = highest_value - lowest_value
sar_below = sar_value < close
prev_sar_below = self._has_prev_sar and self._prev_sar < close
sar_above = sar_value > close
prev_sar_above = self._has_prev_sar and self._prev_sar > close
fib382 = lowest_value + rng * 0.382
fib618 = lowest_value + rng * 0.618
if self.Position > 0:
if close >= fib618 or sar_above:
self.SellMarket()
elif self.Position < 0:
if close <= fib382 or sar_below:
self.BuyMarket()
if self.Position == 0 and self._has_prev_sar and rng > 0:
if sar_below and not prev_sar_below and close > fib382:
self._entry_price = close
self.BuyMarket()
elif sar_above and not prev_sar_above and close < fib618:
self._entry_price = close
self.SellMarket()
self._prev_sar = sar_value
self._has_prev_sar = True
def CreateClone(self):
return parabolic_sar_fibo_limits_strategy()