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); }
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);*/ }