[ Foro de C# ]

Duda en el manejo de variables

24-Feb-2015 09:57
Invitado (Jesús)
3 Respuestas

Estoy bloqueado. Quiero programar lo siguiente:
Entre un grupo de personas, quiero seleccionar sólo la persona que mida más de 1,80 y si hay más de 2 personas que cumplan esa condición, la que sea de mayor edad.


24-Feb-2015 10:27
Nacho Cabanes (+83)

Pon tu código con lo que has intentado, para ver qué te piden y cómo lo estás orientando. En principio, suena fácil, pero hay muchos detalles ambiguos:

Para comprobar si un valor es mayor que otro, usarás, un "if", que doy por sentado que conoces:

http://www.aprendeaprogramar.com/mod/resource/view.php?id=692

Una edad con decimales suena a un número real (float), aunque también se podría hacer con un entero o con un byte si lo expresas en centímetros:

http://www.aprendeaprogramar.com/mod/resource/view.php?id=720

Si de cada persona vas a tener estatura y edad, quizá quieran que uses un "struct":

http://www.aprendeaprogramar.com/mod/resource/view.php?id=727

O quizá una clase

http://www.aprendeaprogramar.com/mod/resource/view.php?id=743

La lógica de buscar el mayor dato es sencilla:

http://www.aprendeaprogramar.com/mod/resource/view.php?id=725

aunque también puedes ordenar los datos, y así el comprobar los dos primeros será inmediato:

http://www.aprendeaprogramar.com/mod/resource/view.php?id=732

Como ves, hay muchos pequeños detalles que cuidar. Sin conocer lo que sabes ni lo que has intentado, es difícil afinar más.


24-Feb-2015 17:51
Carlos-Jesús Urdiales

Hola Nacho:

Gracias por tu rápida respuesta.
Pensé que con el ejemplo sería suficiente. Es un ejemplo ficticio porque el ejemplo real pienso que es más complejo de explicar, pero de todos modos ahí voy?
Lo que quiero y no consigo es que despues de filtrar una barra que su volumen sea mayor de 25000, marque con una línea el máximo y el mínimo de esa barra que realmente tiene 26345 (mayor que 25000) ,  (VSUA significa que es mayor de 25000) y a medida de que salga otra con un valor mayor de 25000, compruebe a su vez si su volumen es mayor que la de 26345, es decir, si la nueva barra de volumen mayor de 25000 es de 28875, que desmarque la anterior de 26345 y me marque la nueva, pero si es de 25675 que no desmarque la de 26345 puesto que esta nueva sería menor que la de 28875. No sé si he acertado a explicarme. Te paso la parte relacionada con todo lo anterior. Me he bloqueado. Tengo muy poca experiencia en programar, pero me gusta muchísimo y poco a poco quiero ir aprendiendo. Muchas gracias.  


#region Using declarations
using System;
using System.Collections;
using System.ComponentModel;
using System.Collections.Generic;
using System.Diagnostics;
using System.Drawing;
using System.Text;
using System.Drawing.Drawing2D;
using System.Xml.Serialization;
using NinjaTrader.Cbi;
using NinjaTrader.Data;
using NinjaTrader.Indicator;
using NinjaTrader.Gui.Chart;
using NinjaTrader.Strategy;
using NinjaTrader.Gui.Design;
#endregion
namespace NinjaTrader.Strategy
{

public class CJNombreVelas : Strategy
{
#region Variables
private double VolACC = 0; 
private double PrecioMaxAcc;
private double PrecioMinAcc;
private double VolumenBR;
private double VolumenP;
private string ClasificacionVolumenBR;
private int BarraReferencia = 1;
#endregion
???
#region ClasificacionVolumen	
VolumenBR = VOL(Closes[0])[BarraReferencia];	
			
If (VolumenBR > (VolumenP)
				{
				ClasificacionVolumenBR = "VSUA";
		}


#endregion
protected override void OnBarUpdate()
{

#region AccionClimatica
		if (ClasificacionVolumenBR == "VSUA")
			{
				if (VolumenBR > VolACC);
				{
					VolACC = VolumenBR;
					PrecioMaxAcc = Highs[0][BarraReferencia];
					PrecioMinAcc = Lows[0][BarraReferencia];
					DrawHorizontalLine("PrecioMáximoACC", false, PrecioMaxAcc, Color.Cyan,DashStyle.Solid,3);
					PlaySound(@"C:\Alert4.wav");
					DrawHorizontalLine("PrecioMinimoACC", false, PrecioMinAcc, Color.Cyan,DashStyle.Solid,3);					
				}
			}
#endregion
}


}
}


Para que te hagas una idea las barras con asterisco con las que pasan de 25000, pero sólo una es mayor que las demás porque su valor ?por ejemplo es de 26345 y esa es precisamente la que está señalada por su techo y suelo, y si saliese otra con mayor volumen es decir con 28998 sería esta la que habría que señalar por su máximo y mínimo.
Observación: No puedo pegar un gráfico para que veas lo que quiero decir.

Un saludo y muchas gracias.


27-Feb-2015 23:40
Nacho Cabanes (+83)

Sí que suena un tanto rebuscado lo que estás haciendo...

En cualquier caso, parece ser básicamente un problema de ordenación: si tus datos están en un array (como parece quedar claro en tu fuente), puedes hacer una copia en otro array (para no modificar los datos originales) y ordenarlos de mayor a menor, para tomar el primero y el segundo (o los dos primeros, y entonces comparar un segundo campo). Si no sabes ordenar, mira el enlace que te he puesto arriba.

Hay alternativas más eficientes, pero que quizá te queden un poco grandes si estás empezando: el máximo de una lista de datos se puede saber en una sola pasada, y en esa misma pasada podrías saber si el máximo es único o si se repite (nuevamente, mira el enlace si no sabes cómo buscar el máximo). En caso de que se repita, podrías hacer una segunda pasada para volver a otra lista de datos todos aquellos que coincidan con el máximo, y así hacer una nueva comprobación adicional del tipo que necesites, pero con menos datos.

Para asegurarte de que entiendes las ideas, yo te aconsejaría por un momento olvidarte de las barras y hacer un programa de consola que te extraiga los datos numéricos. Si un programa de consola funciona correctamente, te será fácil aplicarlo a los gráficos, pero si no consigues hacer funcionar un esqueleto simple, menos aún en un programa completo.






(No se puede continuar esta discusión porque tiene más de dos meses de antigüedad. Si tienes dudas parecidas, abre un nuevo hilo.)