Exemplo n.º 1
0
        public void TestBacktesterVars()
        {
            Config config = new Config();

            config.capitalInicial = 100000;
            TradeSystem tradeSystem = new TradeSystem(config);

            facade.LoadAtivo("PETR4", 100, Consts.PERIODO_ACAO.DIARIO, "dados/petr4-diario.js", backend.Consts.TIPO_CARGA_ATIVOS.GERA_CANDIDATOS);
            Ativo ativo = facade.GetAtivo("PETR4");

            Assert.IsNotNull(ativo);
            Assert.IsTrue(ativo.candles.Count > 0);

            Candle  candle  = ativo.firstCandle;
            Periodo periodo = candle.periodo;

            BackTester bt = new BackTester(facade, periodo, config, tradeSystem);

            Carteira carteira = bt.carteira;

            Assert.IsNotNull(carteira);
            Assert.IsTrue(carteira.posicoesFechadas.Count == 0);
            Assert.IsTrue(carteira.posicoesAbertas.Count == 0);
            float riscoTotal = carteira.GetRiscoCarteiraPercent(periodo);

            Assert.IsTrue(riscoTotal == 0);
            // carteira.EfetuaEntrada(ativo, periodo, 1, 10, 9, 1);

            //entro com um valor fixo (direto na carteira)
            Posicao posicao = new Posicao(carteira, ativo, 0);

            carteira.posicoesAbertas.Add(ativo, posicao);

            int qtd = 1000;

            posicao.saldo += qtd;
            Operacao oper1 = new Operacao(carteira, candle, 10, 9, qtd, 1, null);

            posicao.operacoesAbertas.Add(oper1);
            float capitalSobRisco = ((10 - 9) * qtd);
            float riscoEsperado   = capitalSobRisco / carteira.GetCapital() * 100;

            carteira.capitalLiq -= oper1.vlrEntrada * oper1.qtd;

            candle.SetValor(FormulaManager.CLOSE, 10);
            carteira.periodoAtual = periodo;
            carteira.AtualizaPosicao();
            Assert.IsTrue(carteira.GetCapital() == 100000, carteira.GetCapital() + "<>" + 100000);
            Assert.IsTrue(carteira.capitalPosicao == 10000, carteira.GetCapital() + "<>" + 10000);
            riscoTotal = carteira.GetRiscoCarteiraPercent(periodo);
            Assert.IsTrue(riscoTotal == riscoEsperado, riscoTotal + "<>" + riscoEsperado);

            //2a operacao
            Operacao oper2 = new Operacao(carteira, candle, 10, 9, qtd, 1, null);

            posicao.operacoesAbertas.Add(oper2);
            posicao.saldo += qtd;
            carteira.AtualizaPosicao();
            carteira.capitalLiq -= oper1.vlrEntrada * oper1.qtd;
            capitalSobRisco     *= 2;
            riscoEsperado        = capitalSobRisco / carteira.GetCapital() * 100;

            Assert.IsTrue(carteira.GetCapital() == 100000, carteira.GetCapital() + "<>" + 100000);
            Assert.IsTrue(carteira.capitalPosicao == 20000, carteira.GetCapital() + "<>" + 20000);
            riscoTotal = carteira.GetRiscoCarteiraPercent(periodo);
            Assert.IsTrue(riscoTotal == riscoEsperado, riscoTotal + "<>" + riscoEsperado);

            tradeSystem.vm.GetVariavel(Consts.VAR_RISCO_TRADE).vlrAtual  = 2;
            tradeSystem.vm.GetVariavel(Consts.VAR_RISCO_GLOBAL).vlrAtual = 5;

            float qtdTrade = carteira.CalculaQtdTrade(100000, 10, 12, periodo);

            Assert.IsTrue(qtdTrade == 980, qtdTrade + "<>" + 980);
        }