Princípios básicos da escrita de Indicadores de Usuário

Introdução

O presente artigo foi escrito com o objectivo de explicar e ilustrar os princípios da criação de indicadores de usuários e examinar as armadilhas que os programadores podem encontrar ao dar os primeiros passos no desenvolvimento da linguagem NTL+ (the NetTradeX Language).


Para a elaboração do algoritmo de indicador de usuário você precisa determinar como os valores que serão gravados no buffer do indicador serão calculados e exibidos na tela. A formação correta desses valores é o objetivo final da implementação de indicadores.


Como exemplo vamos criar um indicador que mostrará a diferença entre o número de barras, com o preço de fechamento mais elevado do que o preço de abertura eo número de barras, com o preço de fechamento inferior ao preço de abertura, para os últimos n intervalos. Vamos mostrar o nosso indicador como um histograma numa janela separada.


Escrevendo o código de script

O algoritmo que vamos usar é simples e bastante intuitivo para verificar facilmente a operação do indicador no gráfico. Analisaremos as n barras anteriores para cada i-barra e formaremos estatística onde estaremos adicionando 1 ao valor resultante se a barra sobe deduzindo 1 no caso da barra de gotas.

NTL+ (the NetTradeX Language)

Vamos examinar o código do indicador:


Primeiro devemos declarar todas as variáveis que serão utilizadas em nosso indicador.

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

O # set_indicator_separate é uma diretiva de pré-processamento, indicando que o gráfico será exibido numa janela separada, sem sobreposição com a tabela de preços principal. A próxima linha declara o mundial variedade de ExtMap Buffer 1 onde os valores de buffer indicador serão armazenados.Note que não especificamos o tamanho da matriz como o compilador determinará a quantidade necessária de memória alocada.O array ExtMapBuffer1 efectivamente armazena as ordenadas dos pontos incluídos no gráfico, com as abcissas sendo definida pelo índice de elementos do array. Então nós inicializamos valor variável de ExtCountedBars a 0 que armazenará o número de barras já calculadas. Assim, não haverá necessidade de realizar cálculos de rotina para todas as barras o que acelera muito o cálculo dos valores do indicador, bem como o movimento do gráfico indicador. A próxima linha declara o período variável global que irá armazenar o número de intervalos, em que o indicador calcula suas estatísticas. Por favor, note que o externo uso de modificador nos permite alterar o parâmetro de período por meio das propriedades de indicador sem necessidade de recompilação.


Consideramos a função Initialize() ,que especificará as configurações básicas para o nosso indicador.


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

O método SetIndexCount do objecto Indicador define o número de buffers dos valores dos indicadores. Temos um buffer com valores de ExtMapBuffer1 de modo que especificamos 'um' como o único parâmetro . Além disso, precisaremos vincular o número de buffer e o array com os valores de buffer. Este link é definido na linha do Indicator Indicator.SetIndexBuffer ( 0, ExtMapBuffer1 ), em que é determinado que as propriedades do indicador de zero são utilizadas para desenhar os valores do buffer ExtMapBuffer1.Na linha seguinte, definimos propriedades para o nosso indicador. O primeiro parâmetro do método SetIndexStyle é o número de buffer o qual representa o valor '0 'que especificamos no SetIndexBuffer. O segundo parâmetro especifica o tipo de desenho: histograma. O terceiro parâmetro especifica o lsSolid estilo de linha (na verdade aqui podemos especificar qualquer valor, porque o valor deste parâmetro afeta apenas os gráficos de linhas e barra com espessura 1). Nos próximos parâmetros definimos a espessura 5 da linha e da cor azul usando correspondente ClearBlue (a cor também pode ser definido em formato RGB, por exemplo, 0x0000FF).


Então vem a função Run (), que realiza verificações básicas e executa uma função de usuário draw().A função draw() executa o cálculo inteiro.


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

Nos ExtCountedBars variáveis globais derrapamos o número de barras que não mudaram desde a última chamada.Nós já temos calculado esses valores para que eles não têm de ser recalculados novamente. Após determinamos que ao ExtCountedBars < 0 interrompemos a operação do indicator. Então é chamada a função draw ()que calcula os valores e colocá-los no buffer 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--; } }

Na linha «int pos = Chart.Bars-ExtCountedBars-1," definimos a posição a partir da qual começamos a calcular os valores, movendo dados de mais velho para mais novo. Com o número de barras num total de Chart.Bars o elemento mais distante terá o índice de Chart.Bars-1, tendo em conta o número de barras já calculadas, o índice será Chart.Bars-ExtCountedBars-1. Ovalor variável é usado para coletar estatísticas.Então no ciclo de Chart.Bars-ExtCountedBars-1 a 0 coletamos as estatísticas para cada barra,não mais do que um período de posição de volta (não há necessidade de calcular os valores para os dados descarregados).


Colocando todo o código junto:


#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--; } }

Agora fazemos uma ligeira melhoria do indicador: as colunas negativos serão exibidas numa cor, os positivos - na outra. Ao mesmo tempo, cada coluna terá também duas cores. Para isso precisamos de 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--; } }

A nova versão do indicador com barras coloridas:

 NTL+ (the NetTradeX Language)

Ao escrever o código do indicador, você pode ver o "run function call failed" mensagem (a função run chamada sem êxito) .Este erro é mais provável que ocorra quando os valores são armazenados em elementos com índices não-existentes. Então, se essa mensagem aparece, você precisa rever cuidadosamente os valores para os índices de array de buffer.


Resumo

No presente artigo, passo a passo, nós fizemos isso através da criação de nosso primeiro indicador. A aplicação foi feita a simplificar o entendimento script em NTL+. Talvez este indicador não é útil no comércio. A execução técnica do indicador abordado no artigo se tornará uma valiosa experiência prática para todos dispostos a criar um.