- Trading
- Trading Automático
- Asesores para NetTradeX
- Los Fundamentos de la Escritura de Expertos en NTL+
Los Fundamentos de la Escritura de Expertos en NTL+
Introducción
Este artículo está dirigido a programadores que están pensando en escribir su primer experto en NTL+. Se centrará en una serie de características de creación de los expertos, el conocimiento de lo que ayudará a evitar muchos errores y ahorrar el tiempo dedicado a escribir y depurar la secuencia de comandos (el término "script" en NTL+ es común a los tres tipos de programas: expertos, indicadores y utilidades).
Creación de un experto.
Para crear un nuevo experto, vaya a la ventana Navigator, haga clic en la carpeta Advisors seleccione la función Crear en el menú contextual. Se le ofrecerá la posibilidad de introducir un nombre para el nuevo experto. Tenga en cuenta que el nombre del experto está conforme a las reglas estándar para utilizar nombres de archivos de Windows: un nombre no puede contener los siguientes caracteres: *|\:"<>?/ .
Después de crear un archivo experto, vera la plantilla inicial con 3 funciones: Initialize(), Run(), DeInitialize(). Cada una de estas funciones se ejecuta en un determinado momento de la vida del experto. Por lo tanto el programador no tiene necesidad de llamarlos, ya que el proceso es automático.
Inmediatamente después de comenzar un experto, la función Initialize() se ejecuta justo después del inicio de un experto y está pensado para los parámetros de la inicialización. Vale la pena señalar que las operaciones comerciales no se deben realizar en la función Initialize(), ya que los valores de los parámetros comerciales (por ejemplo, los precios Bid y Ask, datos de cuentas, información sobre las posiciones y ordenes) no se pueden determinar en el momento que Initialize() está en marcha.
Cada vez que una señal llega, Run() es llamada; y es la función que se supone contenga el código del script principal. En este código, es posible analizar la situación actual del mercado, tomar decisiones sobre la necesidad de llevar a cabo de operaciones comerciales, ya sean también, cálculos matemáticos. El procesamiento de datos por cada señal no debe superar los 10 segundos, de lo contrario el programa se detendrá automáticamente.
Cuando un experto es detenido, el Delnitialize () es llamado, a tomar algunos pasos finales antes de la parada del script. Muchos scripts no requieren medidas en virtud de la inicialización y desinicialización, en cuyo caso las funciones Initialize() y DeInitialize() se pueden dejar en blanco o eliminar por completo de un script (el terminal no los llamara).
Elaboración de un algoritmo y escritura de un código experto.
La primera etapa es el desarrollo de un algoritmo, que será dirigido por el experto de comercio. Este algoritmo debe tener una estructura clara y comentarios detallados, que facilitará aun más la depuración, modificación y optimización..
Es necesario definir los criterios comerciales para la apertura de posiciones largas y cortas, las condiciones en que se cierran dichas posiciones, y como el número de posiciones abiertas serán controladas y limitadas. Si el experto establece ordenes pendientes (incluyendo OCO y los de activación), se debe considerar en primer lugar, la posibilidad de eliminar o modificar los pedidos ya realizados.
El éxito de un experto en su conjunto, depende de la elección correcta de los criterios comerciales para abrir/ cerrar posiciones y establecer ordenes. De esta manera, el desarrollo de la estrategia es esencial para un buen experto. Los criterios comerciales pueden ser creados sobre la base de indicadores técnicos, análisis de los niveles de precios y otros cálculos basados en su comprensión para una negociación efectiva.
Cuidado con la intervención manual y con el funcionamiento de un experto:¿y si el experto abre una posición, y usted la cierra en la terminal? Considere que el experto puede cambiar cualquier suceso imprevisto, lo que dará lugar a un mal funcionamiento.
Para un correcto funcionamiento, Ud. tendrá que analizar el estado de las posiciones abiertas y las ordenes colocadas en cada tick. De gran utilidad serán las propiedades Deals.Total y Orders.Total que controla el número de posicines abiertas y ordenes puestas, y los métodos Deals.Select() y Orders.Select() que se utilizan para la elección de una posición o una orden.
Vale también prestar atención a la recuperación de la labor del experto, en la reanudación de la terminal: si se cambia a la misma condición que tenía antes del reinicio. Tener en cuenta las situaciones en las que algunas posiciones entre reinicios pueden ser cerradas por el stop-loss o take-profit, y las órdenes pueden ser activadas, lo que supondrá la apertura de nuevas posiciones.
Usted debe prever acciones en la ocurrencia de errores y situaciones normales, por ejemplo, la falta de fondos para las posiciones de apertura o de un intento de establecer órdenes que están muy cerca del precio actual.
El acceso a los datos del estado de cuenta se puede conceder a través del objeto Account y sus propiedades. Por ejemplo, la propiedad Account.Balance se utiliza para obtener el saldo de la cuenta corriente, y la propiedad Account.MarginFree para obtener la cantidad de margen libre.
Tenga en cuenta la línea de retorno -1, la ejecución de este operador detiene el experto a la fuerza.
Trabajar con el historial de cotizaciones.
El uso de series temporales le permite obtener el historial de la cita del símbolo actual, con el fin de analizar una determinada situación del mercado pasado. Las series de tiempo representan un grupo de matrices: Open[] – precios de la barra de apertura, Close[] – precios de la barra de cierre, High[] – barra de precios más alta, Low[] – barra de precios más baja, Time[] – apertura de la barra de tiempo y Volume[] – volumen de ticks por barra (número de ticks por barra). Todas las series de tiempo son relevantes al grafico del símbolo, en el que se ejecuta el experto, y el marco de tiempo actual. Las series de tiempo tienen una indización inversa: el último elemento- un índice igual a Bars.Total(Chart.Symbol,Chart.Interval)-1.
Si fuese necesario obtener datos para cualquier otro símbolo, Ud. tendrá que utilizar el objeto de barras. Sus métodos open (), High (), Low (), Close (), Volume (), Time () son similares a los correspondientes métodos de series temporales, siendo la única diferencia que se debe especificar en el símbolo, el tamaño de la barra (intervalo, plazo) y el número de la barra que se desea obtener. Antes de ejecutar una secuencia de comandos, debe suscribirse a todos los símbolos de ella para trabajarla. Para ello, abra la ventana MarketWatch, haga clic en un campo vacio, seleccione Subscribe en el menú contextual, haga clic en los símbolos que desee y pulse el botón "OK".
En los expertos, es posible que Ud. necesite cuando determinar si una nueva barra se abre o cuando la formación de una barra anterior se ha completado. Para ello, puede utilizar la matriz global de Volume. El valor del Volumen [0] se incrementa en uno de cada tick y se restablece a 1 después de la primera señal de una nueva barra. Por lo tanto, para determinar el momento de apertura de una nueva barra se puede utilizar la siguiente construcción:
El trabajo de Run() puede terminarse usando el operador return para todos los valores para Volume[0] a excepción de 1:
Otro método alternativo es analizar el tiempo de apertura de la barra, el plazo para los dos últimos ticks, para poder salir de la función utilizando el operador return(0). En la formación de una nueva barra, obtenemos diferentes valores de Time[0] en los ticks actuales y anteriores- esto significa una nueva apertura de barra.
Probando un experto
El Advisor Tester está destinado a evaluar la eficacia de expertos y comprobar su funcionamiento. Para iniciar el probador, seleccione View -> Advisor Tester en el menú prncipal. Hay fichas para cambiar entre las secciones del probador en la parte superior de su ventana:
- Parameters – parámetros del probador
- Results – presentación tabular de la información sobre las posiciones
- Equity Graph – cambio de balance y equidad
- Journal – archivo del diario
Parámetros
En la ficha Parameters, Ud. puede especificar los siguientes parámetros que tienen un impacto en el proceso de prueba:
- La lista desplegable Advisor – elegir un asesor para la prueba.
- Botón de Propiedades – llamar a los parámetros de los expertos para su edición. Si el experto no tiene parámetros, se especifica con la palabra clave extern, entonces se desactivará el botón.
- Symbol – símbolo para la prueba*.
- Interval – intervalo (plazo) para la prueba.
- Spread – elección del valor del spread. La opción Current spread corresponde al valor actual del spread. También puede introducirse cualquier valor no negativo en el campo Spread.
- Method – método de prueba. Puede ser uno de las opciones siguientes Control Points o Open Price Only. Al elegit Control points 4 ticks se generan automáticamente para cada barra (la secuencia se da más adelante). Los ticks corresponden a los precios de Open, Low, High, Close para barras con el precio de apertura inferior que el precio de cierre; para barras con el precio superior que el de cierre – Open, High, Low, Close. Para el método Open Prices Only, todas las operaciones se hacen solo con los precios de apertura. Los siguientes elementos de series temporales en el índice cero serán iguales entre si Open[0] = High[0] = Low[0] = Close[0], los valores de índices no cero de las series temporales coinciden con los valores correspondientes de series temporales para el método Control Points.
- La casilla Limit Dates se utiliza para activar una limitación para el rango probado de las mismas.
- Los campos From y To se utilizan para especificar el intervalo de fechas para las pruebas. Los valores por defecto corresponden al rango de historias cargadas para el símbolo e intervalo especificado.
- Initial Deposit – el depósito inicial al comienzo de las pruebas.
- La casilla Enable visual mode se utiliza para mostrar un grafico con la apertura y cierre de las posiciones marcadas, así también como los momentos de ajustes de los pedidos de la ultima posición de prueba, mientras que la misma se encuentre en curso.
- La casilla Enable expert logs se utiliza para imprimir la salida de la función System.Print() a la barra Journal.
- El botón Start/Stop inicia y detiene la prueba.
El chequeo de Enable visual mode y Enable expert logs afecta la velocidad de prueba, así que es recomendable marcarlos solo cuando sean necesario..
* Las pruebas de los expertos de multidivisas por el momento, no son totalmente compatibles. Si Ud. prueba el asesor que trabaja con operaciones con varias divisas y la historia cargada de cotizaciones no corresponde a los precios bid y ask, las series temporales y los valores devueltos por los métodos del objeto Bars pueden ser cero.
Resultados
La pestaña Resultados muestra la información sobre todas las posiciones abiertas y cerradas durante el proceso de prueba. La tabla con posiciones cerradas se encuentra en la parte superior. La misma muestra la siguiente información:
- Number # – Un numero ordinario de una posición cerrada. # 1 se asigna a la primera oferta cerrada, # 2 a la segunda, etc.
- Deal ID – Identificador de posición cerrada
- Symbol – símbolo en el que se abrió la posición
- Volume1 – volumen de la posición en la moneda base
- Volume2 – volumen de la posición en las unidades de moneda cotizada
- Open rate – precio de apertura
- Open time – tiempo de apertura
- Stop loss – nivel de stop loss (se muestra solo cuando se especifica)
- Take profit – nivel de take profit (se muestra solo cuando se especifica)
- Last swap – swap de la posición actual
- Rate close – precioc de cierre
- Time close – tiempo de cierre
- Profit – ganancia de la posición
- Balance – balance despues de cerrar la posición *
- Equity – equity despues de cerrar la posición *
* Estas columnas se muestran en el modo Show extended columns. Este modo se puede activar a través del menú contextual de la tabla.
La tabla inferior muestra las posiciones que no se cerraron como final de la prueba. Los encabezamientos de las columnas coinciden con los títulos de las columnas de la tabla de Posiciones Cerradas, a excepción de las columnas faltantes vinculadas con las posiciones cerradas.
La tabla de estado inferior, muestra información sobre el balance, equidad, los requisitos de margen y el margen libre del momento en que la prueba se ha completado.
Gráfico de Equity
El grafico muestra el cambio del balance y equidad, en función del número de una posición cerrada. El doble clic en el gráfico muestra la oeración relevante en la tabla de Closed positions.
Journal
La pestaña Journal (Diario) muestra el texto de salida de la función System.Print() usada en un experto. Si la casilla Enable expert logs en la tabla Parameters se encuentra desactivada , el Diario solo tendrá los comandos iniciar y detener el experto.
Depurando el Script
La depuración del Script se realiza con poca frecuencia sin utilizar la función System.Print(), que muestra información sobre la pestaña Journal de la ventana Toolbox (o en la pestaña Journal de la ventana del probador). Sin embargo, es muy útil saber que cuando se ejecuta un experto, la información que se muestra, también es duplicada en el archivo de registro, dentro de la username\Documents\NeTTradeX Advisors\logs. Los archivos de registro se pueden abrir con cualquier editor de texto compatible con el formato txt. El archivo contiene información guardada con el tiempo de un evento, el código de retorno y un mensaje de texto.
Añadir un procesamiento de valor para la propiedad System.LastError le permite analizar la situación en la que él tiene un mal funcionamiento. Esta propiedad almacena el código del último error asociado con las operaciones comerciales. Esta propiedad tiene una característica importante: cada operación de comercio posterior cambiará la propiedad de acuerdo con el resultado de su trabajo. Por lo tanto, si usted tiene un script que realiza una posición con parámetros incorrectos y luego coloca una orden con parámetros validos, el valor cero (sin error) se registrará en el System.LastError. Por los tanto, el valor de la propeidad System.LastError debe ser recibido antes de la siguiente operación de comercio (en este caso, la colocación e una orden), por lo que va a almacenar el código del error producido durante el proceso de la realización de la operación. El método System.ErrorDescription() se utiliza para recibir una descripción textual de un error, trayendo la línea con un texto descriptivo del problema, el único valor de entrada que representa el código del error numérico recibido vía System.LastError.
Cuando la depuración está en marcha, la propiedad IsStopped del objeto System del sistema tambien nos puede ser útil. Tiene el valor verdadero, si la ejecución en el último tick del programa tomó más de 7 segundos. Con la ayuda de esta propiedad, se le informa al programador de que el script será detenido en la brevedad (después de 3 segundos más), con lo que se da un tiempo para que el programa pueda realizar ciertas operaciones relacionadas con la realización correcta de los scripts.
Resumen
En conclusión, debe señalarse que el proceso de creación de expertos se puede dividir en dos etapas esenciales: El desarrollo de un algoritmo y en su codificación. La primera etapa se lleva a cabo de una manera más complicada, pero la segunda es más fácil y más rápida. El presente artículo ha cubierto algunos temas dedicados a la creación de algoritmos y soluciones prácticas que permiten simplificar el primer contacto que Ud. tendrá con el NTL+ y sus capacidades para escribir expertos de comercio.