Acumular posiciones desde un sistema en PDV
En el presente artículo vamos a tratar de explicar cómo hacer para controlar los negocios en un caso de sistema que acumula posiciones:
Este artículo está orientado al diseño de sistemas con la Plataforma Visual (PDV).
Para saber cómo realizar este mismo proceso, pero a través del diseño en Visual Basic, pueden acceder al siguiente enlace:
Acumular posiciones sistema VBA
Acumular posiciones en Visual Chart
Una de las características de los sistemas en Visual Chart es que no permite acumular contratos de forma natural. Esto quiere decir que si en un momento determinado nuestro sistema tiene una posición abierta y desde código vuelve a pasar por la sentencia correspondiente para una nueva entrada, ésta sentencia no tendrá efecto alguno sobre el sistema, puesto que el programa considera que al estar ya abiertos (siempre hablamos de órdenes del mismo signo), no se debe enviar otra vez a mercado la misma orden.
El modo que tenemos para impedir esto es aplicar etiquetas a las órdenes y modificar los ajustes del sistema para que permita acumular por etiquetas.
El proceso que debemos seguir para adaptar los ajustes del sistema está explicado en el enlace de más arriba.
Dicho esto, el primer paso que debemos dar es rellenar en las órdenes del sistema el campo Etiqueta. Vamos a ver un ejemplo.
Ejemplo Sistema en PDV
En nuestro ejemplo queremos hacer lo siguiente: En una tendencia alcista, conforme se vaya confirmando la continuación de la misma, colocaremos hasta un máximo de cuatro órdenes de compra seguidas, siempre y cuando sea posible. El ejemplo de esto lo podemos ver en la imagen adjunta al inicio de éste artículo.
Para realizar esto haremos lo siguiente: Añadimos dos funciones que nos van a servir en qué estado se encuentra el sistema en cada momento:
La función GetMarketPosition nos va a decir si estamos comprados o vendidos. Si estamos vendidos y se cumplen las condiciones de compra, la orden que enviemos llevará la etiqueta A porque será la primera orden de compra que coloquemos:
La función CurrentEntries nos va a decir cuántas entradas tenemos abiertas en cada momento. En función de su valor, enviaremos una nueva orden de compra con una etiqueta específica:
Si CurrentEntries vale 1, enviamos una compra con la etiqueta B.
Si CurrentEntries vale 2, enviamos una compra con la etiqueta C.
Si CurrentEntries vale 3, enviamos una compra con la etiqueta D.
A partir de que CurrentEntries valga 4, ya no permitimos más compras porque hemos decidido limitar las entradas acumuladas a 4.
En lo relativo a las ventas decidimos no acumular, de modo que si se cumplen las reglas de venta enviamos una orden de venta con la etiqueta A y ya está.
El resultado del sistema sería el siguiente:
Fíjense que hemos añadido las dos funciones de las que les hablábamos antes. Por otro lado, en cuanto no se cumple que GetMarketPosition sea igual a -1, le preguntamos a CurrentEntries cuántas entradas tenemos abiertas. Obviamente, si quisiéramos añadir más contratos, tendríamos que seguir repitiendo el proceso, hasta alcanzar el número máximo de contratos que queremos permitir. Es necesario crear un elemento de compra para cada una de las compras que queramos acumular, puesto que cada una de ellas lleva incluida su propia etiqueta.
Anexo. Controlar el precio de entrada
Para finalizar este estudio de los sistemas que acumulan posiciones, vamos a resolver una duda que nos envió uno de nuestros usuarios. La pregunta era la siguiente: Si acumulamos posiciones y queremos obtener el precio de entrada de cada una de las entradas, al preguntar a la función GetEntryPrice (que nos devuelve el precio de entrada de la posición abierta), no incluye ningún argumento con el que poder especificar el índice de la entrada concreta sobre la que queremos hacer la consulta.
Esto se debe a que la función GetEntryPrice está pensada para ser utilizada en sistemas que no acumulan posiciones. Por tanto, para los sistemas que acumulan, en realidad, no podemos usar dicha función.
¿Qué hacer en tal caso? Necesitamos saber el precio individual de cada una de las entradas para poder calcular, por ejemplo, el precio de las órdenes de salida.
Para ello, lo que haremos será crear una variable para cada una de las posibles entradas de compra.
En estas variables almacenaremos el precio de entrada correspondiente. Vamos a llamar a las variables precioA, precioB, precioC y precioD. Y actualizamos su valor cada vez que realicemos una nueva entrada:
En este caso, como las entradas son del tipo "Al Cierre", actualizamos cogiendo el precio de cierre de la barra correspondiente. Si las entradas fueran del tipo "Limitada" o "En Stop", entonces actualizaríamos cogiendo el precio con el que se lanzan dichas órdenes.
Hecho esto, ya podemos hacer uso de dichas variables para, como decíamos, enviar órdenes de salida en base al precio de cada orden:
Este artículo está orientado al diseño de sistemas con la Plataforma Visual (PDV).
Para saber cómo realizar este mismo proceso, pero a través del diseño en Visual Basic, pueden acceder al siguiente enlace:
Acumular posiciones sistema VBA
Acumular posiciones en Visual Chart
Una de las características de los sistemas en Visual Chart es que no permite acumular contratos de forma natural. Esto quiere decir que si en un momento determinado nuestro sistema tiene una posición abierta y desde código vuelve a pasar por la sentencia correspondiente para una nueva entrada, ésta sentencia no tendrá efecto alguno sobre el sistema, puesto que el programa considera que al estar ya abiertos (siempre hablamos de órdenes del mismo signo), no se debe enviar otra vez a mercado la misma orden.
El modo que tenemos para impedir esto es aplicar etiquetas a las órdenes y modificar los ajustes del sistema para que permita acumular por etiquetas.
El proceso que debemos seguir para adaptar los ajustes del sistema está explicado en el enlace de más arriba.
Dicho esto, el primer paso que debemos dar es rellenar en las órdenes del sistema el campo Etiqueta. Vamos a ver un ejemplo.
Ejemplo Sistema en PDV
En nuestro ejemplo queremos hacer lo siguiente: En una tendencia alcista, conforme se vaya confirmando la continuación de la misma, colocaremos hasta un máximo de cuatro órdenes de compra seguidas, siempre y cuando sea posible. El ejemplo de esto lo podemos ver en la imagen adjunta al inicio de éste artículo.
Para realizar esto haremos lo siguiente: Añadimos dos funciones que nos van a servir en qué estado se encuentra el sistema en cada momento:
La función GetMarketPosition nos va a decir si estamos comprados o vendidos. Si estamos vendidos y se cumplen las condiciones de compra, la orden que enviemos llevará la etiqueta A porque será la primera orden de compra que coloquemos:
La función CurrentEntries nos va a decir cuántas entradas tenemos abiertas en cada momento. En función de su valor, enviaremos una nueva orden de compra con una etiqueta específica:
Si CurrentEntries vale 1, enviamos una compra con la etiqueta B.
Si CurrentEntries vale 2, enviamos una compra con la etiqueta C.
Si CurrentEntries vale 3, enviamos una compra con la etiqueta D.
A partir de que CurrentEntries valga 4, ya no permitimos más compras porque hemos decidido limitar las entradas acumuladas a 4.
En lo relativo a las ventas decidimos no acumular, de modo que si se cumplen las reglas de venta enviamos una orden de venta con la etiqueta A y ya está.
El resultado del sistema sería el siguiente:
Fíjense que hemos añadido las dos funciones de las que les hablábamos antes. Por otro lado, en cuanto no se cumple que GetMarketPosition sea igual a -1, le preguntamos a CurrentEntries cuántas entradas tenemos abiertas. Obviamente, si quisiéramos añadir más contratos, tendríamos que seguir repitiendo el proceso, hasta alcanzar el número máximo de contratos que queremos permitir. Es necesario crear un elemento de compra para cada una de las compras que queramos acumular, puesto que cada una de ellas lleva incluida su propia etiqueta.
Anexo. Controlar el precio de entrada
Para finalizar este estudio de los sistemas que acumulan posiciones, vamos a resolver una duda que nos envió uno de nuestros usuarios. La pregunta era la siguiente: Si acumulamos posiciones y queremos obtener el precio de entrada de cada una de las entradas, al preguntar a la función GetEntryPrice (que nos devuelve el precio de entrada de la posición abierta), no incluye ningún argumento con el que poder especificar el índice de la entrada concreta sobre la que queremos hacer la consulta.
Esto se debe a que la función GetEntryPrice está pensada para ser utilizada en sistemas que no acumulan posiciones. Por tanto, para los sistemas que acumulan, en realidad, no podemos usar dicha función.
¿Qué hacer en tal caso? Necesitamos saber el precio individual de cada una de las entradas para poder calcular, por ejemplo, el precio de las órdenes de salida.
Para ello, lo que haremos será crear una variable para cada una de las posibles entradas de compra.
En estas variables almacenaremos el precio de entrada correspondiente. Vamos a llamar a las variables precioA, precioB, precioC y precioD. Y actualizamos su valor cada vez que realicemos una nueva entrada:
En este caso, como las entradas son del tipo "Al Cierre", actualizamos cogiendo el precio de cierre de la barra correspondiente. Si las entradas fueran del tipo "Limitada" o "En Stop", entonces actualizaríamos cogiendo el precio con el que se lanzan dichas órdenes.
Hecho esto, ya podemos hacer uso de dichas variables para, como decíamos, enviar órdenes de salida en base al precio de cada orden:
Comentarios
Publicar un comentario