Ticks, Volumen y Precio

Foro genérico sobre programas relacionados con el trading: gráficos, ejecución de órdenes, automatización, etc.
Avatar de Usuario
bolsa1
Mensajes: 1347
Registrado: 13 May 2008 09:53
Ubicación: Gallaecia

Mensaje por bolsa1 »

Estoy trasteando un poco con tu trabajo (increíble, por cierto, menudo fenómeno para ingeniar todo este tinglado) y tengo varias dudas...

Si quisiera referirme al mini-Dow actual (YM 12-08), ¿lo declararía así?:

Código: Seleccionar todo

DateTime _expiry = new DateTime( 2008, 10, 12, 0, 0, 0, 0, DateTimeKind.Local );
				NinjaTrader.Cbi.Instrument _instrument = NinjaTrader.Cbi.Instrument.GetObject( "YM", InstrumentType.Future, Exchange.Default, _expiry, 0, Right.Unknown );
(Le he puesto el 10 de Diciembre de expiración, para que me corrijas el orden)

Y otra cuestión... ¿Exactamente cual es la salida esperada por "Barras" y el contador "i"? No entiendo muy bien la función del recorrido.

Y gracias por compartir tu trabajo!
"Mercaderes e industriales no deben ser admitidos a la ciudadanía; porque su género de vida es abyecto y contrario a la virtud."

Aristóteles.
Avatar de Usuario
cls
Mensajes: 1336
Registrado: 24 May 2007 18:46
Contactar:

Mensaje por cls »

polxx escribió:Todo eso en visual chart es mas facil, creo. Tanto en indicadores como sistemas, tiempo real o bakctesting, al crear un indicador o sistema con plataforma visual, en el campo SERIES, se incluye el valor que queramos en ticks.

Yo lo que tengo en mente es algo diferente.
Se ponen graficos de 1 minuto, que son los que me gustan a mi.
Y sobre ese grafico, se añade abajo un indicador que analice los graficos de 1 tick y que tenga en cuenta lo siguiente:
De las ultimas 10.000 barras de 1 tics, por ejemplo, que porcentaje de barras ha tenido un volumen mayor a 50 contratos.

Por ejemplo si hay 200 barras de tic con volumen superior a 50 contratos y 9800 con volumen menor, tenemos que el 2% de las operaciones realizadas corresponde a manos fuertes. Y digo 2% de operaciones, no 2% de volumen negociado, que seria otra cosa.

Con eso podemos saber la presencia o ausencia de manos fuertes, luego ya habria que ver el indicador con graficos de 1 minuto y ver si se puede deducir algo o no.
Bueno no sé cómo se volcará en VC, pero en el ninja te queda un array con una fila por cada tick. Cada fila es una estructura con dos campos: precio y volumen.
(Si quieres también puedes meterle más campos como el día y la hora. Todo esto programando claro, no hay ningún wizard).

Y ya es hacer un barrido por el array y extraer la información que quieras: mediana, percentiles, moda, etc.

En el caso que dices, 10.000 sería el número de filas del array. Haces un barrido y vas contando cuántas filas tienen un volumen mayor o igual que 50.
Y ya tienes el porcentaje de operaciones fuertes en el intervalo en que hayas barrido.

Incluso ese 50 podrías dejar que lo calculara el programa, como n veces la desviación típica de los volúmenes de los 10.000 registros, o como el percentil 90 de todas las observaciones, etc.

S2

PD: Entonces, es posible en VC en un chart de minutos acceder por programación a su serie de ticks ???
(no me refiero a la pdv sino a codificarlo a pelo)
Avatar de Usuario
polxx
Mensajes: 847
Registrado: 09 Dic 2005 10:25
Ubicación: Albacete

Mensaje por polxx »

Yo se hacerlo en plataforma visual, pero en VBA logicamente tambien puede hacerse, pero no se como se definen nuevas series de datos.

Aqui pongo un ejemplo, que toma el grafico de 1 tic del ES50 y hace la media de los 2 ultimos cierres. Lo puedes insertar en graficos de 1 minuto, de 5, o incluso en otro grafico diferente, que el indicador siemrpe tomara como referencia el ES50 a 1 tic.

Lo que me sospecho, es que con VC sea todo esto 20 veces mas lento que con Ninja...

--------------

Para el ejemplo que yo puse antes, no sirve que se calcule n veces la desviacion tipica. La idea es que quien mete 50 contratos de golpe o mas, es porque indudablemente tiene mucha pasta, y si tiene pasta y lo mete se supone que sabe lo que hace.
Si en un momento dado no hay apenas contratación, y calculo n veces la desviacion tipica, podria considerar operaciones de 10 contratos como válidas, y eso no me interesa.

La lástima es que cuando se ejecutan 50 contratos o mas, no podemos saber si han comprado 50 de golpe a mucha gente distinta que vendia, o han vendido 50 de golpe a mucha gente distinta que compraba...
o si se puede saber? nu se...
Adjuntos
ejemplotics.flw
(931 Bytes) Descargado 71 veces
El camino equivocado es INVENTAR un SISTEMA ganador. El camino correcto es DESCUBRIR que hace el PRECIO, para adelantarse a el, y con eso poder hacer un sistema ganador.
Avatar de Usuario
cls
Mensajes: 1336
Registrado: 24 May 2007 18:46
Contactar:

Mensaje por cls »

bolsa1 escribió:Estoy trasteando un poco con tu trabajo (increíble, por cierto, menudo fenómeno para ingeniar todo este tinglado) y tengo varias dudas...

Si quisiera referirme al mini-Dow actual (YM 12-08), ¿lo declararía así?:

Código: Seleccionar todo

DateTime _expiry = new DateTime( 2008, 10, 12, 0, 0, 0, 0, DateTimeKind.Local );
				NinjaTrader.Cbi.Instrument _instrument = NinjaTrader.Cbi.Instrument.GetObject( "YM", InstrumentType.Future, Exchange.Default, _expiry, 0, Right.Unknown );
(Le he puesto el 10 de Diciembre de expiración, para que me corrijas el orden)

Y otra cuestión... ¿Exactamente cual es la salida esperada por "Barras" y el contador "i"? No entiendo muy bien la función del recorrido.

Y gracias por compartir tu trabajo!
la fecha de vencimiento es año + mes + día. Tienes puesto al revés mes y día.
Y no pongas 10, pon 1. Los vencimientos siempre con el día 1. Fíjate que cuando el ninja te pregunta por vencimientos (por ejemplo en el Instrument Manager, no te pide nunca el día, sólo el mes y el año).
Escaneando los maestros, el vencimiento siempre lo guarda en tablas con el día 1.

Barras es una array de objetos bars. Para poder acceder a todo el contenido de Barras prueba esto:

Código: Seleccionar todo

if ( Barras.Count > 0 )
				{
					for(int i=0; i<=Barras.Count-1; i++)
					{
						NinjaTrader.Data.IBar barra;
						barra = Barras.Get(i);
						Print( barra.Close );
					}
				}

i es un contador utilizado para barrer todo el array. Desde el primero elemento (cero) hasta el último (Count-1).
barra es una variable del tipo IBar que tiene los campos típicos: Close, High, ...
El método Barras.Get(i) va volcando en la variable barra cada elemento del array. Y ya puedes acceder a cada barra.
(En el ejemplo imprimo el cierre de cada barra).

Espero haberlo aclarado, sino dame la brasa :-D

Saludos
Avatar de Usuario
bolsa1
Mensajes: 1347
Registrado: 13 May 2008 09:53
Ubicación: Gallaecia

Mensaje por bolsa1 »

Ok... pues brasa entonces :-D :-D :-D

No consigo hacerlo arrancar, a ver qué hago mal:

Código: Seleccionar todo

 protected override void OnBarUpdate()
        {
			if ( firstTime )
			{
            	// Instrumento al que queremos acceder. En este caso es un futuro que se llama VCTICK y con vencimiento el 12-2008
				DateTime _expiry = new DateTime( 2008, 12, 1, 0, 0, 0, 0, DateTimeKind.Local );
				NinjaTrader.Cbi.Instrument _instrument = NinjaTrader.Cbi.Instrument.GetObject( "YM", InstrumentType.Future, Exchange.Default, _expiry, 0, Right.Unknown );
				
				// Timeframe al que se quiere acceder. En este caso barras de 1 Tick
				NinjaTrader.Data.Period _period = new NinjaTrader.Data.Period( PeriodType.Tick, 1 );
				Print("Instrumento: " + _instrument.ToString());
				Print("Período: " + _period.ToString());
				
				// Sesión. Sólo para saber las horas de inicio y fin de sesión. Creo que da igual qué año se ponga.
				DateTime _sessionBegin 	= new DateTime( 2008, 1, 1, 0, 0, 0, 0, DateTimeKind.Local );
				DateTime _sessionEnd	= new DateTime( 2009, 1, 1, 0, 0, 0, 0, DateTimeKind.Local );
				NinjaTrader.Data.Session _session = new NinjaTrader.Data.Session( _sessionBegin, _sessionEnd, false );
				
				// Barras. Hay que proporcionar las fechas de inicio y fin del intervalo al que queremos acceder. En este caso desde el 01-ene-2007 al 01-ene-2009.
				DateTime _from 	= new DateTime( 2008, 11, 19, 0, 0, 0, 0, DateTimeKind.Local );
				DateTime _to 	= new DateTime( 2008, 11, 20, 0, 0, 0, 0, DateTimeKind.Local );
				NinjaTrader.Data.Bars Barras;
				Barras = NinjaTrader.Data.Bars.GetBars( _instrument, _period, _from, _to, _session, false, false );
				Print( Barras.Count.ToString());
				
				if ( Barras.Count > 0 )
				{
					for(int i=0; i<=Barras.Count-1; i++)
					{
						 NinjaTrader.Data.IBar barra;
                 		 barra = Barras.Get(i);
               			 Print( barra.Close ); 
					}
				}
				
				firstTime = false;
			}
		}
Ahora estoy picado... :evil: :evil: :evil:
"Mercaderes e industriales no deben ser admitidos a la ciudadanía; porque su género de vida es abyecto y contrario a la virtud."

Aristóteles.

Avatar de Usuario
cls
Mensajes: 1336
Registrado: 24 May 2007 18:46
Contactar:

Mensaje por cls »

bolsa1, cuánto vale Barras.Count (se imprime en la ventana de debug) ?. Si vale cero ... mal asunto.

Prueba a abrir un chart de ticks del YM.
Luego carga el indicador en el chart de minutos.
Avatar de Usuario
bolsa1
Mensajes: 1347
Registrado: 13 May 2008 09:53
Ubicación: Gallaecia

Mensaje por bolsa1 »

Eso es lo malo... que en el Output no me sale nada.

Abrí un chart de los últimos tres días del YM 12-08, luego lo cerré y abrí un gráfico de 15minutos, coloqué el indicador... pero no me sale nada en el Output.

Al final va a ser una chorrada (tipo "nombre del archivo" o algo así... ). Voy a seguir un rato dándole vueltas.

Si te das cuenta de algo avísame! ;-)

Saludos!
"Mercaderes e industriales no deben ser admitidos a la ciudadanía; porque su género de vida es abyecto y contrario a la virtud."

Aristóteles.
Avatar de Usuario
cls
Mensajes: 1336
Registrado: 24 May 2007 18:46
Contactar:

Mensaje por cls »

polxx escribió: La lástima es que cuando se ejecutan 50 contratos o mas, no podemos saber si han comprado 50 de golpe a mucha gente distinta que vendia, o han vendido 50 de golpe a mucha gente distinta que compraba...
o si se puede saber? nu se...
si por ejemplo un tiburón pone 100 contratos en limitado a la venta y 100 pececillos van a comprar cada uno un contrato ... qué envía el broker ? 1 tick de volumen 100, ó 100 ticks de volumen 1 ?
Creo que depende del datafeed. Si por ejemplo es IB que creo que comprime los ticks, enviaría sólo un tick con volumen 100.
Otro proveedor a lo mejor sí te envía los 100 ticks.
La verdad que no lo sé.

Y en ningún caso podrías saber que era una mano fuerte que puso 100 contratos de golpe en la mesa. (IB también comprimiría si en vez de ser 1 contra 100 son 100 contra 100).

El único que ahí sabe todo es el broker.

S2
Avatar de Usuario
bolsa1
Mensajes: 1347
Registrado: 13 May 2008 09:53
Ubicación: Gallaecia

Mensaje por bolsa1 »

En el log describe el error:

"Error on calling the 'OnBarUpdate' method for indicator 'ZiBor' on bar 0: Referencia a objeto no establecida como instancia de un objeto."

¿?
"Mercaderes e industriales no deben ser admitidos a la ciudadanía; porque su género de vida es abyecto y contrario a la virtud."

Aristóteles.
Avatar de Usuario
cls
Mensajes: 1336
Registrado: 24 May 2007 18:46
Contactar:

Mensaje por cls »

bolsa1 escribió:Eso es lo malo... que en el Output no me sale nada.

Abrí un chart de los últimos tres días del YM 12-08, luego lo cerré y abrí un gráfico de 15minutos, coloqué el indicador... pero no me sale nada en el Output.

Al final va a ser una chorrada (tipo "nombre del archivo" o algo así... ). Voy a seguir un rato dándole vueltas.

Si te das cuenta de algo avísame! ;-)

Saludos!
Por lo menos el Print del instrumento y el período sí tendría que salirte.

No cierres el chart de ticks hasta que hayas cargado el indicador en el chart de minutos.
Luego podrás cerrar el chart de ticks.
(antes me pasó algo parecido y se arregló teniendo en pantalla el chart de ticks - aunque no servía para nada y no coincidían con las fechas que quería procesar. Debe ser algo de conexiones internas 8) ).
Avatar de Usuario
cls
Mensajes: 1336
Registrado: 24 May 2007 18:46
Contactar:

Mensaje por cls »

bolsa1 escribió:En el log describe el error:

"Error on calling the 'OnBarUpdate' method for indicator 'ZiBor' on bar 0: Referencia a objeto no establecida como instancia de un objeto."

¿?
Mira a ver qué referencias tienes cargadas. Abre el editor, cualquier indicador, clic derecho y References.
Yo tengo estas librerías:

Imagen
Adjuntos
references01.gif
Avatar de Usuario
bolsa1
Mensajes: 1347
Registrado: 13 May 2008 09:53
Ubicación: Gallaecia

Mensaje por bolsa1 »

Yo tengo las mismas, y el "vendor.dll". He instalado el .net SDK, que no lo tenía en este ordenador... pero aún así no tira...

Voy a dejarlo unas horas, y luego vuelvo al ataque en el ordenador de casa, a ver si va.

Muchas gracias CLS. ;-)
"Mercaderes e industriales no deben ser admitidos a la ciudadanía; porque su género de vida es abyecto y contrario a la virtud."

Aristóteles.
Avatar de Usuario
polxx
Mensajes: 847
Registrado: 09 Dic 2005 10:25
Ubicación: Albacete

Mensaje por polxx »

cls escribió: si por ejemplo un tiburón pone 100 contratos en limitado a la venta y 100 pececillos van a comprar cada uno un contrato ... qué envía el broker ? 1 tick de volumen 100, ó 100 ticks de volumen 1 ?
Creo que depende del datafeed. Si por ejemplo es IB que creo que comprime los ticks, enviaría sólo un tick con volumen 100.
Otro proveedor a lo mejor sí te envía los 100 ticks.
La verdad que no lo sé.

Y en ningún caso podrías saber que era una mano fuerte que puso 100 contratos de golpe en la mesa. (IB también comprimiría si en vez de ser 1 contra 100 son 100 contra 100).

El único que ahí sabe todo es el broker.

S2
No entiendo mucho de esto, pero creo que si alguien fuerte, lanza una orden a mercado o en stop de 100 contratos, al ejecutarse aparecerá 1 tic de volumen 100.
Si 100 pequeños lanzan 100 ordenes de 1 contrato a mercado o stop, apareceran 100 tic de volumen 1
Con lo cual quizas podria tener sentido el indicador que yo digo.

El problema esta en que si uno grande pone 1 orden limitada de 100 contratos a un nivel, al llegar ese precio, si 100 pequeños le dan 100 contratos a mercado y el grande se los queda, entonces aparecen 100 tics de volumen 1, cuando en realidad es uno grande quien esta al otro lado de la operación.

Ciertamente es complicado, no se si seria viable hacer algo.

--------------

CLS, el indicador que tu describes en el primer post de este hilo, creo que puedes hacerlo con graficos de 1 minuto teniendo en cuenta rango de las barras y volumen.
Si una barra va desde 3001 hasta 3010 puntos y tiene volumen 5000, pues al nivel 3001 le sumas 500, al 3002 tambien, y asi hasta el 3010.
Despues te vas a n barras atras, y haces lo mismo pero restando, para borrar datos antiguos.
De manera que n seria el periodo del indicador.
Eso lo hice yo hace tiempo en VC para averiguar la moda de las ultimas n barras, osea el nivel mas negociado.

No te sirve asi?

-----------------------------

Se puede hacer que NT optimice buscando el mejor sharpe? o el mejor ratio ganancia anual/peor serie de perdidas?
Ya se que no va incluido, pero se podria hacer algo para que lo incluya en el listado de opciones?
El camino equivocado es INVENTAR un SISTEMA ganador. El camino correcto es DESCUBRIR que hace el PRECIO, para adelantarse a el, y con eso poder hacer un sistema ganador.
fabgonber
Mensajes: 212
Registrado: 17 Oct 2008 19:05

Mensaje por fabgonber »

Esto se parece mucho al trabajo de blai5 en konkorde... hechenle un ojo.
Slds
F_

¡¡¡El grial existe!!! se llama money managment, ahora, ¿como %$$!! lo aplico?

Código: Seleccionar todo

while (1==1) { print "No operaras el primer viernes del mes" } 
Avatar de Usuario
cls
Mensajes: 1336
Registrado: 24 May 2007 18:46
Contactar:

Mensaje por cls »

polxx escribió: No entiendo mucho de esto, pero creo que si alguien fuerte, lanza una orden a mercado o en stop de 100 contratos, al ejecutarse aparecerá 1 tic de volumen 100.

Si 100 pequeños lanzan 100 ordenes de 1 contrato a mercado o stop, apareceran 100 tic de volumen 1
Con lo cual quizas podria tener sentido el indicador que yo digo.
Polxx, los ticks sólo te llegan cuando se hace el trade, cuando el vendedor vende y el comprador compra, no al poner las órdenes en el libro sean limitadas o a mercado.
El libro se puede leer en el ninja con algunas funciones que te dan el bid y el ask en el momento corriente. Pero es otra cosa distinta a los ticks.

polxx escribió: CLS, el indicador que tu describes en el primer post de este hilo, creo que puedes hacerlo con graficos de 1 minuto teniendo en cuenta rango de las barras y volumen.
Si una barra va desde 3001 hasta 3010 puntos y tiene volumen 5000, pues al nivel 3001 le sumas 500, al 3002 tambien, y asi hasta el 3010.
Despues te vas a n barras atras, y haces lo mismo pero restando, para borrar datos antiguos.
De manera que n seria el periodo del indicador.
Eso lo hice yo hace tiempo en VC para averiguar la moda de las ultimas n barras, osea el nivel mas negociado.

No te sirve asi?
Ese método estaría promediando, no sería exacto. La idea es encontrar los precios exactos de más negociación. Los precios que de verdad interesan al mercado. De hecho, en el gráfico que puse la moda es la línea azul más larga y está indicada con su volumen correspondiente.

polxx escribió: Se puede hacer que NT optimice buscando el mejor sharpe? o el mejor ratio ganancia anual/peor serie de perdidas?
Ya se que no va incluido, pero se podria hacer algo para que lo incluya en el listado de opciones?
No lo sé. Pero no tiene pinta.

Saludos
Si te ha gustado este hilo del Foro, ¡compártelo en redes!


Responder

Volver a “Software”