Documentação

Aplicações

Última atualização em 20. 11. 2021 por clonex / Ivan Hudec

Simulação da média móvel da equidade

Neste tutorial mostraremos a você como criar e simular o controle de curvas de equidade no What If Crosscheck .

Cenários hipotéticos em StrategyQuantx é a ferramenta que lhe permite testar várias hipóteses de negociação de sua estratégia.

A função de simulação de controle patrimonial permite simular a ativação e desativação de uma estratégia com base na curva patrimonial. A hipótese é baseada na hipótese que é melhor para a estratégia comercial se seu desempenho estiver acima de sua média. É possível ler um bom artigo dedicado a este tópico aqui.

Corte acabado que você pode baixar aqui.

Passo 1 - Criar novo E se snippet

Abra CodeEditor, clique em Criar novo e escolha a opção de coluna Lista de negócios - Nomeá-lo EquityMATrading.

Isto criará um novo snippet EquityMATrading.java em pasta Usuário/Snippets/SQ/Whatif

 

Passo 2 - Definir os parâmetros do snippet

Como queremos calcular a média da equidade, precisamos de incluir um parâmetro - Período MAP  que nos permite especificar um período da média móvel.

Criar um parâmetro significa que ele será ajustável na aba Whatif em EquityMATrading em crosschecks.

 

@ClassConfig(name=""() Equity MA Trading", display="Equity MA(#MAPeriod#) Trading ")
@Help("Texto de ajuda")
classe pública EquityMATrading estende o WhatIf {
    logger final estático público = LoggerFactory.getLogger(EquityMATrading.class);
    

    @Parameter(name="MAPeriod", defaultValue="10", minValue=2, maxValue=100000, step=1)
    público no período MAPA;

Etapa 3 - Método de implementação do filtro (OrdensLista de ordens)

 

O filtro(OrderList ordens) é usado para filtrar a lista original de ordens na estratégia. OrderList  é uma classe que armazena a lista de ofícios de uma estratégia e fornece métodos para manipular com a lista de ofícios. Você pode fazer loop troght inteiro OrderList  e obtenha dados para muito Ordem  usando o método obter(índice int).

Aqui você precisa prestar atenção à forma como você faz o loop através da lista de pedidos. Em nosso exemplo, estamos usando o clássico para loop, de modo que não podemos manipular a lista de pedidos durante o loop.

Em vez disso, criamos um OrderList ol onde armazenamos os ofícios que preencheram nossas condições. Copiamos esta lista de pedidos no final do trecho para a lista de pedidos principal.

 

Passo 4 - Usando o Whatif snippet EquityMATrading

 

Para adicionar um trecho no Crosschecks você pode usar este trecho para simular o que aconteceria se você comercializasse sua estratégia se sua curva de patrimônio líquido estivesse acima de sua média móvel.

Código comentado completo do snippet

pacote SQ.WhatIf;

importação org.slf4j.Logger;
importação org.slf4j.LoggerFactory;

import com.strategyquant.lib.SQTime;
import com.strategyquant.tradinglib.ClassConfig;
import com.strategyquant.tradinglib.Help;
importar com.strategyquant.tradinglib.Order;
importar com.strategyquant.tradinglib.OrdersList;
importar com.strategyquant.tradinglib.Parameter;
importar com.strategyquant.tradinglib.WhatIf;
importar com.strategyquant.tradinglib.results.stats.comparator.OrderComparatorByOpenTime;

importar it.unimi.dsi.fastutil.objects.ObjectListIterator;

@ClassConfig(name=""() Equity MA Trading", display="Equity MA Trading (#MAPeriod#)")
@Help("Texto de ajuda")
classe pública EquityMATrading estende o WhatIf {
    logger final estático público = LoggerFactory.getLogger(EquityMATrading.class);
    
    
    @Parameter(name="MAPeriod", defaultValue="10", minValue=2, maxValue=100000, step=1)
    público no período MAPA;

    @Override
    filtro público de vazios (Ordens OrdensLista de ordens) lança Exceção {

        // Nova instância de OrdensLista de pedidos na qual armazenamos negócios que estão acima da média móvel
        OrderList newOL = nova OrderList("AboveMovingAverage");
        
        // Estamos fazendo looping através de pedidos inteirosLista de pedidos para calcular a Média Móvel
        for(int i = MAPeriod;i < order.size();i++){

            // Último pedido atual estamos decidindo se devemos ou não ir para newOL
            Order order = ordens.get(i);
    
            // obter o equilíbrio da ordem
            saldo duplo = ordem.AccountBalance;
            
            // ordens balanceadas do filtro
            se(order.isBalanceOrder()) continuar;

                soma dupla = 0;
                // calcular a média móvel do patrimônio líquido
                for(int k =1;k média do patrimônio líquido
                if(lastOrder.AccountBalance>avg) {
                    // nós adicionamos ordem.get(i) a newOL
                    newOL.add(pedido);
                }
                avg =0; // reajusta a variável média
                soma =0; // variável de soma resetada
            }
            // classificação de newOL por posições em aberto
            newOL.sort(novo OrderComparatorByOpenTime()); //// ordenação de ordens por tempo aberto
            // estamos substituindo as ordens OrderList por OrdersList newOL e só recebemos negócios acima da média móvel
            order.replaceWithList(newOL);
        }

}

 

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

Assine
Notificação de
1 Comentário
Mais antigo
Novidades Mais Votados
Feedbacks em linha
Ver todos os comentários
Emmanuel
20. 12. 2021 8:11 pm

muito bom 🙂