public void TestFormulas() { facade = new FacadeBacktester(); facade.LoadAtivo("PETR4", 100, Consts.PERIODO_ACAO.DIARIO, "dados/petr4-diario.js"); Ativo ativo = facade.GetAtivo("PETR4"); FormulaManager fm = facade.formulaManager; Assert.IsNotNull(fm.GetFormula("3")); Formula f = fm.GetFormula("RSI(HV(SUBTRACT(O,-9),L),C)"); Assert.IsNotNull(f); f = fm.GetFormula("PERCENTIL(SUBTRACT(PERCENTIL(C),C))"); Assert.IsNotNull(f); f = fm.GetFormula("RSI(HV(SUBTRACT(O,-9),L),C)"); Assert.IsNotNull(f); Assert.IsNotNull(fm.GetFormula("MME(C,3)")); string fonte = "C"; int periodos = 3; validaFormulaMMS(ativo, fm, fonte, periodos); periodos = 6; fonte = "MME(O,6)"; validaFormulaMMS(ativo, fm, fonte, periodos); }
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 TestaFormulasDiretamente() { facade = new FacadeBacktester(); FormulaManager fm = facade.formulaManager; facade.LoadAtivo("PETR4", 100, Consts.PERIODO_ACAO.DIARIO, "dados/petr4-diario.js"); Ativo ativo = facade.GetAtivo("PETR4"); Formula fTeste = new Formula(facade, "TESTE"); Formula fTeste2 = new Formula(facade, "TESTE2"); Formula f = new FormulaPercentil(facade, "PERCENTIL", fTeste); Candle candle = ativo.firstCandle; candle.SetValor("TESTE", candle.GetValor(FormulaManager.LOW)); Assert.IsTrue(f.Calc(candle) == 0, f.Calc(candle) + " <> " + 0); candle.SetValor("TESTE", candle.GetValor(FormulaManager.HIGH)); Assert.IsTrue(f.Calc(candle) == 1, f.Calc(candle) + " <> " + 1); f = new FormulaMultiply(facade, "MULT", fTeste, 10); candle.SetValor(fTeste, 10); Assert.IsTrue(f.Calc(candle) == 100, f.Calc(candle) + " <> " + 100); candle.SetValor(fTeste, 5); Assert.IsTrue(f.Calc(candle) == 50, f.Calc(candle) + " <> " + 50); f = new FormulaSUM(facade, "MULT", fTeste, fTeste2); candle.SetValor(fTeste2, 10); Assert.IsTrue(f.Calc(candle) == 15, f.Calc(candle) + " <> " + 15); //HV e LV Candle candle2 = candle.proximoCandle; Candle candle3 = candle2.proximoCandle; Candle candle4 = candle3.proximoCandle; Formula fHV = new FormulaHV(facade, "HV", fm.GetFormula(FormulaManager.HIGH), fTeste2); Formula fLV = new FormulaLV(facade, "LV", fm.GetFormula(FormulaManager.HIGH), fTeste2); candle4.SetValor(fTeste2, 3); float max = candle4.GetValor(fm.GetFormula(FormulaManager.HIGH)); float low = candle4.GetValor(fm.GetFormula(FormulaManager.HIGH)); Candle c = candle4; for (int i = 0; i < 3; i++) { float value = c.GetValor(fm.GetFormula(FormulaManager.HIGH)); if (value > max) { max = value; } if (value < low) { low = value; } c = c.candleAnterior; } Assert.IsTrue(max == fHV.Calc(candle4), max + "<>" + fHV.Calc(candle4)); Assert.IsTrue(low == fLV.Calc(candle4), max + "<>" + fLV.Calc(candle4)); //REF f = new FormulaREF(facade, "REF", fTeste, fTeste2); candle4.SetValor(fTeste, 10); candle3.SetValor(fTeste, 20); candle2.SetValor(fTeste, 30); candle4.SetValor(fTeste2, 1); Assert.IsTrue(20 == f.Calc(candle4)); candle4.SetValor(fTeste2, 2); Assert.IsTrue(30 == f.Calc(candle4)); }