Пример #1
0
        private static async Task FindBestCommonSettings(BackTester backtester)
        {
            var otherMarkets = new List <string>
            {
                "BTC-ETC",
                "BTC-ETH",
                "BTC-ADA",
                "BTC-XLM",
                "BTC-XRP",
                "BTC-XMR",
                "BTC-LTC",
                "BTC-TRX"
            };
            var topSettings = new List <BackTestResult>();

            foreach (var btcMarket in otherMarkets)
            {
                var marketResults = await backtester.FindBestSettings(btcMarket);

                var bestResult = marketResults[0];
                topSettings.Add(bestResult);
                Console.WriteLine($"{btcMarket}\t{bestResult.Budget.Profit}%\t{bestResult.Settings}");
                foreach (var testMarket in otherMarkets.Where(m => m != btcMarket))
                {
                    bestResult = await GetResultForMarket(testMarket, marketResults[0]);

                    Console.WriteLine($"{btcMarket}---{testMarket}\t{bestResult.Budget.Profit}%");
                }
            }
        }
Пример #2
0
        private static async Task <BackTestResult> GetResultForMarket(string btcMarket, BackTestResult bestEtcBacktest)
        {
            var backtester = new BackTester(Resource.BittrexApiKey, Resource.BittrexApiSecret);
            var bestResult = await backtester.TrySettings(btcMarket, null, bestEtcBacktest.Settings);

            return(bestResult);
        }
Пример #3
0
        static async Task Main(string[] args)
        {
            var backtester       = new BackTester();
            var backtestingStats = await backtester.FindBestSettings("BTC-ETC");

            Console.WriteLine($"{backtestingStats[0].Key}\t{backtestingStats[0].Value.Profit}");
        }
Пример #4
0
        static async Task Main(string[] args)
        {
            await PlayWithBitmex();

            return;

            var backtester    = new BackTester(Resource.BittrexApiKey, Resource.BittrexApiSecret);
            var market        = "BTC-ETC";
            var marketResults = await backtester.FindBestSettings(market);

            var bestResult = marketResults[0];

            Console.WriteLine($"{market}\t{bestResult.Budget.Profit}%\t{bestResult.Settings}");
        }
Пример #5
0
        private static void Main(string[] args)
        {
            // create a virtual trade manager
            var virtualTradeManager = new VirtualTradeManager();

            // create day trading strategy
            var strategy = new DayTradingStrategy("NEOUSD");

            // create new backtester
            var tester = new BackTester();

            // test the strategy on bitfinex
            tester.Test(new ExchangeBitfinexAPI(), strategy);
        }
Пример #6
0
        static void Main(string[] args)
        {
            if (args.Length < 1)
            {
                dummy = typeof(SharpTrader.Algos.HighPassMeanReversionAlgo2);
                throw new Exception("Missing argument: config file (json)");
            }

            var        json   = File.ReadAllText(args[0]);
            var        config = JsonConvert.DeserializeObject <BackTester.Configuration>(json);
            BackTester tester = new BackTester(config);

            tester.ShowPlotCallback = ShowPlot;
            tester.Start();
            Console.ReadLine();
        }
Пример #7
0
        private static void Main(string[] args)
        {
            var startTime = new DateTime(2018, 5, 14, 0, 0, 0);
            var settings  = new Settings();

            // create a virtual trade manager
            var virtualTradeManager = new VirtualTradeManager();

            // create day trading strategy
            var strategy = new DayTradingStrategy("ETHBTC", settings);

            // create new backtester
            var tester = new BackTester();

            // test the strategy on bitfinex
            tester.Test(new ExchangeBitfinexAPI(), strategy, startTime);
        }
Пример #8
0
        static void Main(string[] args)
        {
            string coinsToBuyCsv = System.Configuration.ConfigurationManager.AppSettings["CoinsToBuy"];

            var backTester = new BackTester(GetTradingStrategies(), new BittrexApi(true), new CsvDataStorage("DataStorage"), coinsToBuyCsv);

            try
            {
                backTester.WriteIntro();
                System.Console.WriteLine();
                System.Console.WriteLine();
                backTester.PresentMenuToUser();
            }
            catch (Exception ex)
            {
                backTester.WriteColoredLine($"\t{ex.Message}", ConsoleColor.Red);
                System.Console.ReadLine();
            }
        }
Пример #9
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);
        }
Пример #10
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);
        }