oslib/scr/importa-arq-b3-book-oferta.mq5
super.admin 07f69c4478 convert
2025-05-30 16:15:18 +02:00

283 lines
27 KiB
MQL5

//+------------------------------------------------------------------+
//| importa-arq-b3-oferta.mq5 |
//| Copyright 2020, OS Corp. |
//| http://www.os.org |
//+------------------------------------------------------------------+
#property copyright "Copyright 2020, OS Corp."
#property link "http://www.os.org"
#property version "1.001"
#include <Files\FileTxt.mqh>
//+------------------------------------------------------------------+
//| Importa o arquivo do livro de ofertas da B3 |
//+------------------------------------------------------------------+
/*
Layout do arquivo OFER_VDA (Ofertas de Venda)
Cabecalho/Rodape
------------------------------------------------
Coluna Inicio Tamanho Descricao
------------------------------------------------
Identificacao 1 2 RH Cabecalho - RT Rodape
Nome Arquivo 4 20 Nome do arquivo
Data Inicial 25 10 Data Inicial desse arquivo
Data Final 36 10 Data Final desse arquivo
Total de Linhas 47 9 No caso do rodape apresenta o total de linhas do arquivo
Detalhes
------------------------------------------------
Coluna Inicio Tamanho Descricao
------------------------------------------------
Data Sessao 1 10 Data da Sessao
Simbolo do Instrumento 12 50 Simbolo do Instrumento
Sentido Of.Venda 63 1 Indicador de Sentido da Ordem: "1" - compra / "2" - venda
Sequência 65 15 Numero de Sequência da Oferta
GenerationID - Of.Venda 81 15 Numero de geracao (GenerationID) da Oferta de Venda. Quando um negocio for gerado por 2 ofertas com quantidade escondida e isso gerar "n" linhas será gravado aqui a maior geracao (para Codigo de Bolsa "Bovespa" valor fixo = 1).
Cod do Evento da Of.Venda 97 3 Codigo do Evento da Ordem: 1 - New / 2 - Update / 3 - Cancel - Solicitado pelo participante / 4 - Trade / 5 - Reentry - Processo interno (quantidade escondida) / 6 - New Stop Price / 7 - Reject / 8 - Remove - Removida pelo Sistema (final de dia ou quando e totalmente fechada) / 9 - Stop Price Triggered / 11 - Expire - Oferta com validade expirada.
Hora Prioridade 101 15 Hora de registro da oferta no sistema (no formato, HH:MM:SS.NNN), utilizada como indicadora de prioridade.
Ind de Prioridade Of.Venda 117 10 Indicador de Prioridade. Alem do preco e a ordem para aparecer no Order Book.
Preco Of.Venda 128 20 Preco da Oferta
Qtd.Total Of.Venda 149 18 Quantidade Total da Oferta. Se tiver alteracao ela reflete a nova quantidade.
Qtd.Negociada Of.Venda 168 18 Quantidade Negociada
Data Oferta Venda 187 10 Data de Inclusao da Oferta. Pode ser uma data anterior a Data da Sessao, quando se tratar de uma Oferta com Validade.
Data de Entrada Of.Venda 198 19 Data/Hora de Entrada da Oferta (formato: DD/MM/AAAA HH:MM:SS)
Estado Of.Venda 218 1 Indicador de Estado da Ordem: 0 - Novo / 1 - Negociada parcialmente / 2 - Totalmente executada / 4 - Cancelada / 5 - Modificada / 8 - Rejeitada / C - Expirada
Condicao Oferta 220 1 Codigo que identifica a condicao da oferta. Pode ser: 0 - Oferta Neutra - e aquela que entra no mercado e nao fecha com oferta existente. / 1 - Oferta Agressora - e aquela que ingressa no mercado para fechar com uma oferta existente. / 2 - Oferta Agredida - e a oferta (existente) que e fechada com uma oferta agressora.
Corretora 222 8 Codigo que identifica univocamente a corretora - Disponivel a partir de 03/2014
Obs: Delimitador das colunas de detalhes ';'
*/
/*
struct st_book{
datetime dt_sessao ;
string symbol ;
uint sentido ;
ulong seq ;
ulong gen_id ;
uint cod_evt ;
datetime hr_prior ; // 09:00:50.092000
uint ms_prior ; // microsegundos da prioridade 09:00:50.s092000
ulong ind_prior ;
double preco ;
uint qtd_tot ;
uint qtd_neg ;
datetime dt_oferta ;
datetime dt_entrada;
uint estado ;
uint condicao ;
uint corretora ;
};
*/
struct st_book{
string dt_sessao ;
string symbol ;
string sentido ;
string seq ;
string gen_id ;
string cod_evt ;
string hr_prior ; // 09:00:50.092000
string ms_prior ; // microsegundos da prioridade 09:00:50.s092000
string ind_prior ;
string preco ;
string qtd_tot ;
string qtd_neg ;
string dt_oferta ;
string dt_entrada;
string estado ;
string condicao ;
string corretora ;
};
enum POSICAO_CAMPOS_BOOK{
DT_SESSAO = 0,
SYMBOL = 1,
SENTIDO = 2,
SEQ = 3,
GEN_ID = 4,
COD_EVT = 5,
HR_PRIOR = 6,
IND_PRIOR = 7,
PRECO = 8,
QTD_TOT = 9,
QTD_NEG =10,
DT_OFERTA =11,
DT_ENTRADA=12,
ESTADO =13,
CONDICAO =14,
CORRETORA =15,
};
void OnStart(){
string nameArqBookBuy = "OFER_CPA_BMF_20191211_WDO.TXT";
string nameArqSqlBuy = "OFER_CPA_BMF_20191211_WDO.SQL";
string nameArqBookSel = "OFER_VDA_BMF_20191211_WDO.TXT";
string nameArqSqlSel = "OFER_VDA_BMF_20191211_WDO.SQL";
//int bookFile = openReadFile (nameArqBookBuy);
//int sqlFile = openWriteFile(nameArqSqlBuy );
//importarArquivo(bookFile,sqlFile);
//closeFile(bookFile);
//closeFile(sqlFile);
int bookFile = openReadFile (nameArqBookSel);
int sqlFile = openWriteFile(nameArqSqlSel );
importarArquivo(bookFile,sqlFile);
closeFile(bookFile);
closeFile(sqlFile);
}
//+------------------------------------------------------------------+
void importarArquivo(int bookFile, int sqlFile){
string line;
ushort sep = StringGetCharacter(";",0);
string result[];
st_book book;
int qtd = 0;
Print("Lendo arquivo ", bookFile, " ...");
//while( !FileIsEnding(bookFile) && qtd++ < 10){
while( !FileIsEnding(bookFile) ){
// lendo a linha ...
//Print("lendo linha ", qtd,"...");
line = FileReadString(bookFile);
//Print("lida linha ", qtd,":", line);
// colocando os campos do log em um array...
StringSplit( line , // A string que será pesquisada
sep , // Um separador usado para buscar substrings
result); // Um array passado por referencia para obter as substrings encontradas
/*
book.dt_sessao = StringToTime ( result[DT_SESSAO ] );
book.symbol = result[SYMBOL ] ; StringTrimRight(book.symbol);
book.sentido = StringToInteger( result[SENTIDO ] );
book.seq = StringToInteger( result[SEQ ] );
book.gen_id = StringToInteger( result[GEN_ID ] );
book.cod_evt = StringToInteger( result[COD_EVT ] );
book.hr_prior = StringToTime ( StringSubstr( result[DT_SESSAO ], 0,10 )+ " " +
StringSubstr( result[HR_PRIOR ], 0, 8 ) ); //09:00:50.092000
book.ms_prior = StringToInteger( StringSubstr( result[HR_PRIOR ], 9, 6 ) ); //09:00:50.092000
book.ind_prior = StringToInteger( result[IND_PRIOR ] );
book.preco = StringToDouble ( result[PRECO ] );
book.qtd_tot = StringToInteger( result[QTD_TOT ] );
book.qtd_neg = StringToInteger( result[QTD_NEG ] );
book.dt_oferta = StringToTime ( result[DT_OFERTA ] );
book.dt_entrada = StringToTime ( result[DT_ENTRADA] );
book.estado = StringToInteger( result[ESTADO ] );
book.condicao = StringToInteger( result[CONDICAO ] );
book.corretora = StringToInteger( result[CORRETORA ] );
*/
book.dt_sessao = result[DT_SESSAO ] ;
book.symbol = result[SYMBOL ] ; StringTrimRight(book.symbol);
book.sentido = result[SENTIDO ] ;
book.seq = result[SEQ ] ;
book.gen_id = result[GEN_ID ] ;
book.cod_evt = result[COD_EVT ] ;
book.hr_prior = StringSubstr( result[DT_SESSAO ], 0,10 )+ " " +
StringSubstr( result[HR_PRIOR ], 0, 8 ) ; //09:00:50.092000
book.ms_prior = StringSubstr( result[HR_PRIOR ], 9, 6 ) ; //09:00:50.092000
book.ind_prior = result[IND_PRIOR ] ;
book.preco = result[PRECO ] ;
book.qtd_tot = result[QTD_TOT ] ;
book.qtd_neg = result[QTD_NEG ] ;
book.dt_oferta = result[DT_OFERTA ] ;
book.dt_entrada = result[DT_ENTRADA] ;
book.estado = result[ESTADO ] ;
book.condicao = result[CONDICAO ] ;
book.corretora = result[CORRETORA ] ;
gravarSql(book, sqlFile);
/*
Print(book.dt_sessao ,"|",
book.symbol ,"|",
book.sentido ,"|",
book.seq ,"|",
book.gen_id ,"|",
book.cod_evt ,"|",
book.hr_prior ,"|",
book.ms_prior ,"|",
book.ind_prior ,"|",
book.preco ,"|",
book.qtd_tot ,"|",
book.qtd_neg ,"|",
book.dt_oferta ,"|",
book.dt_entrada,"|",
book.estado ,"|",
book.condicao ,"|",
book.corretora ,"|");
*/
//2019.12.11 00:00:00|WDOF20|2|743788788920|87601574 |2 |1576055094|390000|733659552|4164.0|5|0|2019.12.11 00:00:00|2019.12.11 09:04:54|5|0|3|
//2019.12.11 00:00:00|WDOF20|2|743788788920|98139628 |2 |1576063373|820000|822348016|4160.0|5|0|2019.12.11 00:00:00|2019.12.11 11:22:53|5|0|3|
//2019.12.11 00:00:00|WDOF20|2|743788788920|133314369|11|1576092600|22000 |822348016|4160.0|5|0|2019.12.11 00:00:00|2019.12.11 19:30:00|0|0|3|
//2019.12.11 00:00:00|WDOF20|2|743788788920|87601574 |2 |1576055094|390000|733659552|4164.0|5|0|2019.12.11 00:00:00|2019.12.11 09:04:54|5|0|3|
//2019.12.11 00:00:00|WDOF20|2|743788788920|98139628 |2 |1576063373|820000|822348016|4160.0|5|0|2019.12.11 00:00:00|2019.12.11 11:22:53|5|0|3|
//2019.12.11 00:00:00|WDOF20|2|743788788920|133314369|11|1576092600|22000|822348016|4160.0|5|0|2019.12.11 00:00:00|2019.12.11 19:30:00|0|0|3|
}
}
void gravarSql(st_book& book, int sqlFile){
string sqlCommand =
StringFormat( "insert "
"into b3_book (dt_sessao, symbol, sentido, seq, gen_id, id_evt, prior_hr, prior_ms, prior_in, price, qtd_tot, qtd_neg, dt_incl, dt_entrada, estado_id, condicao_id, corretora_id) "
"values('%s','%s',%s,%s,%s,%s,'%s',%s,%s,%s,%s,%s,'%s','%s','%s',%s,%s);",
book.dt_sessao ,
book.symbol ,
book.sentido ,
book.seq ,
book.gen_id ,
book.cod_evt ,
book.hr_prior ,
book.ms_prior ,
book.ind_prior ,
book.preco ,
book.qtd_tot ,
book.qtd_neg ,
book.dt_oferta ,
book.dt_entrada,
book.estado ,
book.condicao ,
book.corretora );
//VALUES('', '', 0, 0, 0, 0, '', 0, 0, 0, 0, 0, '', '', 0, 0, 0);
FileWrite(sqlFile,sqlCommand);
}
int openReadFile(string arq){
Print("Abrindo arquivo ", arq, " no diretorio comum de arquivos...");
//int file = FileOpen(arq, FILE_READ|FILE_TXT|FILE_COMMON );
//int file = FileOpen(arq, FILE_READ|FILE_TXT|FILE_COMMON,CP_UTF8);
//int file = FileOpen(arq, FILE_READ|FILE_TXT|FILE_COMMON,';');
//int file = FileOpen(arq, FILE_READ|FILE_TXT|FILE_COMMON,';',CP_UTF8);
//int file = FileOpen(arq, FILE_READ|FILE_TXT|FILE_COMMON,StringGetCharacter(";",0),CP_UTF8);
//int file = FileOpen(arq, FILE_READ|FILE_TXT|FILE_ANSI );
int file = FileOpen(arq, FILE_READ|FILE_TXT|FILE_COMMON|FILE_ANSI);
if( file<0 ){
Print("Falha para abrir o arquivo: ", arq );
Print("Codigo de erro: " , GetLastError() );
}
return file;
}
int openWriteFile(string arq){
Print("Criando arquivo ", arq, " no diretorio comum de arquivos...");
int file = FileOpen(arq, FILE_WRITE|FILE_TXT|FILE_ANSI|FILE_COMMON);
//int file = FileOpen(arq, FILE_WRITE|FILE_TXT|FILE_ANSI|FILE_COMMON,'\t',CP_UTF8);
if( file<0 ){
Print("Falha para abrir o arquivo : ", arq );
Print("Codigo de erro: " , GetLastError() );
}
return file;
}
void closeFile(int file){
Print("Fechando arquivo ", file, " ...");
FileClose(file);
}