Creación de Indicadores del usuario | Trading Programado | NTL+ | IFCM España
IFC Markets: CFD Bróker en línea

Fundamentos de Creación de Indicadores del Usuario

Introducción

El presente artículo ha sido escrito con el fin de explicar e ilustrar los principios de la creación de indicadores del usuario y examinar las dificultades que los programadores puedan tener al dar sus primeros pasos en el desarrollo de NTL + (la lengua NetTradeX).


En la elaboración del algoritmo de un indicador del usuario, Ud. tendrá que determinar cómo se calculan y se muestran en la pantalla los valores que se escriben en el búfer del indicador. La correcta formación de estos valores es el objetivo final de aplicación de los indicadores.


Como ejemplo, vamos a crear un indicador que muestra la diferencia entre el número de barras, con el precio de cierre más alto que el precio de apertura y el número de barras, con el precio de cierre más alto que el precio de apertura, para los últimos intervalos. Vamos a mostrar nuestro indicador como un histograma en una ventana separada.


Escritura del Código Script

El algoritmo que vamos a usar es simple y lo suficientemente intuitivo para comprobar fácilmente el funcionamiento del indicador grafico. Analizaremos las barras anteriores n para cada i-bar y la forma de estadística, donde estaremos sumando 1 al valor resultante, si la barra se levanta y restando 1 en caso de que caiga el bar.

NTL+ (the NetTradeX Language)

Examinemos el código del indicador:


En primer lugar, hay que declarar todas las variables que se utilizan en nuestro indicador.

#set_indicator_separate
double ExtMapBuffer1[];
int ExtCountedBars=0;
extern int period = 10;

El #set_indicator_separate es una directiva de preprocesador que indica que el grafico se mostrará en una ventana sin solaparse con los principales gráficos de precios. La siguiente línea declara la colección global ExtMapBuffer1 donde se almacenarían los valores de tampón indicadores. Cabe señalar que no se especifica el tamaño de la matriz, ya que el propio compilador asignará la cantidad de memoria necesaria. El ExtMapBuffer1 realmente almacena las ordenadas de los puntos incluidos en la tabla, con sus abscisas que se definen por el índice de los elementos de la matriz. Luego inicializamos el valor de la variable ExtCountedBars a 0, sino que almacenará el número de barras ya calculadas. Por lo tanto no habrá necesidad de realizar cálculos de rutina para todas las barras, lo que acelera en gran medida del cálculo de los valores de los indicadores, así como el movimiento de la tabla del indicador. La siguiente línea declara el período variable global que almacena el número de intervalos, en el que el indicador calcula sus estadísticas. Tenga en cuenta que el uso de modificador externo nos permite cambiar el parámetro de tiempo por medio de las propiedades del indicador sin necesidad de recopilación.


Consideremos la función Initialize(), en la que se especificará la configuración básica de nuestro indicador.


int Initialize() { Indicator.SetIndexCount(1); Indicator.SetIndexBuffer(0,ExtMapBuffer1); Indicator.SetIndexStyle(0,ltHistogram,lsSolid,5,clrBlue); return(0); }

El método SetIndexCount del objeto indicador, establece la cantidad de buffers para los valores de los indicadores. Tenemos un tampón con los valores ExtMapBuffer1 values, por lo que especificar 'uno' como el único parámetro. También tendremos que vincular el número de búfer en una matriz con los valores de búfer. Este enlace se define en la línea del Indicator.SetIndexBuffer(0,ExtMapBuffer1), en la que se especifica que las propiedades del indicador de cero se utilizan para representar los valores almacenados en la memoria intermedia de búfer ExtMapBuffer1. En la línea siguiente, hemos puesto las propiedades para nuestro indicador. El primer parámetro del método SetIndexStyle es el numero del búfer, lo que representa el valor "0" que especificamos en el SetIndexBuffer. El segundo parámetro define el tipo de dibujo- un histograma. En el tercer parámetro, se especifica el estilo lsSolid (en realidad, aquí se puede especificar cualquier valor, ya que el valor de este parámetro solo afecta a los gráficos de líneas y un bar con espesor 1). En los siguientes parámetros, establecemos un espesor 5 de la línea y el color azul con el correspondiente clrBlue constante(también podemos especificar el color en formato RGB, por ejemplo, 0x0000FF).


Luego viene la función Run() realiza comprobaciones básicas y ejecuta la función draw() de usuario, que desarrolla todo el cálculo..


int Run() { ExtCountedBars=Indicator.Calculated; if (ExtCountedBars < 0) { System.Print("Error"); return(-1); } draw(); return(0); }

Almacenamos en variable global ExtCountedBars el número de barras que no han cambiado desde la última llamada. Ya hemos calculado estos valores, por lo que no tienen que volverse a calcular de nuevo. A continuación, determinamos que dejamos de reproducir el indicador en ExtCountedBars< 0. Luego llamamos la función draw() que calculará los valores y los localizará en el buffer del indicador.


void draw() { int pos=Chart.Bars-ExtCountedBars-1; int value; while(pos>=0) { value=0; for(int i=pos;i < pos+period && i < Chart.Bars-1;i++) { if(Open[i] < Close[i]) value+=1; else value-=1; } ExtMapBuffer1[pos]=value; pos--; } }

En la línea 'int pos=Chart.Bars-ExtCountedBars-1' se determina la posición de partida para el cálculo de los valores que se mueven a partir de datos anteriores a este último. Con el numero de barras por un total de Chart.Bars, el elemento más lejano tendrá el índice Chart.Bars-1; teniendo en cuenta el número de las barras ya calculadas, El índice será Chart.Bars-ExtCountedBars-1. El valor variable se utiliza para la recogida de estadísticas. Entonces en el ciclo de ChartBars-ExtCountedBars- 1 a 0, recogemos la estadística para cada barra pero no para los del posiciones de períodos anteriores(no hay necesidad de calcular los valores para los datos sin cargar).


Ponemos todos lo códigos juntos:


#set_indicator_separate double ExtMapBuffer1[]; int ExtCountedBars=0; extern int period = 10; int Initialize() { Indicator.SetIndexCount(1); Indicator.SetIndexBuffer(0,ExtMapBuffer1); Indicator.SetIndexStyle(0,ltHistogram,lsDot,5,clrBlue); return(0); } int Run() { ExtCountedBars=Indicator.Calculated; if (ExtCountedBars< 0) { System.Print("Error"); return(-1); } draw(); System.Print("ExtCountedBars="+ExtCountedBars); return(0); } void draw() { int pos=Chart.Bars-ExtCountedBars-1; int value; while(pos>=0) { value=0; for(int i=pos;i< pos+period && i< Chart.Bars-1;i++) { if(Open[i]< Close[i]) value+=1; else value-=1; } ExtMapBuffer1[pos]=value; pos--; } }

Ahora vamos a hacer una ligera mejora en el indicador: las columnas negativas se muestran en un color, las positivas, en otro. Al mismo tiempo, cada columna también tendrá dos colores. Para esta tarea, necesitamos 4 buffers.


#set_indicator_separate double ExtMapBuffer1[]; double ExtMapBuffer2[]; double ExtMapBuffer3[]; double ExtMapBuffer4[]; int ExtCountedBars=0; extern int period = 10; int Initialize() { Indicator.SetIndexCount(4); Indicator.SetIndexBuffer(0,ExtMapBuffer1); Indicator.SetIndexStyle(0,ltHistogram,lsDot,5,clrBlue); Indicator.SetIndexBuffer(1,ExtMapBuffer2); Indicator.SetIndexStyle(1,ltHistogram,lsDot,5,clrGreen); Indicator.SetIndexBuffer(2,ExtMapBuffer3); Indicator.SetIndexStyle(2,ltHistogram,lsDot,5,clrRed); Indicator.SetIndexBuffer(3,ExtMapBuffer4); Indicator.SetIndexStyle(3,ltHistogram,lsDot,5,clrLime); return(0); } int Run() { ExtCountedBars=Indicator.Calculated; if (ExtCountedBars< 0) { System.Print("Error"); return(-1); } draw(); return(0); } void draw() { int pos=Chart.Bars-ExtCountedBars-1; int value; while(pos>=0) { value=0; for(int i=pos;i < pos+period && i < Chart.Bars-1;i++) { if(Open[i] < Close[i]) value+=1; else value-=1; } if(value>0) { ExtMapBuffer1[pos]=value; ExtMapBuffer2[pos]=0; ExtMapBuffer3[pos]=1; ExtMapBuffer4[pos]=0; } if(value==0) { ExtMapBuffer1[pos]=0; ExtMapBuffer2[pos]=0; ExtMapBuffer3[pos]=0; ExtMapBuffer4[pos]=0; } if(value < 0) { ExtMapBuffer1[pos]=0; ExtMapBuffer2[pos]=value; ExtMapBuffer3[pos]=0; ExtMapBuffer4[pos]=-1; } } pos--; } }

La nueva versión del indicador con barras de colores:

 NTL+ (the NetTradeX Language)

Al escribir el código del indicador, se puede ver el mensaje "run function call failed" (llamada sin éxito de la función de ejecución). Es más probable que ocurra este error cuando los valores se almacenan en los elementos con índices no existentes. Por lo tanto, si aparece tal mensaje, hay que revisar cuidadosamente los valores para los índices de matrices de búfers.


Resumen

En el presente artículo lo hemos hecho paso a paso, a través de la creación de nuestro primer indicador. Al mismo tiempo, la aplicación se realiza de manera que el entendimiento del script en NTL+ sea simple. Aunque el indicador en sí puede ser sin uso en el comercio, la implementación técnica del indicador abordada en el artículo puede convertirse en una valiosa experiencia práctica para cualqiera dispuesto a crear uno.

Close support
Call to WhatsApp Call Back