MyPointsDOLAR_BMF

Author: Wayre Avelar
Miscellaneous
Uses files from the file systemIt reads information from a fileIt writes information to file
0 Views
0 Downloads
0 Favorites
MyPointsDOLAR_BMF
ÿþ//+------------------------------------------------------------------+

//|                                                     MyPoints.mq5 |

//|                                                     Wayre Avelar |

//|                                             https://www.mql5.com |

//+------------------------------------------------------------------+

#property copyright "Wayre Avelar"

#property link      "https://www.mql5.com"

#property version   "1.00"



struct myMqlRates  {

   datetime time;         // Hora inicial do período

   double   open;         // Preço de abertura

   double   high;         // O preço mais alto do período

   double   low;          // O preço mais baixo do período

   double   close;        // Preço de fechamento

   long     tick_volume;  // Volume de Tick

   long     real_volume;  // Volume de negociação

   double   ajuste_anterior;

   double   ajuste_atual;

};

struct _ajustes {

   double ajusteAnterior;

   double ajusteAtual;

};



//Variaveis globais

bool showLOGs = true;

MqlRates _rates[];

int qtdeBarras = 20;

myMqlRates rates[20], ratesCSV[20];

string nameFile = "dadosAjusteDolar.csv";



void OnStart() {

int copied = CopyRates(

      Symbol(),   // nome do ativo

      PERIOD_D1,  // período

      0,          // posição de início

      qtdeBarras, // quantidade de dados para copiar

      _rates       // array destino para copiar

   );

   

   //se pegou datas corretamente continua...

   if(!copied) return;



   //popula MqlRates para o myMqlRates

   populaRates(_rates, rates);



   //pega dados do arquivo csv

   bool isRead=false;

   if(FileIsExist(nameFile)) {

      isRead = ReadFileCSV(nameFile, ratesCSV);

      if(isRead) print("Arquivo CSV de Ajustes BMF carregado corretamente!");

   } 

         

   //checar se foi carregado corretamente conteudo arquivo

   if(!isRead || !FileIsExist(nameFile)) {

      print("Não foi possível ler conteudo do arquivo csv!");

      print("Gerando conteúdo e salvando em novo arquivo csv! (" +nameFile+ ")");

      carregaAjustesBMF(rates);

      WriteFileCSV(nameFile, rates);

      ReadFileCSV(nameFile, ratesCSV);

   }

   

   //Se arquivo csv estiver desatualizado então atualiza dados

   int tam = ArraySize(ratesCSV);

   if(rates[tam-1].time != ratesCSV[tam-1].time) {

      carregaAjustesBMF(rates);

   

      print("CSV desatualizado! Criado novo arquivo CSV.");

      WriteFileCSV(nameFile, rates);  

      ReadFileCSV(nameFile, ratesCSV);

   }



   //aqui preciso usar os dados do ratesCSV pois esta completo com ajustes

   criaObjetosNoGrafico(ratesCSV);

   



} // fim onStart



//##############################################################

//##############################################################



//Funcao que cria linhas horizontais no grafico com valores do Ajuste Dolar BMF

void criaObjetosNoGrafico(myMqlRates &r[]) {

   //cria linhas importantes no grafico

   int total = ArraySize(r);

   string nameAjusteAnt;

   for(int i=0;i<total;i++) {

      nameAjusteAnt = "Ajuste D+" + IntegerToString(total-i);

      ObjectCreate(0, nameAjusteAnt, OBJ_HLINE, 0, 0, r[i].ajuste_anterior);

      ObjectSetInteger(0, nameAjusteAnt, OBJPROP_WIDTH, 1);

      ObjectSetInteger(0, nameAjusteAnt, OBJPROP_COLOR, clrWhite);

   }

}



//popula dados do MqlRates _rates para myMqlRates rates

void populaRates(MqlRates &ori[], myMqlRates &dest[]) {

   for(int i=0;i<ArraySize(ori);i++) {

      dest[i].time = ori[i].time;

      dest[i].open = ori[i].open;

      dest[i].high = ori[i].high;

      dest[i].low = ori[i].low;

      dest[i].close = ori[i].close;

      dest[i].tick_volume = ori[i].tick_volume;

      dest[i].real_volume = ori[i].real_volume;

      dest[i].ajuste_anterior = 0;

      dest[i].ajuste_atual = 0;   

   }   

}



// busca na BMF dados de ajuste e atualiza em rates

void carregaAjustesBMF(myMqlRates &arrRates[]) {

   string currentDate = getDate(StringToTime(getCurrentDate()));



   for(int i=0;i<ArraySize(arrRates);i++) {

      string dt = getDate(arrRates[i].time);

      

      if(currentDate == dt) { 

         arrRates[i].ajuste_anterior = arrRates[i-1].ajuste_atual;

         continue; 

      }

      

      _ajustes ajustes = getAjustesDolar(dt);



      arrRates[i].ajuste_anterior = ajustes.ajusteAnterior;

      arrRates[i].ajuste_atual = ajustes.ajusteAtual;   

   }   

}



//Le arquivo de dados csv e popula em um objeto myMqlRates ratesCSV

bool ReadFileCSV(string FileName, myMqlRates &d[]){

   int h=FileOpen(FileName,FILE_READ|FILE_ANSI|FILE_CSV,";");

   if(h==INVALID_HANDLE){ Print("Erro ao ler arquivo CSV"); return false; }   

   

   int i=0,j=0;

   while(!FileIsEnding(h)){

      string line = FileReadString(h);

      

      if(line =="") { print("Erro lendo conteudo do arquivoCSV"); break; }

      

   	if(i == 0) d[j].time = StringToTime(line);

   	if(i == 1) d[j].open = StringToDouble(line);

   	if(i == 2) d[j].high = StringToDouble(line);

   	if(i == 3) d[j].low = StringToDouble(line);

   	if(i == 4) d[j].close = StringToDouble(line);

   	if(i == 5) d[j].tick_volume = StringToInteger(line);

   	if(i == 6) d[j].real_volume = StringToInteger(line);

   	if(i == 7) d[j].ajuste_anterior = StringToDouble(line);

   	if(i == 8) d[j].ajuste_atual = StringToDouble(line);

      if(++i%9==0) { j++; i=0; }

   }

   FileClose(h);

   return true;

}



//pega valores de ajuste de uma data especifica

_ajustes getAjustesDolar(string dt) {

   _ajustes ajuste;



   string html = getConteudoBMF(dt);  

   if(html == "") { 

      print("Erro ao buscar Ajustes no site BMF!"); 

      return ajuste;

   }



   int indexAjuste = StringFind(html, "Dólar Mini - WDO", 0);

   string strAjusteDolar = StringSubstr(html, indexAjuste, 160);

   

   //pegando valores de ajuste anterior

   ajuste.ajusteAnterior = getNumberStr(strAjusteDolar, "right\">", "</td>");

   //print("Ajuste Anterior: " + DoubleToString(ajusteAnterior));



   //pegando valores de ajuste atual

   strAjusteDolar = StringSubstr(strAjusteDolar, 118, 38);

   ajuste.ajusteAtual = getNumberStr(strAjusteDolar, "right\">", "</td>");

   //print("Ajuste Atual" + DoubleToString(ajusteAtual));

   

   print("Buscando ajustes: " + dt + " [" + DoubleToString(ajuste.ajusteAnterior) + ", " + DoubleToString(ajuste.ajusteAtual) + "]");

   return ajuste;

} //getAjustesDolar



//Pega dados de ajuste de uma data especifica

//retorna o corpo html da pagina solicitada

string getConteudoBMF(string dt) {

   string url = "https://www2.bmf.com.br/pages/portal/bmfbovespa/boletim1/Ajustes1.asp?txtData="+dt;

   string cookie = NULL, reference = NULL, headers, conteudoPage = NULL;

   int timeout = 5000, webRequestOk;

   char post[], charResultPage[];



   //busca dados na web

   ResetLastError();

   webRequestOk = WebRequest(

      "GET", url, cookie, reference, timeout, post, 0, charResultPage, headers);

   

   //busca e pega dados de ajuste

   if(!webRequestOk) {

      print("Problema ao buscar dados  de ajuste");

      return ""; }



   //junta todos os caracteres da pagina

   int size = ArraySize(charResultPage);

   for(int i = 0; i < size; i++) { 

      conteudoPage += CharToString(charResultPage[i]); }



   return conteudoPage;

}



// Escreve conteudo de myMqlRates rates em arquivo CSV

void WriteFileCSV(string fileName, myMqlRates &d[]){

   int h=FileOpen(fileName,FILE_WRITE|FILE_ANSI|FILE_CSV,";");

   if(h==INVALID_HANDLE){ Print("Erro ao salvar arquivo, INVALID_HANDLE"); return; }   

   

   int size = ArraySize(d);

   for(int i=0;i<size;i++)

      FileWrite(h, d[i].time, d[i].open, d[i].high, d[i].low, d[i].close, d[i].tick_volume,d[i].real_volume,d[i].ajuste_anterior,d[i].ajuste_atual);  

   FileClose(h);

}





double getNumberStr(string str, string ini, string end) {

   int indexIni = StringFind(str, ini, 0)+StringLen(ini);

   int indexEnd = StringFind(str, end, indexIni);

   string _return = StringSubstr(str, indexIni, indexEnd-indexIni);

   StringReplace(_return, ".", "");

   StringReplace(_return, ",", ".");

   return StringToDouble(_return);



}



string getCurrentDate() {

   MqlDateTime data;

   TimeToStruct(TimeCurrent(), data);

   return TimeToString(TimeCurrent(),TIME_DATE);

}



//Formata datetime retornando datas como => 21/12/2021

string getDate(datetime date) {

   string dt = TimeToString(date,TIME_DATE);

   ushort u_sep = StringGetCharacter(".",0);

   string _array[], _return;

   int k = StringSplit(dt,u_sep,_array);

   if(k==3)

      _return = (_array[2]+"/" + _array[1] + "/" + _array[0]); 

   return _return;

}





void print(string str) { if(showLOGs) { Print(str); }}

void print(double str) { if(showLOGs) { Print(DoubleToString(str)); }}

void print(int str) { if(showLOGs) { Print(IntegerToString(str)); }}

Comments