示例#1
0
        public void TestBacktester()
        {
            MockCaller  mockCaller  = new MockCaller();
            Config      config      = new Config();
            TradeSystem tradeSystem = new TradeSystem(config);
            MonteCarlo  mc          = new MonteCarlo("Teste");

            config.custoOperacao  = 0f;
            config.flagCompra     = true;
            config.flagVenda      = false;
            config.capitalInicial = 100000;


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

            Assert.IsNotNull(ativo);
            Assert.IsTrue(ativo.candles.Count > 0);
            Candle candle = ativo.firstCandle;

            for (int i = 0; i < 30; i++)
            {
                candle = candle.proximoCandle;
            }
            Periodo periodo = candle.periodo;


            Assert.IsTrue(Stop.CalcValorStop(10, 1, 10) == 9);
            Assert.IsTrue(Stop.CalcValorStop(10, -1, 10) == 11);

            BackTester backtester = new BackTester(facade, periodo, config, tradeSystem);
            Carteira   carteira   = backtester.carteira;

            Assert.IsTrue(carteira.PossuiAtivo(ativo) == 0);

            tradeSystem.condicaoEntradaC = "GREATER(MME(C,9),MME(C,6))";
            tradeSystem.condicaoSaidaC   = "LOWER(MME(C,9),MME(C,6))";
            float mmec9 = candle.GetValor("MME(C,9)");
            float mmec6 = candle.GetValor("MME(C,6)");

            Assert.IsTrue(mmec9 > 0);
            Assert.IsTrue(mmec6 > 0);
            Assert.IsTrue(candle.GetValor(tradeSystem.condicaoEntradaC) == 1);

            tradeSystem.vm.SetVariavel(Consts.VAR_STOP_GAP, 2);
            tradeSystem.vm.SetVariavel(Consts.VAR_USA_STOP_MOVEL, 1);

            tradeSystem.stopInicialC = "LV(L,5)";
            tradeSystem.stopMovelC   = tradeSystem.stopInicialC;
            float stop = candle.GetValor(tradeSystem.stopInicialC);

            stop = stop * (1f - tradeSystem.stopGapPerc / 100f);

            //realiza 1a entrada
            backtester.BackTestCandle(periodo, ativo, candle);
            int qtdAcoes = carteira.PossuiAtivo(ativo);

            Assert.IsTrue(qtdAcoes == 500, qtdAcoes + " <> 500");

            Posicao posicao = carteira.GetPosicaoDoAtivo(ativo);

            Assert.IsNotNull(posicao);
            Assert.IsTrue(posicao.saldo == 500, posicao.saldo + "<>" + 500);
            Operacao oper = posicao.operacoesAbertas[0];

            Assert.IsTrue(oper.stop.CalcStop(candle) == stop);
            Assert.IsTrue(carteira.capitalLiq == 100000 - 500 * candle.proximoCandle.GetValor(FormulaManager.OPEN));
            float capitalAtual = carteira.capitalLiq;

            //simulando um stop
            candle = candle.proximoCandle;
            carteira.periodoAtual = candle.periodo;
            float vlrStopado = stop / 2;

            candle.SetValor(FormulaManager.OPEN, vlrStopado);
            candle.SetValor(FormulaManager.LOW, vlrStopado);
            posicao.VerificaStops(candle);

            qtdAcoes = carteira.PossuiAtivo(ativo);
            Assert.IsTrue(qtdAcoes == 0, qtdAcoes + " <> 0");
            Assert.IsTrue(carteira.capitalLiq == capitalAtual + 500 * vlrStopado);
            capitalAtual = carteira.capitalLiq;

            //mais uma entrada
            candle = candle.proximoCandle;
            carteira.periodoAtual = candle.periodo;
            backtester.BackTestCandle(periodo, ativo, candle);
            qtdAcoes = carteira.PossuiAtivo(ativo);
            Assert.IsTrue(qtdAcoes == 500, qtdAcoes + " <> 500");
            Assert.IsTrue(carteira.capitalLiq == capitalAtual - 500 * candle.proximoCandle.GetValor(FormulaManager.OPEN));
            capitalAtual = carteira.capitalLiq;

            candle = candle.proximoCandle;
            carteira.periodoAtual = candle.periodo;
            posicao.VerificaStops(candle);
            qtdAcoes = carteira.PossuiAtivo(ativo);
            //não foi stopado...
            Assert.IsTrue(qtdAcoes == 500, qtdAcoes + " <> 500");

            /*  candle.SetValor(tradeSystem.stopInicialC, vlrStopado);
             * candle.SetValor(FormulaManager.OPEN, vlrStopado);
             * candle.SetValor(FormulaManager.LOW, vlrStopado-1);
             * posicao.VerificaStops(candle);
             * qtdAcoes = carteira.PossuiAtivo(ativo);
             * //foi stopado...
             * Assert.IsTrue(qtdAcoes == 0, qtdAcoes + " <> 0");*/

            //MME(C,9)<MME(C,6)
            Assert.IsTrue(tradeSystem.checaCondicaoSaida(candle, 1) == 1);
        }
示例#2
0
        public void TestCarteira()
        {
            Config      config      = new Config();
            TradeSystem tradeSystem = new TradeSystem(config);
            MonteCarlo  mc          = new MonteCarlo("Teste");

            float    valorInicial = 100000;
            Carteira carteira     = new Carteira(facade, 100000, config, tradeSystem, mc);

            config.custoOperacao = 20f;

            Assert.IsTrue(carteira.capitalInicial == valorInicial);
            Assert.IsTrue(carteira.capitalLiq == valorInicial);

            Ativo   ativoInex = new Ativo(facade, "ERR", 100);
            Ativo   ativo     = new Ativo(facade, "PETR4", 100);
            Periodo periodo1  = new Periodo("2015-06-05 00:00");
            Periodo periodo2  = new Periodo("2015-06-06 00:00");

            float  closeInicial  = 3;
            float  closeFinal    = 2.7f;
            Candle candleInicial = new Candle(periodo1, ativo, closeInicial * 0.9f, closeInicial, closeInicial * 1.2f, closeInicial * 0.9f, 1000);
            Candle candleFinal   = new Candle(periodo2, ativo, closeFinal * 0.9f, closeFinal, closeFinal * 1.2f, closeFinal * 0.8f, 1000);

            ativo.AddCandle(candleInicial);
            ativo.AddCandle(candleFinal);

            Assert.IsTrue(carteira.capitalLiq == valorInicial);

            carteira.EfetuaEntrada(ativo, periodo1, 1, closeInicial, closeInicial * 0.8f, 1);

            Assert.IsTrue(carteira.capitalLiq < valorInicial, carteira.capitalLiq + ">=" + valorInicial);
            Posicao posicao = carteira.GetPosicaoDoAtivo(ativo);

            Assert.IsNotNull(posicao);
            Assert.IsTrue(posicao.ativo == ativo);
            Assert.IsTrue(posicao.operacoesAbertas.Count == 1);
            Operacao oper = posicao.operacoesAbertas[0];

            Assert.IsTrue(oper.qtd > 0);
            Assert.IsTrue(carteira.capitalLiq + oper.qtd * oper.vlrEntrada + config.custoOperacao == valorInicial);
            carteira.periodoAtual = periodo1;
            carteira.AtualizaPosicao();
            Assert.IsTrue(carteira.capitalLiq + carteira.capitalPosicao == valorInicial - config.custoOperacao, "Posicao: " + carteira.capitalPosicao);

            carteira.periodoAtual = periodo2;
            carteira.AtualizaPosicao();
            Assert.IsTrue(carteira.capitalPosicao == 0, "vlr posicao:" + carteira.capitalPosicao);
            //  cartAssert.IsTrue(oper.qtd>0);eira.

            /*      int qtdAcoesOrdem = 350; int qtdAcoesEsperado = 300;
             *    carteira.EfetuaCompra(candleInicial, qtdAcoesOrdem);
             *    float capitalEsperado = valorInicial - config.custoOperacao - qtdAcoesEsperado * closeInicial;
             *    Assert.IsTrue(carteira.capitalLiq == capitalEsperado, "Capital atual:" + carteira.capitalLiq + " <> " + capitalEsperado);
             *
             *    Posicao posicao = carteira.GetPosicaoDoAtivo(ativo);
             *    Assert.IsNotNull(posicao);
             *    Assert.IsTrue(posicao.saldo == qtdAcoesEsperado);
             *
             *    carteira.EfetuaCompra(candleInicial, qtdAcoesOrdem);
             *    capitalEsperado = valorInicial - 2 * (config.custoOperacao + qtdAcoesEsperado * closeInicial);
             *    Assert.IsTrue(carteira.capitalLiq == capitalEsperado, "Capital atual:" + carteira.capitalLiq + " <> " + capitalEsperado);
             *    Assert.IsTrue(posicao.saldo == qtdAcoesEsperado * 2);
             *
             *    int maxQtd = (int)(capitalEsperado / closeInicial);
             *    maxQtd -= maxQtd % ativo.loteMin;
             *    carteira.EfetuaCompra(candleInicial, maxQtd * 2);
             *    qtdAcoesEsperado = qtdAcoesEsperado * 2 + maxQtd;
             *    Assert.IsTrue(posicao.saldo == qtdAcoesEsperado);
             *    capitalEsperado -= maxQtd * closeInicial + config.custoOperacao;
             *    Assert.IsTrue(carteira.capitalLiq == capitalEsperado, "Capital atual:" + carteira.capitalLiq + " <> " + capitalEsperado);
             *
             *    //Venda
             *    carteira.EfetuaVenda(candleFinal, 150);
             *    capitalEsperado = capitalEsperado + closeFinal * 100 - config.custoOperacao;
             *    Assert.IsTrue(carteira.capitalLiq == capitalEsperado, "Capital atual:" + carteira.capitalLiq + " <> " + capitalEsperado);
             *    qtdAcoesEsperado -= 100;
             *    Assert.IsTrue(posicao.saldo == qtdAcoesEsperado);
             *
             *
             *    carteira.EfetuaVenda(candleFinal, qtdAcoesEsperado * 100);
             *    capitalEsperado = capitalEsperado + qtdAcoesEsperado * closeFinal - config.custoOperacao;
             *    Assert.IsTrue(carteira.capitalLiq == capitalEsperado, "Capital atual:" + carteira.capitalLiq + " <> " + capitalEsperado);
             *    Assert.IsTrue(posicao.saldo == 0);*/
        }