Indicador con IA

Foro dedicado a esta excelente herramienta de desarrollo e implementación de sistemas de trading
Responder
Avatar de Usuario
corman
Mensajes: 73
Registrado: 05 Feb 2006 22:50
Ubicación: Valencia

Indicador con IA

Mensaje por corman »

Hola a todos, je pe pedido a una IA que me genere el indicador Subasta Inacabada y me lo ha facilitado pero no puedo implementarlo por no tener licencia de Ninjatrader, dice que tengo que tener velas volumétricas, os lo cuelgo por si alguien lo puede probar a ver que tal.

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
	}
}


Concédeme la serenidad para aceptar las cosas que no puedo cambiar, el coraje para cambiar las cosas que puedo y la sabiduría para saber cual es la diferencia.
Avatar de Usuario
cls
Mensajes: 1344
Registrado: 24 May 2007 18:46
Contactar:

Re: Indicador con IA

Mensaje por cls »

Hola corman,
ese código no compila. El tipo NinjaTrader.Data.VolumetricBar no existe y a partir de ahí todo es ya una invención de la IA.
Y funcionalmente tampoco está bien resuelto, porque aunque detecta que se haya negociado en el bid y en el ask en los extremos de las barras, que es la condición teórica para el unfinished auction, no diferencia entre barras alcistas y bajistas. En barras alcistas el unfinished auction debe aparecer en el Low y en las bajistas en el High.
Responder

Volver a “Ninja Trader”