Os Básicos de Expertos da Escrita em NTL+

Introdução

Este artigo é destinado a programadores que estão planejando para escrever seu primeiro experto em NTL+. Que vai abranger uma série de características de criação de expertos o conhecimento de que ajudará a evitar muitos erros e economizar o tempo da escrita e depuração de script (o termo 'script' na NTL é comum a três tipos de programas: os expertos, indicadores e utilitários).


Criando um experto

Para criar um novo experto vá para a janela Navigator botão direito do mouse sobre a pasta Advisors e escolha a função Create a partir do contexto de menu. Você será oferecido para digitar um nome do novo experto. Por favor, note que o nome do experto cumpra as regras padrão para nomes de arquivos de sistema operacional de Windows: um nome não pode conter os seguintes caracteres: *|\:"<>?/ .


Se você cria um novo experto, vai ver o modelo inicial com três funções: Initialize (), Run (), Deinitialize (). Cada uma destas funções é executada num determinado momento da vida do expero. Assim o programador não tem necessidade de chamá-los, como o processo é automático.


A função Initialize() é executada logo após o início de um experto e é destinado para inicializar parâmetros. É importante ressaltar que as operações comerciais não sejam efectuadas em função Initialize () como no momento de seu lançamento, podem não ser os valores dos parâmetros de negociação (por exemplo, os preços de Bid e Ask, dados de contas , informações sobre as posições e ordens) .


Sempre que um tique vem, a função Run () é chamada; em que deve ser o código de script principal. Neste código é possível analisar a actual situação do mercado, tomar decisões sobre a necessidade de realizar operações de negociação ou fazer cálculos matemáticos. O processamento de dados para cada tique não deve exceder 10 segundos, caso contrário o programa parará automaticamente o usuário experto.


Quando o experto pára é chamado a função DeInitialize()que executa algumas das etapas finais antes de parar o script. Muitos scripts não requerem quaisquer medidas de acordo com inicialização e finalização caso em que as funções Initialize() e DeInitialize() podem ser deixadas em branco ou completamente removidas do script (o terminal não vai chamá-los).


Elaboração de um algoritmo e escrita de um código de experto

A primeira etapa é o desenvolvimento de um algoritmo que será executado por seu experto de negociação. Este algoritmo deve ter uma estrutura clara, comentários detalhados o que facilitará ainda mais a depuração, modificação e otimização.


É necessário definir os critérios de negociação para a abertura de posições longas e curtas, as condições em que as posições serão fechadas, e como o número de posições abertas será controlado e limitado. Se o experto define ordens pendentes (incluindo OCO e os de ativação), você deve primeiro considerar a possibilidade de remover ou modificar ordens já feitas.


O sucesso de experto depende da escolha certa dos critérios de negociação para abrir / fechar posições e definir ordens. Dessa forma, o desenvolvimento da estratégia é essencial para um bom experto. Critérios comerciais podem ser criados com base em indicadores técnicos ,análise de nível dos preços e outros cálculos com base no seu entendimento de negociação eficaz.


Não se esqueça de prever a possibilidade de sua intervenção manual durante o experto: o que acontece se o experto abre posição, e você fechá-lo no terminal? Pense, não vá o experto em qualquer condição que não está prevista o que levará um mau funcionamento.


Para o funcionamento adequado será necessário analisar o estado das posições abertas e ordens colocadas em cada tique. Lhe ajudaram as propriedades Deals.Total e Orders.Total que retornam o número de posições abertas e ordens colocadas bem como métodos Deals.Select () e Orders.Select () para selecionar uma posição ou uma ordem.


Também vale a pena prestar atenção à recuperação do trabalho do expert, após o reinício do terminal: vai para o mesmo estado em que estava para reiniciar? Considere as possíveis situações em que entre as reinicializações algumas posições podem ser fechadas por stop-loss ou take-profit, e as ordens podem ser executadas o que implicará a abertura de novas posições.


No experto você deve prever ações sobre a ocorrência de erros padrões e situações, por exemplo, a falta de fundos para as posições de abertura ou uma tentativa de definir as ordens que estão muito próximas do preço atual.


O acesso aos dados de status da conta pode ser concedido através de objeto de Account e suas propriedades. Por exemplo, a propriedade Account.Balance é usado para obter o saldo da conta corrente e a propriedade Account.MarginFree – para obter o valor da margem livre.


int Run() { // inicialização de volume variável - o volume em unidades da moeda base int volume = 10000; if(Account.MarginFree < volume/Account.Leverage) return -1; }

Observe a linha return -1, a execução deste operador pára a força de experto.


Trabalho com a história de cotações

O uso de timeseries permite que você obtenha a história das cotações do símbolo atual, a fim de analisar uma determinada situação do mercado passado. Timeseries representam um grupo de arrays: Open [] - abertura de preços de bar, Close [] - fechamento de preços de bar , High [] - preços mais elevados de bar, Low [] - preços de bar mais baixos, Time [] - hora de abertura de bar e Volume [] - o volume de tique de bar (o número de tiques por bar). Todos os timeseries são relevantes no gráfico de símbolos, em que o experto está em execução para o período atual. Em timseries funciona a indexação reversa: o último elemento (último em termos de tempo) tem um índice de 0, e o primeiro elemento - um índice igual a Bars.Total (Chart.Symbol, Chart.Interval) -1.


Se é necessário obter dados para qualquer outro símbolo, você precisa usar os objetos de Bars. Seus métodos Open (), High (), Low (), Close (), Volume (), Time () são semelhantes aos métodos correspondentes de timeseries , a única diferença é que você deve especificar o símbolo, o tamanho do bar (intervalo, prazo) eo número do bar que você deseja obter valores.Antes de executar um script, você precisa se inscrever para todos os símbolos com os quais o script trabalha. Para fazer isso, abra a janela MarketWatch, botão direito do mouse num campo vazio, selecione Subscribe no menu de contexto, clique sobre os símbolos desejados e clique em "OK" .


Em expertos pode ser necessário determinar quando um novo bar se abre ou quando a formação de um bar anterior está completa. Para isso, você pode usar o Volume array global. O valor do Volume [0] é aumentado por 1 no cada tique e redefine a 1 após o primeiro tique de um novo bar. Assim, para determinar o momento de um novo bar de abertura pode ser usada a seguinte construção:


int Run() { if(Volume[0]==1) { //Algum código que executa durante a abertura de novo bar. } }

O trabalho de Run () pode ser finalizado facilmente usando o operador de retorno para todos os valores do Volume [0] com exceção de 1:


int Run() { if(Volume[0]>1) return (0); // Algum código que executa durante a abertura de novo bar. }

Outro método alternativo é analisar o tempo de abertura de bar- se o prazo para os dois últimos tiques corresponde você pode sair da função, usando o operdaor return(0). Na formação de um novo bar, temos diferentes valores do Time [0] sobre os tiques atuais e anteriores - isso significa a abertura de novo bar.


datetime lasttime=0; int Run() { if(lasttime == Time[0]) return(0); // Algum código que executa durante a abertura de novo bar. lasttime = Time[0]; }

Testando um experto

O Advisor Tester destina-se a avaliar a eficácia de expertos e verificar o seu funcionamento. Para iniciar o testador, selecione View -> Advisor Tester no menu principal. Existem guias para alternar entre as seções do testador no topo da sua janela:


  • Parameters – parâmetros de testador
  • Results – apresentação tabular das informações sobre as posições
  • Equity Graph – mudança de equilíbrio e equidade
  • Journal – arquivo de revista

Parameters

Em Parameters você pode especificar os seguintes parâmetros que têm impacto sobre processo de teste:


  • The drop-down Advisor list – a escolha de um conselheiro para o teste.
  • Properties button – chamando os parâmetros de expertos para edição. Se o experto não tem parâmetros, especificados com a palavra-chave extern então o botão estará desativado.
  • Symbol – símbolo para testar *
  • Interval – intervalo (período) para o teste.
  • Spread – escolha valores de spread. A opção Current spread corresponde ao valor actual do spread. Em Spread você pode inserir qualquer não-negativo e arbitrário valor.
  • Method – o método de teste. Pode ser uma das seguintes opções Control Points ou Open Price Only. Ao selecionar Control points 4 tiques são geradas automaticamente para cada bar (a seqüência é dada além disso). Os tiques correspondem aos preços Open, Low, High, Close dos bares com o preço de abertura inferior ao preço de fechamento; para bares, com o preço de abertura superior ao preço de fechamento- Open, High, Low, Close.
    img
    Para o método Open Prices Only todas as negociações são executadas apenas sobre os preços de abertura. Os elementos timeseries com índice zero serão igual ao Open[0] = High[0] = Low[0] = Close[0], s valores dos índices de não- zero do timeseries coincidem com os valores correspondentes de timeseries para o método Control Points.
  • A caixa de seleção Limit Dates é usado para limitar o intervalo de datas para o teste.
  • Campos de datas de entrada From e To são usadas para especificar um intervalo de datas para os testes. Os valores padrão correspondem à faixa de história carregada para o símbolo especificado e intervalo.
  • Initial Deposit – depósito inicial no início do teste.
  • A caixa de seleção Enable visual mode é usada para exibir um gráfico com abertura e fechamento dos posições , bem como momentos de ordens de ajuste para a última posição de teste enquanto o teste está em andamento.
  • A caixa de seleção Enable expert logs é usada para imprimir a saída da função System.Print () é usada para imprimir a saída da função System.Print () para a guia Journal.
  • O botão Start / Stop começa e termina o teste.

Verificação das caixas de seleção Enable visual mode e Enable expert logs afeta a velocidade de teste, por isso recomenda-se a marcá-los somente quando é necessário.


* Teste de expertos em várias moedas não é totalmente suportado no momento. Se você testa o assessor que trabalha com promoções em várias moedas ea gama história carregada,citações desses símbolos não correspondem a oferta ea perguntar preços, timeseries e valores retornados pelos métodos de objetos de Bars podem der zero.


Resultados

Na guia Resultados exibe informação sobre todas as posições abertas e fechadas durante o processo de teste. . Na parte superior é uma tabela com posições fechadas . Exibe a seguinte informação:


  • Number # – um número ordinal de uma posição fechada. # 1 é atribuído ao primeiro acordo fechado, # 2 - para o segundo, etc .
  • Deal ID – identificador de posição fechada
  • Symbol – símbolo em que a posição se abriu
  • Volume1 - o volume de posição nas unidades monetárias de base
  • Volume2 – o volume de posição nas unidades de cotações de moedas
  • Open rate – preço de abertura
  • Open time – tempo de abertura
  • Stop loss – nível de stop loss (exibido somente quando é especificado)
  • Take profit – take profit (exibido somente quando é especificado)
  • Last swap – swap de posição atual
  • Rate close – preço de fechamento
  • Time close – tempo de fechamento
  • Profit – lucro da posição
  • Balance – saldo após o fechamento da posição *.
  • Equity – patrimônio após a posição é fechada *

* Estas colunas são exibidas em modo Show extended columns.Este modo é ativado através do menu de contexto da tabela.


A tabela inferior mostra as posições que não foram fechadas como no final do teste. Os títulos das colunas coincidem com títulos das Closed Positions exceto para as colunas que faltam relacionados com posições fechadas.


A linha de status inferior exibe informações sobre balanço, patrimônio, requisitos de margem e margem livre no momento da conclusão do teste.


Equity graph

O gráfico exibe a alteração do balanço e de patrimônio dependendo do número de posição fechada. Dê um duplo clique no gráfico mostra a posição correspondente na tabela de posições fechadas Closed positions.


Journal

O Journal exibe a saída de texto da função System.Print () usado em experto.Se na guia Parameters a caixa de seleção Enable expert logs está desligada ,a revista só terá comandos start e stop de expertos.


Depuração de script

A depuração de script é feito raramente sem uso da função System.Print() que exibe informações sobre guia Journal da janela Toolbox (ou na guia Journal da janela do tester). No entanto, é útil saber que quando você executa um experto, as informações exibidas também são duplicadas no arquivo de log username\Documents\NeTTradeX Advisors\logs. Os arquivos de log podem ser abertos com um editor de texto que suporta o formato txt. O arquivo de log contém registros com o tempo de um evento, código de retorno e mensagem de texto.


A adição de propriedades de processamento de valor System.LastError permite analisar a situação quando o experto não está funcionando corretamente. Esta função permite guardar o número do último erro associado às operações comerciais. Esta propriedade tem uma característica importante: cada seguinte operação comercial altera a propriedade de acordo com o resultado de seu trabalho. Assim, se você tem um script que envia um pedido de acordo com um parâmetro errado e depois coloca uma ordem com os parâmetros corretos, o valor zero (sem erro) será registrado no System.LastError.Portanto, valor da propriedade System.LastError deve ser recebido ANTES da próxima operação de negociação (no nosso caso, colocar uma ordem) então será armazenado o código de erro ocorrido durante a transação. Para uma descrição de texto do erro é usado o método System.ErrorDescription (),que retorna a linha com uma descrição do problema; o único valor de entrada representa o código de erro numérico recebido por System.LastError.


Quando a depuração está em curso a propriedade IsStopped de objeto System pode também ser útil. Tem o valor true se a execução do programa no último tique demora mais do que 7 segundos. Com a ajuda desta propriedade o programador é informado que o script em breve será forçosamente parado ( em 3 segundos ) assim algum tempo é dado para que o programa possa realizar determinadas operações relacionadas com a conclusão correta do script.


Resumo

Em conclusão, deve notar que o estabelecimento de um experto pode ser dividido em duas fases principais: o desenvolvimento de um algoritmo e sua codificação. A primeira fase e mais cuidadosa e elaborada e a execução da segunda fase é mais fácil e rápida. O artigo enumera algumas questões importantes concertando em criação de algoritmos e soluções práticas que permitem simplificar seu primeiro contato com NTL + e suas capacidades.