using NinjaTrader.NinjaScript;
using NinjaTrader.Data;
using NinjaTrader.Gui.Tools;
using System.ComponentModel;
using System.Windows.Media;
#endregion
namespace NinjaTrader.NinjaScript.Indicators
{
public class StopSignal : Indicator
{
// Variável para plotar agressão
private double stopSignal = double.NaN; // Inicializa como NaN para garantir que comece vazio
private double lastStopSignal = double.NaN; // Armazena o último sinal de stop
// Limite de agressão (acima de 1000)
private double aggressionThreshold = 1000;
// Período de cálculo (ajustável)
private int lookbackPeriod = 50;
protected override void OnStateChange()
{
if (State == State.SetDefaults)
{
Description = @"Indicador de Stop baseado em agressão maior que 1000";
Name = "StopSignal";
Calculate = Calculate.OnEachTick;
IsOverlay = true; // Exibe no gráfico principal
AddPlot(Brushes.Red, "StopSignal"); // Plot de agressão (Stop)
}
}
protected override void OnBarUpdate()
{
if (CurrentBar < lookbackPeriod) return;
// Cálculo de volume e agressão
double totalVolume = 0;
stopSignal = double.NaN; // Resetar a variável a cada barra
double[] priceVolumes = new double[lookbackPeriod];
// Iteração sobre o período de lookback para calcular os volumes
for (int i = 0; i < lookbackPeriod; i++)
{
double barVolume = Volume[i];
totalVolume += barVolume;
// Se o volume da barra exceder o limite de agressão
if (barVolume > aggressionThreshold)
{
stopSignal = Close[i]; // Define o preço atual como nível de stop
break; // Saímos do loop após encontrar o primeiro sinal de agressão
}
}
// Se um novo sinal de stop for identificado, atualize o último sinal
if (!double.IsNaN(stopSignal))
{
lastStopSignal = stopSignal; // Armazena o último sinal de stop
}
else
{
stopSignal = lastStopSignal; // Mantém o último sinal caso não haja um novo
}
// Plotar o StopSignal baseado na agressão
Values[0][0] = stopSignal;
Print("Sinal de Stop: " + stopSignal); // Debug para verificar
}
}
}
region NinjaScript generated code. Neither change nor remove.
namespace NinjaTrader.NinjaScript.Indicators
{
public partial class Indicator : NinjaTrader.Gui.NinjaScript.IndicatorRenderBase
{
private StopSignal[] cacheStopSignal;
public StopSignal StopSignal()
{
return StopSignal(Input);
}
public StopSignal StopSignal(ISeries<double> input)
{
if (cacheStopSignal != null)
for (int idx = 0; idx < cacheStopSignal.Length; idx++)
if (cacheStopSignal[idx] != null && cacheStopSignal[idx].EqualsInput(input))
return cacheStopSignal[idx];
return CacheIndicator<StopSignal>(new StopSignal(), input, ref cacheStopSignal);
}
}
}
namespace NinjaTrader.NinjaScript.MarketAnalyzerColumns
{
public partial class MarketAnalyzerColumn : MarketAnalyzerColumnBase
{
public Indicators.StopSignal StopSignal()
{
return indicator.StopSignal(Input);
}
public Indicators.StopSignal StopSignal(ISeries<double> input )
{
return indicator.StopSignal(input);
}
}
}
namespace NinjaTrader.NinjaScript.Strategies
{
public partial class Strategy : NinjaTrader.Gui.NinjaScript.StrategyRenderBase
{
public Indicators.StopSignal StopSignal()
{
return indicator.StopSignal(Input);
}
public Indicators.StopSignal StopSignal(ISeries<double> input )
{
return indicator.StopSignal(input);
}
}
}
#endregion
