Gracias
Código: Seleccionar todo
// UnfinishedAuctionMarker.cs
//
// Copyright (C) 2024. Manus AI. All rights reserved.
// -----------------------------------------------------------------
// Este indicador está diseñado para NinjaTrader 8.
// Identifica y marca las "Subastas Inacabadas" en los extremos de las barras.
// Una subasta inacabada se define como una situación en la que tanto el volumen de compra (Ask) como el de venta (Bid)
// son mayores que cero en el precio máximo (High) o mínimo (Low) de una barra.
// Este indicador requiere el uso de Barras Volumétricas (Volumetric Bars) y acceso a datos de Order Flow.
// -----------------------------------------------------------------
#region Using declarations
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Input;
using System.Windows.Media;
using System.Xml.Serialization;
using NinjaTrader.Gui;
using NinjaTrader.Gui.Chart;
using NinjaTrader.Gui.SuperDom;
using NinjaTrader.Gui.Tools;
using NinjaTrader.Data;
using NinjaTrader.NinjaScript;
using NinjaTrader.Core.FloatingPoint;
using NinjaTrader.NinjaScript.DrawingTools;
#endregion
//Este namespace es el espacio de nombres predeterminado del indicador personalizado
namespace NinjaTrader.NinjaScript.Indicators.Manus
{
public class UnfinishedAuctionMarker : Indicator
{
private Brush highUnfinishedAuctionBrush = Brushes.Red;
private Brush lowUnfinishedAuctionBrush = Brushes.Green;
private int markerSize = 3;
protected override void OnStateChange()
{
if (State == State.SetDefaults)
{
Description = @"Marca Subastas Inacabadas en los extremos de las barras (requiere Barras Volumétricas).";
Name = "Manus Unfinished Auction Marker";
Calculate = Calculate.OnEachTick;
IsOverlay = true;
DisplayInDataBox = false;
DrawOnPricePanel = true;
DrawHorizontalGridLines = true;
DrawVerticalGridLines = true;
PaintPriceMarkers = true;
ScaleJustification = NinjaTrader.Gui.Chart.ScaleJustification.Right;
//Deshabilita esto si no quieres que el indicador espere a que cierre la barra para calcularse.
IsSuspendedWhileInactive = true;
HighUnfinishedAuctionColor = Brushes.Red;
LowUnfinishedAuctionColor = Brushes.LimeGreen;
MarkerSize = 3;
}
else if (State == State.Configure)
{
// Asegurarse de que se están usando Barras Volumétricas
if (Bars.BarsPeriod.BarsPeriodType != BarsPeriodType.Volumetric)
{
Draw.TextFixed(this, "VolumetricWarning", "Este indicador requiere Barras Volumétricas.", TextPosition.BottomLeft, Brushes.Red, new Gui.Tools.SimpleFont("Arial", 12), Brushes.Transparent, Brushes.Transparent, 0);
}
}
}
protected override void OnBarUpdate()
{
// Solo procesar si hay suficientes barras y se usan barras volumétricas
if (CurrentBar < 1 || Bars.BarsPeriod.BarsPeriodType != BarsPeriodType.Volumetric)
return;
try
{
// Obtener la barra volumétrica actual
NinjaTrader.Data.VolumetricBar volumetricBar = Bars.GetVolumetricBar(0);
if (volumetricBar == null)
return;
// Verificar subasta inacabada en el High de la barra
long askVolumeAtHigh = volumetricBar.GetAskVolumeForPrice(High[0]);
long bidVolumeAtHigh = volumetricBar.GetBidVolumeForPrice(High[0]);
if (askVolumeAtHigh > 0 && bidVolumeAtHigh > 0)
{
Draw.Dot(this, "HighUA_" + CurrentBar, false, 0, High[0] + TickSize, HighUnfinishedAuctionColor);
}
// Verificar subasta inacabada en el Low de la barra
long askVolumeAtLow = volumetricBar.GetAskVolumeForPrice(Low[0]);
long bidVolumeAtLow = volumetricBar.GetBidVolumeForPrice(Low[0]);
if (askVolumeAtLow > 0 && bidVolumeAtLow > 0)
{
Draw.Dot(this, "LowUA_" + CurrentBar, false, 0, Low[0] - TickSize, LowUnfinishedAuctionColor);
}
}
catch (Exception e)
{
Print("Error en UnfinishedAuctionMarker: " + e.Message);
}
}
#region Properties
[NinjaScriptProperty]
[XmlIgnore]
[Display(Name="Color Subasta Inacabada (High)", Order=1, GroupName="Parámetros Visuales")]
public Brush HighUnfinishedAuctionColor
{
get { return highUnfinishedAuctionBrush; }
set { highUnfinishedAuctionBrush = value; }
}
[Browsable(false)]
public string HighUnfinishedAuctionColorSerializable
{
get { return Serialize.BrushToString(HighUnfinishedAuctionColor); }
set { HighUnfinishedAuctionColor = Serialize.StringToBrush(value); }
}
[NinjaScriptProperty]
[XmlIgnore]
[Display(Name="Color Subasta Inacabada (Low)", Order=2, GroupName="Parámetros Visuales")]
public Brush LowUnfinishedAuctionColor
{
get { return lowUnfinishedAuctionBrush; }
set { lowUnfinishedAuctionBrush = value; }
}
[Browsable(false)]
public string LowUnfinishedAuctionColorSerializable
{
get { return Serialize.BrushToString(LowUnfinishedAuctionColor); }
set { LowUnfinishedAuctionColor = Serialize.StringToBrush(value); }
}
[NinjaScriptProperty]
[Range(1, int.MaxValue)]
[Display(Name="Tamaño del Marcador", Order=3, GroupName="Parámetros Visuales")]
public int MarkerSize
{
get { return markerSize; }
set { markerSize = Math.Max(1, value); }
}
#endregion
}
}