Documentação

Última atualização em 5. 5. 2015 por Mark Fric

Acrescentar novo valor estatístico

Neste exemplo, vamos ampliar o Quant Analyzer e acrescentar um novo valor estatístico.

Todos os valores estatísticos como Número de negócios, Lucro Líquido, Retorno / DD, Relação Sharpe, CAGR, etc. são implementados como snippets - uma peça de código Java que implementa alguma funcionalidade, em nosso caso, ele irá computar um novo valor no programa.
Isto significa que o programa pode ser facilmente estendido com um novo valor.

Neste exemplo, vamos criar um novo valor estatístico chamado Relação V.
É calculado como uma relação entre o saque máximo em dinheiro e o lucro mensal médio.
Essencialmente expressa quantos meses em média são necessários para recuperar do saque máximo, o valor mais alto é melhor.

Por exemplo, se o saque máximo é $500, e o lucro médio mensal é $100, a relação V é calculada como
100/500 = 0.2

Neste exemplo, mostraremos como fazer:

  • 1. Trabalhar com QuantEditor onde podemos criar novos snippets
  • 2. Criar novo valor estatístico Relação Vque será computado para cada relatório carregado no programa
  • 3. Adicione este valor às colunas disponíveis no banco de dados, para que ele seja visível também no banco de dados
  • 4. Criar uma nova visão personalizada do banco de dados com a nova coluna
  • 5. Criar um Analisador personalizado â†' Modelo de visão geral que exibe o novo valor

 

1. Trabalhando com a QuantEditor

QuantEditor é um editor integrado de trechos que você pode usar para criar/modificar novos trechos e olhar para o código fonte dos já existentes.

 

Ele pode ser iniciado a partir do programa usando o ícone QuantEditor na barra de ferramentas.

 

2. Criando um novo valor de estatísticas

Como primeiro passo, temos de criar um novo trecho que calculará nosso valor de V Ratio.

Então vamos iniciar o Quant Editor, vá até seu painel Navigator e encontre /extender/Snippets/StatsValues. Lá, clique em StatsValues com o botão direito do mouse e escolha New File action.

 

 

Nome do novo snippet VRatioValue.

QE (QuantEditor) criará um novo snippet com a estrutura necessária do código e métodos padrão.
Agora só precisamos adicionar o cálculo ao local correto e salvar o valor.


Vamos analisar um a um os métodos no corte:

dependeOn()

este método nos permite definir a dependência - se o valor que estamos tentando calcular depende de alguns outros valores estatutários que têm de ser computados mais cedo. Este é o nosso caso, precisamos de valores para o saque máximo e o lucro médio mensal computados de antemão, portanto, vamos adicioná-los a este método:

o fio público depende de() {
	retornar StatsConst.join(StatsConst.DRAWDOWN, StatsConst.AVG_PROFIT_BY_MONTH);
}

 

initCompute()

este método é chamado no início do cálculo estatístico.
Podemos usá-lo para definir valores iniciais de alguns parâmetros, mas não precisamos disso em nosso caso, por isso vamos deixá-lo vazio:

initCompute(SQStats stats, StatsTypeCombination combination, SQOrderList ordersList, SQSettings settings, SQStats statsLong, SQStats statsShort) lança Exceção {

}

 

computeForOrder()

este método é chamado para cada pedido da lista de pedidos.
Pode ser usado se calcularmos estatísticas a partir de pedidos, mas em nosso caso simplesmente fazemos uma relação de dois valores já pré-calculados, por isso vamos deixá-lo vazio também:

Compute public voidForOrder(SQStats stats, StatsTypeCombination combination, SQOrder order, SQSettings settings) lança Exceção {
}

 

endCompute()

este método é chamado no final do cálculo, ele define os valores computados no objeto SQStats que é usado no programa.
Todas as ações aqui são comentadas e fáceis de entender.

público final vazioCompute(SQStats stats, StatsTypeCombination combination, SQOrderList ordersList, SQSettings settings, SQStats statsLong, SQStats statsShort) lança Exceção {
// obter valores de drawdown e lucro médio por mês que já foram computados em seus próprios snippets
duplo drawdown = stats.getDouble(StatsConst.DRAWDOWN);
double avgProfitByMonth = stats.getDouble(StatsConst.AVG_PROFIT_BY_MONTH);

// calcular a relação V - estamos usando o método safeDivide() para evitar
// dividindo por zero erros caso o lucro médio por mês seja 0
duplo vRatio = SQUtils.safeDivide(avgProfitByMonth, drawdown);

// acrescentar o novo valor estatutário às estatísticas.
// Cada valor muito tem sua própria chave de corda única, nós chamamos a nossa "VRatio".
// nós também arredondamos este valor para duas casas decimais
stats.set("VRatio", SQUtils.round2( vRatio )));
}

É isso aí. Criamos novos valores de estatísticas que serão computados para cada relatório carregado.

Agora atingido Compilação e o novo snippet deve ser compilado sem nenhum erro.

 

3. Adicione este novo valor às colunas do banco de dados

criamos um novo valor de VRatio, que é calculado para cada relatório, mas ainda não é visível em nenhum lugar.

Se você verificar seu banco de dados ou visão geral, você não o verá lá porque ainda não foi adicionado às colunas do banco de dados.

As colunas do banco de dados também são trechos, há um trecho para cada coluna. Isto significa que é fácil adicionar uma nova coluna personalizada ao banco de dados.

Portanto, novamente, no QE Navigator abrir /extender/Snippets/DatabankColumns. Lá, clique com o botão direito do mouse e escolha Novo Arquivo, nomeie-o VRatio.

Este trecho de coluna VRatio padrão foi criado, podemos passar novamente por seus métodos.

VRatio()

este é um construtor de classes, aqui você pode especificar o nome da coluna que será visível no cabeçalho do banco de dados, a ponta da ferramenta ts e a largura.

VRatio público() {
   super();

   setName(L.t("VRatio"));

   setTooltip(L.t("VRatio"));

   setWidth(60);

}

 

getValue()

método que é usado para recuperar valor para esta coluna. Em nosso caso, o valor é armazenado em SQStats,
Portanto, primeiro temos que obter o resultado e, a partir daí, obter as estatísticas. Depois podemos obter o valor do VRatio a partir das estatísticas.

public Object getValue(SQResultadosEstratégia do grupoResultados, String dataType, String direction, String sampleType, String plType) lança Exceção {
    // obter resultado para carteira
    SQResultado resultado = estratégiaResultados.getResultado(SQConst.SYMBOL_PORTFOLIO);
    
    // obter estatísticas para carteira e a combinação correta de direção, tipo pl, tipo de amostra
    SQStats = result.getStats(direção, getCorrectPlType(plType), sampleType);
    if(stats==nulo) lançar novo StatsMissingException();
    
    // devolve o valor
    return stats.getDouble("VRatio", 0);
 }

 

displayString()

método que exibe a cadeia na célula do banco de dados. Ele obtém o valor usando nossa função getValue() e o exibe com a formatação adequada.

exibição pública StringString(SQResultadosEstratégia do grupoResultados, String dataType, String direction, String sampleType, String plType) lança Exceção {
    // recupera valor usando o método getValue()
    Duplo valor = (Duplo) getValue(estratégiaResultados, dataType, direção, modeloType, plType);
    
    retornar doisDecimalFormat(valor); // exibir o número com dois pontos decimais
}

 

Esse é todo o trecho. Podemos compilá-lo, ele deve compilá-lo novamente sem nenhum erro.
Ao fazer isso tudo, adicionamos uma nova coluna às colunas disponíveis que podem ser mostradas no banco de dados.

 

4. Criar uma visualização personalizada do banco de dados com a nova coluna

Na parte acima, criamos uma nova coluna. Para realmente vê-la no banco de dados, temos que criar uma visão que conterá esta coluna.
Os bancos de dados no Quant Analyzer são totalmente personalizáveis, você pode usar Vistas para controlar quais colunas devem ser exibidas.

Temos que criar uma nova visão que conterá nossa nova coluna VRatio. Clique no botão Gerenciar ao lado das visualizações no banco de dados. Não podemos editar a visualização padrão, então temos que criar uma nova. A maneira mais fácil de fazer é clonar a visualização padrão existente.

Clique no botão Clone isto criará uma nova visualização com as mesmas colunas da visualização padrão. Vamos dar-lhe um nome.Default + VRatioâ?" & #157;. Nas colunas Disponíveis, encontre nossa nova coluna VRatio.

Na lista da direita selecione Lucro líquido (para adicionar a nova coluna logo após o lucro líquido) e clique em > botão.

Isto adicionará a coluna às colunas nesta visão. Agora não se esqueça de clicar em Salvar mudanças para salvar com segurança nossa nova visão. Então, podemos fechar este diálogo.

Agora, quando você voltar a abrir vistas, você verá a nova vista que acabamos de definir e poderemos selecioná-la.

Agora, quando carregarmos algumas estratégias, veremos nossas novas VRatio coluna devidamente computada e exibida.

5. Criar um Analisador personalizado â†' Modelo de visão geral que exibe o novo valor

agora podemos ver nosso novo valor VRatio no banco de dados, mas e se quisermos vê-lo também na janela Análise -> Visão Geral?

Isto também é possível. Como muitas outras coisas, a guia Overview é controlada por snippets. Cada template é implementado como um snippet que torna seu próprio arquivo HTML.
Portanto, cada modelo de Visão Geral consiste de um snippet + modelo de arquivo HTML.

Temos três possibilidades de como exibir o valor na guia Visão Geral:

Edição de um snippet de Visão Geral existente (não recomendado)
podemos modificar um dos trechos padrão do sistema Overview e fazê-lo exibir o valor VRatio em vez de algum outro valor que não precisamos.
Não é recomendado, porque os trechos padrão do sistema podem ser alterados em uma atualização e suas alterações seriam perdidas.


Criação de um novo snippet de Visão Geral que utilizará o modelo existente
a segunda opção é criar um novo snippet Overview, mas usar o arquivo de modelo HTML existente. Isto tem a vantagem de que nosso novo snippet não será modificado por alguma atualização futura.
A desvantagem é que como usaremos o arquivo de modelo HTML existente, não podemos agregar novo valor lá. Só podemos exibir o VRatio em vez de algum outro valor.


Criando novo trecho de Visão Geral com novo modelo
nesta opção, faremos um novo snippet e um novo modelo de renderização HTML. Aqui somos livres para fazer tudo o que quisermos, podemos até usar HTML que mostra nosso próprio design personalizado.

Em nosso exemplo, vamos com a segunda opção - criar um novo snippet que utiliza o modelo HTML existente.

Então, novamente no QuantEditor, iremos para /extender/Snippets/OverviewTab e criar um novo snippet chamado DefaultPlusVRatio.
Isto criará um novo snippet que implementará um novo modelo para a aba Overview.

Explicaremos novamente seus métodos, mas antes de mais nada, temos que fazer uma mudança. Como basicamente queremos apenas criar uma cópia do modelo SQDefault, com apenas um valor substituído, teremos que mudar a classe pai de nosso novo snippet de OverviewTemplate para SQDefault.

Isto significa que nosso novo snippet estará usando todos os métodos do SQDefault e temos que implementar apenas o que é diferente.

Se não fizéssemos isso, teríamos que escrever o código para substituir todos os valores como é feito no snippet SQDefault.

Então editaremos a linha

classe pública DefaultPlusVRatio estende Visão GeralTemplate {

para

classe pública DefaultPlusVRatio estende o SQDefault {

 

Agora podemos olhar para o resto dos métodos.

 

DefaultPlusVRatio()

isto é construtor de classes, é chamado quando o snippet é criado. Devemos definir aqui o nome do modelo, imagem de tela e arquivo de modelo HTML.

DefaultPlusVRatio() {
setName("DefaultPlusVRatio");

// copiaremos os valores abaixo do snippet SQDefault, nosso novo snippet usará o mesmo modelo HTML
// Estes arquivos estão localizados em /settings/plugins/OverviewTab
setScreenshotName("sqdefault_screenshot.jpg");
setHtmlTemplateName("sqdefault_template.htm");

 

drawValues()

é a função principal. Ele carrega o arquivo de modelo HTML, substitui as constantes lá por etiquetas e valores adequados e o devolve ao programa.
Em nosso caso, não precisamos mudá-lo em nada.

drawValores de cordas públicas(SQResultadosEstratégia do grupoResultado, Símbolo de cordas, Combinação StatsTypeCombination) lança Exceção {
modelo = loadTemplate();
substituirValores(estratégiaResultado, símbolo, combinação);

modelo de retorno;
}

 

substituirValores()

esta função é chamada de drawValues() e substitui as constantes no modelo HTML por valores computados pelo programa - eles são armazenados em resultado -> estatísticas

vazio público substituirValores(SQResultadosEstratégia do grupoResultado, Símbolo de corda, Combinação StatsTypeCombinação) {
   Estatística SQStats = nula;
   SQResultado = nulo;

// este primeiro pars obtém os valores apropriados das estatísticas do resultado
// podemos usar o código padrão para isso
if(strategyResultado!=nulo) {
      resultado = estratégiaResultado.getResultado(símbolo);

      if(resultado!=nulo) {
         stats = resultado.getStats(combinação);
      }
   }

// aqui substituímos a constante 3_2 por nosso valor V Ratio
// se você verificar SQDefault snippet você verá que ele substitui 3_2 por R Expectancy
// então em nosso modelo mostraremos a V Ratio em vez da expectativa

   substituir("3_2", "V Ratio", stats==nulo ? NA : d2(stats.getDouble("VRatio")));

// no final, temos que chamar o método replaceValues() da classe mãe (SQDefault)
// para substituir todos os valores restantes
   super.replaceValores(estratégiaResultado, símbolo, combinação);
}

 

Isto é tudo. Agora compile este trecho e você verá um novo modelo em Análise -> Visão Geral.

Quando você mudar para ele, você verá que agora ele exibe V Ratio no lugar onde o modelo padrão SQDefault exibe R Expectancy.

 

Este foi um exemplo de como criar um novo modelo de Visão Geral que exibe nosso valor personalizado.

Se você tiver mais de um valor personalizado, pode valer a pena criar uma cópia do modelo HTML e modificá-lo para que ele tenha mais uma linha de valores.

Lembre-se, você pode colocar seu próprio arquivo no construtor de snippet em setHtmlTemplateName()
Os arquivos de modelos HTML usados nos trechos de Visão Geral estão localizados em /settings/plugins/OverviewTab/

 

Tudo isso está neste tutorial.
Demonstramos como é fácil estender o QuantAnalyzer com novos valores personalizados e como exibi-los em banco de dados e Visão Geral.

 

Este artigo foi útil? O artigo foi útil O artigo não foi útil

Assine
Notificação de
0 Comentários
Feedbacks em linha
Ver todos os comentários