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}%"); } } }
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); }
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}"); }
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}"); }
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); }
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(); }
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); }
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(); } }
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 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); }