Ejemplo n.º 1
0
        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);
        }
Ejemplo n.º 2
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);
        }
Ejemplo n.º 3
0
        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));
        }