Documentação
Aplicações
Última atualização em 10. 2. 2022 por Mark Fric
Salvar os resultados do banco de dados no DB
Este exemplo trata de salvar o conteúdo do banco de dados em um banco de dados, implementado como snippet CustomAnalysis.
Nota! Havia um pequeno bug na extensão original - ele usou um pacote que ainda não estava disponível na versão lançada do SQ X. Por favor, recarregue o snippet.
Ele usa SQLite DB para simplificar, mas não há problema em usar MySql ou MariaDB ou qualquer outro banco de dados, porque ele usa a conexão de banco de dados JDBC que é um padrão Java ao se conectar e se comunicar com bancos de dados.
Ao utilizar outro banco de dados, você precisará fazê-lo:
- mudar a corda de conexão JDBC em createDBConnection() método
- talvez seja necessário adicionar a biblioteca JDBC para seu banco de dados alvo - SQLite já está incluída no SQX, mas bancos de dados como MySql ou MariaDB não estão - então você precisará encontrar sua biblioteca JDBC (algo como https://dev.mysql.com/downloads/connector/j/ e adicionar seu(s) arquivo(s) JAR à pasta {StrategyQuant installation}/user/libs.
bastante complexo, porque guarda a visão exata do banco de dados que você vê na IU - se você não quiser usar a visão você pode simplesmente obter valores como lucro líquido, número de negócios, etc. do ResultsGroup e salvá-los por conta própria.
A lógica principal é, na verdade, muito simples:
@Override public ArrayList processDatabank(String project, String task, String databankName, ArrayList databankRG) lança Exceção { Banco de dados = ProjectEngine.get(projeto).getDatabanks().get(banco de dadosNome); if(databank == nulo){ lançar nova Exceção ("Databank " + projeto + "/" + banco de dadosNome + " não existe"); } DatabankTableView view = banco de dados.getView(); String tableName = getTableName(projeto, tarefa, banco de dadosNome); try (Conexão dbConnection = createDBConnection(tableName, view)) { dbConnection.setAutoCommit(false); try (Declaração stmt = dbConnection.createStatement()) { para (int a = 0; a < banco de dadosRG.size(); a++) { ResultadosGrupo rg = banco de dadosRG.get(a); writeData(rg, view, tableName, stmt); } } dbConnection.commit(); } banco de dados de retornoRG; }
O código criará a conexão DB, criará Statement, depois passará por ResultGroups armazenados em banco de dados e salvará cada um deles no DB usando o comando SQL padrão.
Código completo do snippet (também pode ser baixado no anexo a este post):
pacote SQ.CustomAnalysis; import com.strategyquant.lib.SQTime; importar com.strategyquant.lib.SQUtils; import com.strategyquant.tradinglib.*; import com.strategyquant.tradinglib.databank.DatabankTableColumnEntry; importar com.strategyquant.tradinglib.databank.DatabankTableView; import com.strategyquant.tradinglib.project.projectEngine; importação org.joda.time.format.DateTimeFormat; importação org.joda.time.format.DateTimeFormat; importação org.slf4j.logger; importação org.slf4j.LoggerFactory; conexão java.sql.import; importação java.sql.DriverManager; importação de java.sql.SQLException; importação de java.sql.Statement; importação java.util.ArrayList; importação de java.util.HashMap; classe pública SaveDatabankToDB estende o Método Análises Personalizadas { logger final estático público = LoggerFactory.getLogger("SaveDatabankToDB"); privado estático final TABELA_NAME_SEPARADOR = "__"; private static final DateTimeFormatter dateTimeFormatter = DateTimeFormat.forPattern("yyyyy-MM-dd-HHmm"); public static final String TABLE_NAME = "databankData"; privado estático final String STRATEGY_COLUMN_NAME = "strategyName" (nome da estratégia); //------------------------------------------------------------------------ //------------------------------------------------------------------------ //------------------------------------------------------------------------ /** * Instanta um novo método de análise personalizado. */ público SaveDatabankToDB() { super("SaveDatabankToDB", TYPE_PROCESS_DATABANK); } //------------------------------------------------------------------------ @Override filtro booleano públicoEstratégia(projeto String, tarefa String, banco de dados StringName, ResultsGroup rg) lança Exceção { retornar verdadeiro; } //------------------------------------------------------------------------ @Override public ArrayList processDatabank(String project, String task, String databankName, ArrayList databankRG) lança Exceção { Banco de dados = ProjectEngine.get(projeto).getDatabanks().get(banco de dadosNome); if(databank == nulo){ lançar nova Exceção ("Databank " + projeto + "/" + banco de dadosNome + " não existe"); } DatabankTableView view = banco de dados.getView(); String tableName = getTableName(projeto, tarefa, banco de dadosNome); try (Conexão dbConnection = createDBConnection(tableName, view)) { dbConnection.setAutoCommit(false); try (Declaração stmt = dbConnection.createStatement()) { para (int a = 0; a < banco de dadosRG.size(); a++) { ResultadosGrupo rg = banco de dadosRG.get(a); writeData(rg, view, tableName, stmt); } } dbConnection.commit(); } banco de dados de retornoRG; } //------------------------------------------------------------------------ public static String getOutputFolder(){ retornar "C:/SQDatabankExports"; } //------------------------------------------------------------------------ Conexão Privada CriarDBConexão(String tableName, DatabankTableView view) lança Exceção { Conexão c = nula; tente { Class.forName("org.sqlite.JDBC"); String folderPath = getOutputFolder(); SQUtils.ensureDirExists(pastaPath); String dbPath = String.format("%s/%s.db", folderPath, tableName); String connectionString = String.format("jdbc:sqlite:%s", dbPath); c = DriverManager.getConnection(connectionString); tryCreateTable(c, tableName, view); } captura (Exceção e ) { Log.error("Criando conexão de banco de dados falhou", e); lançar e; } retornar c; } //------------------------------------------------------------------------ public static String getTableName(String projectName, String taskName, String databankName){ String dateTime = dateTimeFormatter.print(System.currentTimeMillis()); data de retornoTimeTime + TABLE_NAME_SEPARATOR + projectName + TABLE_NAME_SEPARATOR + taskName + TABLE_NAME_SEPARATOR + databankName; } //------------------------------------------------------------------------ vazio privado tryCreateTable(Conexão de conexão, String tableName, DatabankTableView view) lança Exceção { if(view === nulo){ lançar nova Exceção ("Databank view is null"); } Declaração stmt = nula; tentar { StringBuilder sb = novo StringBuilder(STRATEGY_COLUMN_NAME).append(" TEXT PRIMARY KEY"); ColunaNomesColunaResolver ColunaNomesResolver = nova ColunaNomesResolver(); for(int a=0; a<view.columns.size(); a++){ Banco de dadosTableColumnEntry column = view.columns.get(a); String columnName = columnNamesResolver.getColumnName(column); sb.append(","); sb.append(columnName); sb.append("," TEXTO"); } String sql = String.format("CREATE TABLE IF NOT EXISTS %s (%s);", TABLE_NAME, sb); stmt = connection.createStatement(); stmt.executeUpdate(sql); } finalmente { if(stmt != null) { stmt.close(); } } } //------------------------------------------------------------------------ dados privados nulos de escrita (ResultsGroup rg, DatabankTableView view, String tableName, Statement stmt) lança SQLException { StringBuilder columnNames = novo StringBuilder(); valores StringBuilder = novo StringBuilder(); ColunaNomesColunaResolver ColunaNomesResolver = nova ColunaNomesResolver(); columnNames.append(STRATEGY_COLUMN_NAME); values.append("'").append(rg.getName()).append("'"); para (int a = 0; a < view.columns.size(); a++) { Banco de dadosTableColumnEntry column = view.columns.get(a); String columnName = columnNamesResolver.getColumnName(column); Valor da corda = "N/A"; tente { valor = coluna.tabelaColuna.exportValor(rg, nulo, Directions.Both, PlTypes.Money, SampleTypes.FullSample); } catch (Exceção e) { Log.error("Error getting value for strategy + " + rg.getName() + " e coluna " + columnName, e); } columnNames.append(",").append(columnName); values.append(",").append("'").append(value).append("'"); } String sql = String.format("INSERT INTO %s (%s) VALORES (%s)", TABLE_NAME, colunaNomes, valores); stmt.executeUpdate(sql); } //------------------------------------------------------------------------ classe privada ColumnNamesResolver { Private HashMap columnNameCounts = novo HashMap(); public String getColumnName(DatabankTableColumnEntry columnEntry){ String columnName = columnEntry.tableColumn.getClass().getSimpleName(); String finalColumnName = null; //código de acompanhamento cuida de várias colunas com o mesmo nome dentro da visualização do banco de dados Integer columnCount = columnNameCounts.get(columnName); if(columnCount != nulo){ colunaContar += 1; finalColunaNome = colunaNome + colunaContar; } senão { columnCount = 1; finalColunaNome = ColunaNome; } columnNameCounts.put(columnName, columnCount); devolver finalColumnName; } } }
Este artigo foi útil? O artigo foi útil O artigo não foi útil
este é um exemplo muito bom. Ajuda a acelerar a análise dos resultados.