abril 15, 2021

Cómo hacer algoritmos para ATAS. Instrucciones paso a paso

Contenido

    Compartir

    Cómo crear un indicador o estrategia en ATAS

    En la plataforma ATAS, además de todas sus utilidades, así como indicadores e gráficos de clúster, se ofrece una increíble posibilidad de conectar sus propios algoritmos a través de la API. Eso le abre el camino a un sinfín de opciones para usar la capacidad de ATAS: 

    Al final del artículo, usted recibirá un archivo para Visual Studio con el código fuente que se usa en el texto. Si tendrán preguntas, háganlas en los comentarios.

    ¡Vamos!

    Como empezar

    Para empezar, debe instalar Microsoft Visual Studio, un entorno en el que se desarrollan diferentes productos en el lenguaje C#, incluidos los archivos dll. Utilizando el formato de archivos dll puede conectar sus algoritmos a ATAS.

    Puedes descargar el paquete de distribución del programa Visual Studio Community (será suficiente con una versión gratuita) en visualstudio.microsoft.com//downloads/

    Instalamos Visual Studio en nuestro ordenador como cualquier otro programa. Es recomendable elegir la versión en inglés. En las capturas de pantalla usamos inglés.

    Lanzamos el programa. Seleccionamos Create Class Library (.NET Standard).

    Cómo crear un proyecto

    Tenga en cuenta que en la mayoría de los cursos de C#, el aprendizaje comienza con la creación de la aplicación Console App. Mientras hemos elegido crear Class Library, ya que esto es necesario para conectarse a ATAS.

    ¿Qué es Class Library? Este es un componente separado dentro de un programa grande. En nuestro caso, crearemos un archivo dll con sus clases para luego conectarlo como un componente a la plataforma ATAS. 

    Pronto verá como se hace esto.

    Cómo crear un proyecto

    Seleccionamos un nombre para el proyecto Lesson1. Hacemos clic en Crear.

    Visual Studio se iniciará y creará una plantilla Class Library vacía para nosotros (en la captura de pantalla a continuación).

    Cómo funciona el proyecto

    Un resumen breve sobre la interfaz. A la derecha (1) hay una ventana llamada Explorador de soluciones. Muestra la estructura de nuestro proyecto y sus elementos (si no lo tiene, puede abrirlo desde el menú View. También puede abrir/cerrar otras ventanas desde allí).

    A la izquierda hay un área grande donde se edita el código del programa, en este caso, editor de la clase Class1.cs.

    Qué contiene nuestro código después de crear la plantilla:

    • using – palabra clave, significa que conectamos fuentes adicionales (espacios de nombres). Using System (2) se ofrece de forma predeterminada porque contiene los conceptos básicos que seguramente usaremos.
    • namespace Lesson1 – es nuestro espacio de nombres. Dibuja un límite entre diferentes partes del código para que no entren en conflicto en caso de tener los mismos nombres. 
    • public class Class1 – una plantilla para nuestra clase. C# es un lenguaje de programación orientado a objetos (POO) y la clase es su elemento obligatorio. 

    Primeros pasos

    Estableceremos la conexión con ATAS.

    Para hacer esto, hay que agregar a nuestro proyecto un enlace a la biblioteca ATAS.Indicators.dll que se encuentra en la carpeta con la plataforma ATAS instalada.

    En el menú proyecto, seleccionamos Add References (o hacemos clic con el botón derecho en la Ventana de exploradores, y luego clic en la pestaña Dependencies).

    Cómo agregar referencias al proyecto

    ATAS.Indicators aparecerá en la ventana del explorador (1).

    Editamos el código del indicador

    A continuación, editamos el código tal como se muestra en la captura de pantalla (2):

    Escribimos namespace ATAS.Indicators.Technical – porque crearemos nuestro algoritmo en el espacio de otros indicadores técnicos ATAS.

    Agregamos using ATAS.Indicators – al crear algoritmos para ATAS, siempre usará esta referencia (por ejemplo, en párrafos en posición alterna).

    Editamos public class Example1_1 : Indicator. En esta línea Example1_1 significa que hacemos el primer ejemplo de la primera lección (puede escribir cualquier otro nombre, luego se mostrará en la lista de indicadores ATAS).

    Mientras que los dos puntos y la palabra Indicator tienen un significado importante. Por lo tanto, denotamos que la clase Indicator (está contenida dentro de ATAS.Indicators.dll) es la clase «paternal». Y nuestra clase Example1_1 hereda todo lo que está en la paternal. Y, por lo tanto, tenemos acceso a toda la funcionalidad que está permitida a los herederos de la clase Indicator, y esto significa operaciones con precios, clústeres, valores de otros indicadores, etc. 

    A continuación escribimos protected override void OnCalculate(int bar, decimal value) y dos llaves. Esta parte del código se llama método OnCalculate

    Un método es, en pocas palabras, un conjunto de comandos a ejecutar para el ordenador. Dentro del padre, el método OnCalculate se declara obligatorio. Cuando agregue su indicador al gráfico, la plataforma ejecutará los comandos que usted escribirá dentro de las llaves. Y si usted no dispone del método OnCalculate, Visual Studio no le permitirá compilar el código en un archivo dll porque es obligatorio tenerlo. De lo contrario, ATAS no entenderá lo que debe ejecutar.

    Si ha hecho todo correctamente, abajo aparecerá el siguiente texto: No issues found (3). Si allí se aparecen errores, trate de entender cuál es su causa. Qué podría salir mal:

    • C# es un lenguaje sensible a mayúsculas y minúsculas. Esto significa que las letras grandes y pequeñas difieren en el código.
    • Llaves, puntos y comas, comillas y otros caracteres: todo importa. Si ha olvidado o perdido algo, Visual Studio le dirá.

    Ahora que usted ya tiene un código libre de errores, compilémoslo. Para hacer esto, en el menú Build, seleccione Build Lesson1 (o presione Ctrl+B), y en la ventana output debe aparecer un mensaje que indica que la compilación del código al archivo fue exitosa.

    Compilamos el indicador

    Como puede ver, nuestro proyecto se compiló en Lesson1.dll. Vamos a la carpeta especificada, tomamos el archivo, lo copiamos en C:UsersUserDocumentsATASIndicators (en su caso, la ruta de la carpeta Documentos puede ser diferente). Pegamos allí Lesson1.dll. 

    Ejecutamos ATAS, abrimos el gráfico, cargamos los datos de la herramienta, abrimos la ventana del administrador de indicadores. ¿Qué pasa?

    Nuestro indicador en ATAS

    En la lista de indicadores técnicos apareció nuestro propio indicador Example1_1 (Si no se encuentra, pruebe el formulario Search).

    Preste atención. Aunque no hemos escrito prácticamente ningún código, nuestro indicador contiene:

    • posibilidad de selección de fuente Source;
    • selección del panel para visualización;
    • configuración de visualización (color, tipo de línea y otros).

    Nuestro indicador heredó todas estas configuraciones de la clase paternal «Indicator». Podemos cambiarlas, pero por ahora las dejaremos tal como es.

    Si agregamos Example1_1 al gráfico, el indicador aparecerá en la lista de agregados, pero de hecho no cambiará nada, porque falta el código dentro del método OnCalculate. No hay comandos para ejecutar.

    Y si cambia el panel de visualización del indicador y especificará New Panel en lugar de Chart, verá esto:

    Nuestro indicador en ATAS

    El panel inferior mostrará una línea horizontal roja. ¿Qué línea y por qué hay ceros?

    Porque cuando crea su clase Example1_1, y la hereda de la clase paternal «Indicator», se agrega automáticamente una matriz de datos a su clase. Se llama Dataserie. Esta matriz contiene los valores de su indicador para cada barra.

    Supongamos que agregamos el indicador Example1_1 a un gráfico, que consta de 458 barras.

    Tabla condicional en la memoria del ordenador

    Se creará una tabla en la memoria, donde el ordenador asignará el número 0 a la barra más antigua (izquierda en el gráfico), la siguiente, tendrá el número 1, y así sucesivamente. La última barra (derecha) recibirá el número 457. 

    Y en la línea Example1_1 se almacenarán los valores del indicador. Pero debido a que no hemos escrito ningún código para calcularlos, allí se guardan los valores predeterminados, y estos son ceros.

    Si ha prestado atención, el método OnCalculate tiene parámetros en el código (int bar, decimal value). Pues:

    • bar – es una variable de tipo integer (número entero). Aquí se almacena el número de secuencia de la barra;
    • value – es una variable de tipo decimal (número decimal). Aquí se almacena el valor del indicador correspondiente a esta barra.

    Probablemente todo esto suena difícil para un principiante hasta ahora. Por lo tanto, volveremos a calcular los valores del indicador en otro momento, y ahora haremos algo más fácil.

    Creación de algoritmos más simples

    El primer programa

    Como primer programa, aquellos que comienzan a aprender el lenguaje de programación C# suelen visualizar el mensaje “Hello, world!” en la pantalla. 

    Pero ya que estamos haciendo una biblioteca para ATAS, vamos a visualizar este mensaje en la ventana de registros. Prácticamente lo mismo. 

    Para realizar la idea, agregamos al proyecto la referencia Utils.Common.dll desde la carpeta donde está instalado ATAS. Al igual que agregábamos ATAS.Indicators.dll.

    Agregamos referencia desde la carpeta ATAS

    Si ha hecho todo correctamente, en la ventana del explorador de soluciones aparecerá Utils.Common (como se muestra con el número 1 en la captura de pantalla a continuación).

    Editamos el código del indicador

    A continuación, editamos el código.

    Agregamos using Utils.Common.Logging; – esto es necesario para que el indicador pueda mostrar mensajes en la ventana de registros de la plataforma ATAS.

    Agregamos this.LogInfo($»Hello World 1″); en el cuerpo del método OnCalculate. Este es el comando para mostrar la frase de texto «Hello World 1» en la ventana de registros

    Y también creamos otro método protected override void OnInitialize() – enseguida verán para qué. En el cuerpo del método escribimos this.LogInfo($»Hello World 2″);

    A continuación compilamos.

    Compilamos

    Desde la carpeta del proyecto, copiamos nuestro Lesson1.dll actualizado y lo pegamos con reemplazo en la carpeta DocumentsATASIndicators

    Y, si ATAS ya se está ejecutando, verá una notificación:

    Algunas bibliotecas han sido modificadas. Puede volver a cargar las estrategias en la barra de estado de la ventana principal.

    ¡No se asuste, es una gran noticia! Cuando actualiza su dll en la carpeta Indicators, no necesita reiniciar la plataforma (esto puede llevar tiempo).

    Cómo actualizar la base de indicadores en ATAS

    Es suficiente hacer clic en este icono, y ATAS actualizará las bibliotecas sin reiniciarse. Esto ahorrará muchos minutos en caso de que usted realice cambios menores con frecuencia.

    A continuación, abrimos el gráfico diario (por ejemplo, ED), y en la ventana de configuración de time frame (marco de tiempo) especificamos Days Count = 5, de modo que solo haya 5 velas en el gráfico. Agregamos el indicador Example1_1 al gráfico y miramos la ventana de registros:

    Ejemplo de funcionamiento del indicador en ATAS

    5 veces salió «Hello World 1 «y 1 vez salió «Hello World 2».

    Esto significa que:

    • los comandos dentro del método OnCalculate se ejecutan para cada barra, y luego el método sigue ejecutándose cuando llega cada nuevo tick para calcular los valores del indicador en tiempo real. 
    • Mientras el método OnInitialize se ejecuta solo 1 vez, al inicializar el indicador. Esto ocurre antes de ejecutar comandos desde el método OnCalculate. 

    ¡Hurra, nuestro primer programa «Hello World» funciona! Ahora vamos a complicar la tarea.

    Segundo programa

    Escribamos un indicador que nos muestre información sobre la última barra en la ventana de registros, ya sea alcista (Close>Open) o bajista (Close<Open)?

    En el menú Project, seleccionemos Add Class, dejemos que su nombre siga siendo Class2.cs. Después de agregar, tendrá una nueva Class (1) en la ventana del explorador. Al hacer doble clic en él, se abrirá el editor de código.

    Ejemplo de funcionamiento del indicador en ATAS

    Copiamos el código Example1_1 en el editor, y lo pegamos aquí. Debería aparecer un error debido a conflicto de nombres. Cambiemos el nombre (2) de la clase a Example1_2, dejemos todas las líneas using, eliminamos el código del método OnCalculate y escribimos comandos en el método OnInitialize para resolver nuestra tarea.

    var candle = GetCandle(CurrentBar-1);

    ¿Qué significa esta línea? Vamos a leerla de derecha a izquierda.
    CurrentBar es una variable que es igual al número de velas en el gráfico. Pero como la numeración comienza en cero, la última vela en la tabla tiene el número CurrentBar-1.

    • GetCandle es un método (comando) de la clase paternal Indicator. Al ejecutar este comando, el ordenador lee toda la información disponible sobre la vela en el gráfico bajo el número que figura entre paréntesis.
    • var candle: así es como declaramos un nuevo objeto para su uso en el programa. Cuando declaramos un nuevo objeto, es mejor asignarle un valor inmediatamente. Esto se hace con ayuda del signo «igual»

    Y a la vez, declaramos la variable candle y le metemos información sobre la última vela en el gráfico. Ahora podemos operar con esta información. En nuestro caso, hacer una construcción condicional if-else (ejecutar una operación de comparación).

    Si el precio Close en nuestra vela es superior (más alto) que el precio Open – escribimos en el registro «Last bar is Bullish». De lo contrario (si es inferior o igual), escribimos en el registro «Last bar is Bearish».

    Compilamos el archivo dll a través del menú Build, insertamos el archivo Lesson1.dll en el directorio con indicadores. Hacemos clic en el icono en ATAS para que la plataforma actualice las bibliotecas. Abrimos el gráfico:

    Ejemplo de funcionamiento del indicador en ATAS
    Código de tercer programa para ATAS

    ¿Qué significa?

    Hemos agregado dos variables q_Green y q_Red. Ambas son de tipo int (integer, número entero) y ambos son iguales a cero. Las usaremos para contar.

    Luego sigue el ciclo for. Este ciclo es adecuado cuando una operación debe ejecutarse un cierto número de veces. En nuestro caso, el número de iteraciones es igual al número de barras en el gráfico que se almacena en CurrentBar. La variable i es un contador, al principio es igual a cero. Pero aumenta en 1 con cada ciclo ejecutado (iteración). El ciclo se ejecutará siempre cuando se cumpla la condición i < CurrentBar.

    En la primera ejecución del ciclo, nuestro indicador da el comando GetCandle (0), recibe los datos sobre la primera vela (izquierda) en el gráfico y los deposita en el objeto candle. Luego compara candle.Close y candle.High, y dependiendo de la comparación aumenta q_Green o q_Red.

    Y así sucesivamente para cada barra. Cuando finaliza el ciclo, el comando LogInfo muestra el texto y los valores de las variables q_Green o q_Red en la ventana de registros.

    Compilemos nuestra biblioteca de indicadores, insertamos con reemplazo en la misma carpeta, hacemos clic en el icono para actualizar las bibliotecas en ATAS y agregamos un indicador al gráfico:

    Ejemplo de funcionamiento del indicador en ATAS

    En la ventana de registros, el indicador Example1_2 escribió que la última barra es alcista. Y Example1_3 escribió que hay 11 barras alcistas y 12 barras bajistas. Todo es correcto.

    Complicaremos la tarea por última vez para este artículo.

    Cuarto programa

    Vamos a escribir un código que evaluará la secuencia de barras alcistas y bajistas según la duración y la frecuencia de aparición. En otras palabras, queremos saber, por ejemplo, qué tan probable es que haya otra barra alcista después de la primera barra alcista.

    Pero antes de escribir el indicador, hagamos un experimento. Tomemos el código que genera aleatoriamente una matriz de 20 mil elementos, lleno de ceros y unos. Por lo tanto, obtenemos una secuencia de cadenas, cuya longitud mínima = 1 eslabón. Algunas cadenas serán de 2, 3, 5 eslabones o más.

    Pregunta: ¿Cuál será la longitud promedio de la cadena?

    Funcionamiento del generador de números aleatorios

    Como resultado del experimento, obtenemos que el valor promedio de la cadena para una matriz generada aleatoriamente de 20 mil ceros y unos es alrededor de 1,96 eslabones.

    Es decir, si asumimos que 0 es una vela bajista y 1 es vela alcista, entonces en un mercado absolutamente caótico, la longitud promedio de la cadena de barras alcistas / bajistas será = 1,96.

    Necesitamos esta cifra como un «estándar de aleatoriedad».

    Cambiamos a Lesson1 y escribimos el código para la nueva clase Example1_4. Primero calculamos las estadísticas para las velas alcistas.

    Escribimos código del indicador 4 para ATAS

    El primer ciclo (1) examinará toda la matriz de velas en el gráfico. Si encontramos el comienzo de una cadena alcista (línea 21), entonces ejecutamos el segundo ciclo (2), que calcula la longitud de cada cadena en bullishLine. En la variable bullishFirst se acumula el número de cadenas alcistas encontradas, en la variable bullishSum se suma su longitud total.

    Las líneas 24 y 31 son necesarias para asegurarse contra los casos cuando el algoritmo va más allá de la matriz de velas. 

    Cuando se pasan los ciclos, mostramos (3) en la ventana de registros información sobre el número de secuencias encontradas de velas alcistas, su longitud total y contamos el valor promedio dividiendo.

    Escribimos un algoritmo similar para calcular las estadísticas de las barras bajistas. Seguramente no obtendremos el código más elegante y profesional. Pero este es un artículo de una persona que no es profesional, dedicado a los principiantes, por lo tanto, «lo principal es que funcione». 

    Compilamos el código, lo movemos a una carpeta, lo ejecutamos en un gráfico, por ejemplo, las acciones de Gazprom (GAZP) del período diario durante varias semanas. En la ventana de registros vemos que nuestro indicador ha encontrado:

    • 6 secuencias bajistas con un total de 10 velas;
    • 6 secuencias alcistas con un total de 11 velas.
    Ejemplo de funcionamiento del indicador en ATAS

    Lo cual es el resultado correcto, si tenemos en cuenta que la primera vela bajista no se considera como una secuencia completa, porque no vemos su comienzo.

    Longitud media de las secuencias:

    • 1.66 para velas bajistas
    • 1,83 para velas alcistas

    Si cargamos datos de un número significativamente mayor de días naturales en el gráfico, se descubrirá que:

    Ejemplo de funcionamiento del indicador en ATAS

    La longitud promedio de las secuencias para el período desde el verano 2017 hasta la primavera 2021:

    • 1.86 para velas bajistas
    • 1,93 para velas alcistas

    Esto está muy cerca del «estándar caótico». En otras palabras, si hoy las negociaciones de las acciones GAZP cerraron al alza, entonces la probabilidad de que mañana también sea un día alcista, hablando relativamente, es de 50/50. Y si les han visitado los pensamientos relacionados con la estrategia más simple, como por ejemplo: «comprare mañana en la apertura, si hay crecimiento hoy», entonces con la ayuda de ATAS y Visual Studio, pueden encontrar rápidamente la respuesta a lo buena que es esta estrategia.

    Y tal vez:

    • ¿elegir otro mercado / período?
    • cambiar el tipo de gráfico por Delta, Range, Range XV, Reversal?
    • ¿añadir trailing stop?
    • ¿crear una estrategia automática?

    Las ideas aparecen una tras otra. Es pura creatividad que puede hacer en los mercados financieros utilizando la plataforma ATAS y el entorno de desarrollo de algoritmos propios de Visual Studio.

    Puede comenzar ahora mismo, aquí hay un archivo ↓ con el código fuente Lesson1.

    Para abrirlo en Visual Studio, haga clic 2 veces en el archivo Lesson1.sln.

    Bonus

    Aquí hay otro enlace muy útil. Siguiéndolo, puede descargar un archivo con un conjunto de algoritmos para calcular los indicadores técnicos populares, que se pueden abrir en Visual Studio.

    Para abrir un conjunto en Visual Studio, haga doble clic en el archivo CustomIndicatorSet.sln

    Conclusiones

    La capacidad de escribir programas le da una ventaja importante. Al dominar C# incluso en un nivel no profesional, puede:

    • automatizar las negociaciones;
    • optimizar la configuración de estrategias;
    • evaluar la perspectiva de las ideas. 

    En caso de que, crear algoritmos en C# para ATAS resulta ser una tarea demasiado costosa en cuanto al tiempo y esfuerzo, solicite su desarrollo a desarrolladores profesionales.

    Si le gustó este artículo, escribanos en los comentarios. Díganos también que le gustaría ver en el siguiente artículo sobre el tema.

    La información presentada en este artículo no es un llamamiento a invertir o comprar/vender algún activo en la bolsa de valores. Todas las situaciones consideradas en el artículo están escritas para familiarizarse con la funcionalidad y las ventajas de la plataforma ATAS.

    Examina las causas de las fluctuaciones de precios en el mercado

    Empieza a usar ATAS ahora mismo y saca provecho.

    Empieza gratis

    Este sitio está registrado en wpml.org como sitio de desarrollo. Cambia a una clave de sitio de producción en remove this banner.