usando NinjaTrader.NinjaScript;
usando NinjaTrader.Data;
usando NinjaTrader.Gui.Tools;
usando System.ComponentModel;
usando 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";
Nome = "StopSignal";
Calcular = Calcular.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];
volumetotal += volume_da_barra;
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
}
}
}
#região Código gerado pelo NinjaScript. Nem alterar nem remover.
namespace NinjaTrader.NinjaScript.Indicators
{
classe parcial pública Indicador: NinjaTrader.Gui.NinjaScript.IndicatorRenderBase
{
privado 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(), entrada, ref cacheStopSignal);
}
}
}namespace
NinjaTrader.NinjaScript.MarketAnalyzerColumns
{
classe parcial pública MarketAnalyzerColumn: MarketAnalyzerColumnBase
{
public Indicators.StopSignal StopSignal()
{
indicador de retorno. StopSignal(Entrada);
}
public Indicators.StopSignal StopSignal(ISeries<double> input )
{
indicador de retorno. StopSignal(entrada);
}
}
}
namespace NinjaTrader.NinjaScript.Strategies
{
classe parcial pública Estratégia: NinjaTrader.Gui.NinjaScript.StrategyRenderBase
{
public Indicators.StopSignal StopSignal()
{
indicador de retorno. StopSignal(Entrada);
}
public Indicators.StopSignal StopSignal(ISeries<double> input )
{
indicador de retorno. StopSignal(entrada);
}
}
}#endregion

Comment