mt5-clear-wing26-scalper/WinFutLib/WinFutHorarioBovespaLibs.mqh

423 lines
34 KiB
MQL5
Raw Permalink Normal View History

2026-01-19 20:37:51 -03:00
<EFBFBD><EFBFBD>//+------------------------------------------------------------------+
//| HorarioBovespaLibs.mqh |
//| Copyright 2024, MetaQuotes Ltd. |
//| https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2024, MetaQuotes Ltd."
#property link "https://www.mql5.com"
//+------------------------------------------------------------------+
//| defines |
//+------------------------------------------------------------------+
// #define MacrosHello "Hello, world!"
// #define MacrosYear 2010
//+------------------------------------------------------------------+
//| DLL imports |
//+------------------------------------------------------------------+
// #import "user32.dll"
// int SendMessageA(int hWnd,int Msg,int wParam,int lParam);
// #import "my_expert.dll"
// int ExpertRecalculate(int wParam,int lParam);
// #import
//+------------------------------------------------------------------+
//| EX5 imports |
//+------------------------------------------------------------------+
// #import "stdlib.ex5"
// string ErrorDescription(int error_code);
// #import
//+------------------------------------------------------------------+
2026-01-22 08:31:56 -03:00
#include <Object.mqh>
2026-01-28 22:22:04 -03:00
#include <WinFutLib\WinFutMsgLogs.mqh>
2026-01-19 20:37:51 -03:00
2026-01-28 22:22:04 -03:00
WinFutMsgLogs msgLogs;
2026-01-19 20:37:51 -03:00
//#######################################################################
2026-01-30 07:34:05 -03:00
//Class para horarios Bovespa #
2026-01-19 20:37:51 -03:00
//#######################################################################
2026-01-22 08:31:56 -03:00
2026-01-30 07:34:05 -03:00
class WinFutHorarioBovespaLibs {
2026-01-22 08:31:56 -03:00
public:
WinFutHorarioBovespaLibs(void);
~WinFutHorarioBovespaLibs(void);
string getTimestampChart(void);
string getTimeDate(string);
string getTime(string);
bool winLeilaoAberturaBMF(void);
bool horarioBovespaBMFFBS(void);
bool winLeilaoAberturaBovespa(void);
bool winAlmocoBovespa(void);
bool winTardeBovespa(void);
bool winLeilaoFechamentoBMF(void);
bool validaBoletasIntraday(void);
bool validaBoletasIntradayForexBRL(void);
string getTimestamp(void);
string getTimestampBR(void);
2026-01-30 07:34:05 -03:00
bool VerificarNovoDia(void);
2026-01-28 22:22:04 -03:00
bool HorarioTradingPermitido(void);
bool HorarioAltaVolatilidade(void);
2026-01-22 08:31:56 -03:00
};
WinFutHorarioBovespaLibs::WinFutHorarioBovespaLibs(void) { }
WinFutHorarioBovespaLibs::~WinFutHorarioBovespaLibs(void){ }
string WinFutHorarioBovespaLibs::getTimestampChart(void) {
2026-01-19 20:37:51 -03:00
return (string) TimeCurrent();
}
2026-01-22 08:31:56 -03:00
string WinFutHorarioBovespaLibs::getTimeDate(string data) {
2026-01-19 20:37:51 -03:00
datetime time = (datetime) data;
return TimeToString(time, TIME_DATE);
}
2026-01-22 08:31:56 -03:00
string WinFutHorarioBovespaLibs::getTime(string data) {
2026-01-19 20:37:51 -03:00
datetime time = (datetime) data;
return TimeToString(time, TIME_MINUTES|TIME_SECONDS);
}
2026-01-22 08:31:56 -03:00
string WinFutHorarioBovespaLibs::getTimestamp(void) {
datetime agora = TimeCurrent();
MqlDateTime dt;
TimeToStruct(agora, dt);
int hora = dt.hour;
int minuto = dt.min;
int horaMinuto = hora * 100 + minuto;
datetime diaAtual = StringToTime(
StringFormat(
"%02d.%02d.%04d-%02d:%02d:%02d",
dt.day,
dt.mon,
dt.year,
dt.hour,
dt.min,
dt.sec
)
);
return (string) diaAtual;
}
2026-01-19 20:37:51 -03:00
2026-01-22 08:31:56 -03:00
string WinFutHorarioBovespaLibs::getTimestampBR(void) {
datetime ts = TimeCurrent();
MqlDateTime dt;
TimeToStruct(ts, dt);
return (string)
//"dbg=>day_of_week=>" + dt.day_of_week +
//"dbg=>day_of_year=>" + dt.day_of_year +
//"dbg=>mon=>" + dt.mon +
dt.day+"/"+dt.mon+"/"+dt.year+
"-"+dt.hour+":"+dt.min+":"+dt.sec;
}
2026-01-19 20:37:51 -03:00
/************************************************************************
* 1)leilao abertura BMF *
* neste horario eh representado pela abertura de futuros da BMF, *
* um bom horario para operar abertura eh das: *
* 09:00 ~ 09:25 *
* porque as 09:30 sempre tem noticias que podem bater em nosso stop; *
*************************************************************************/
2026-01-22 08:31:56 -03:00
bool WinFutHorarioBovespaLibs::winLeilaoAberturaBMF(void) {
2026-01-19 20:37:51 -03:00
return (bool) ((getTime(getTimestampChart()) > "09:05:00") && (getTime(getTimestampChart()) < "09:25:00"));
}
/*************************************************************************
* Horario operacao USD/BRL corretora FBS * *
* horario especifico de operacao da corretora FBS para o par exotic BRL*
* 09:30 ~ 17:00 *
**************************************************************************/
2026-01-22 08:31:56 -03:00
bool WinFutHorarioBovespaLibs::horarioBovespaBMFFBS(void) {
2026-01-19 20:37:51 -03:00
return (bool) ((getTime(getTimestampChart()) > "09:30:00") && (getTime(getTimestampChart()) < "17:00:00"));
}
/************************************************************************
* 2)abertura Bovespa *
* a abertura do mercado a vista Bovespa eh as 10:00h em ponto porem *
* como se trata de acoes, na grande maioria das vezes, algumas delas *
* ficam um certo tempo em leilao de abertura entao pelo que agente ja *
* observou, o WIN nos primeiros 15m fica as vezes sem dire<EFBFBD><EFBFBD>o com *
* altissima volatilidade, pode bater no stop desnecessariamente, *
* entao melhor horario para operar Bovespa eh depois da abertura *
* apos o leilao as: *
* 10:15h *
*************************************************************************/
2026-01-22 08:31:56 -03:00
bool WinFutHorarioBovespaLibs::winLeilaoAberturaBovespa(void) {
2026-01-19 20:37:51 -03:00
return (bool) ((getTime(getTimestampChart()) > "10:15:00") && (getTime(getTimestampChart()) < "11:59:00"));
}
/*************************************************************************
* 3)horario do almo<EFBFBD>o *
* neste horario eh um periodo nulo, por conta que nas bolsas de valores*
* os operadores estao em horario de almo<EFBFBD>o, e tb eh fechamento da *
* bolsa da europa, entao geralmente eh um periodo que a volatilidade eh*
* baixa, raro os casos de noticias de ultima hora: *
* 12:00 ~ 14:00 *
**************************************************************************/
2026-01-22 08:31:56 -03:00
bool WinFutHorarioBovespaLibs::winAlmocoBovespa(void) {
2026-01-19 20:37:51 -03:00
return (bool) ((getTime(getTimestampChart()) > "12:00:00") && (getTime(getTimestampChart()) < "13:59:00"));
}
/*************************************************************************
* 4)periodo da tarde *
* eh o periodo em que volta com um volume de negociacao mais forte e *
* pode fazer o mercado ficar mais direcional: *
* 14:00 ~ 17:00 *
**************************************************************************/
2026-01-22 08:31:56 -03:00
bool WinFutHorarioBovespaLibs::winTardeBovespa(void) {
2026-01-19 20:37:51 -03:00
return (bool) ((getTime(getTimestampChart()) > "14:00:00") && (getTime(getTimestampChart()) < "17:00:00"));
}
/**************************************************************************
* 5)leilao fechamento BMF *
* neste periodo apos as 17:00h o mercado de balcao Bovespa esta fechado *
* <EFBFBD> permitido operar o WIN porem precisa estar atento porque o volume *
* de negociacao geralmente eh muito baixo, unica vantagem eh q *
* geralmente ele obedece a mesma direcao de quando foi fechado o mercado*
* Bovespa as 17h: *
* 17:00 ~ 18:15 *
* *
* *obs: *
* nesta function precisa ter uma funcionalidade de quando o horario *
* passar das 17:55h ele precisa stopar todas as boletas nos status: *
* ->em aberto *
* ->em execucao *
* ->pendentes *
***************************************************************************/
2026-01-22 08:31:56 -03:00
bool WinFutHorarioBovespaLibs::winLeilaoFechamentoBMF(void) {
2026-01-19 20:37:51 -03:00
return (bool) ((getTime(getTimestampChart()) > "17:00:00") && (getTime(getTimestampChart()) < "17:55:00"));
}
/**
* primeiro precisamos pegar a data atual do chart
* a variavel dataIntraday inicializa NULL
* precisamos verificar se a data se hoje eh igual a variavel dataIntraday
* se nao for primeiro agente atribui a data chart para a variavel
* depois precisamos verificar se existem boletas em aberto sem estar em execucao
* se houver cancela todas
* agora se houver boletas em execucao agente precisa pesquisar alguma funcao
* pra ver se agente consegue fechar ela a mercado;
*
* se tratando de bovespa agente percebeu/aprendeu que existem mais horarios de corte
* por conta de algumas noticias que podem ocorrer no intraday, entao
* vamos colocar os horarios que sao disponiveis para negociacao que
* devem estar contempladas no nosso codigo:
*
* 1)abertura BMF
* neste horario eh representado pela abertura de futuros da BMF,
* um bom horario para operar abertura eh das:
* 09:00 ~ 09:25
* porque as 09:30 sempre tem noticias que podem bater em nosso stop;
*
* 2)abertura Bovespa
* a abertura do mercado a vista Bovespa eh as 10:00h em ponto porem
* como se trata de acoes, na grande maioria das vezes, algumas delas ficam
* um certo tempo em leilao de abertura entao pelo que agente ja observou,
* o WIN nos primeiros 15m fica as vezes sem dire<EFBFBD><EFBFBD>o com altissima volatilidade,
* pode bater no stop desnecessariamente, entao melhor horario para operar Bovespa eh depois
* da abertura apos o leilao as:
* 10:15h
*
* 3)horario do almo<EFBFBD>o
* neste horario eh um periodo nulo, por conta que nas bolsas de valores os operadores
* estao em horario de almo<EFBFBD>o, e tb eh fechamento da bolsa da europa, entao geralmente
* eh um periodo que a volatilidade eh baixa, raro os casos de noticias de ultima hora:
* 12:00 ~ 14:00
*
* 4)periodo da tarde
* eh o periodo em que volta com um volume de negociacao mais forte e pode fazer o mercado
* ficar mais direcional:
* 14:00 ~ 17:00
*
* 5)leilao fechamento BMF
* neste periodo apos as 17:00h o mercado de balcao Bovespa esta fechado, <EFBFBD> permitido
* operar o WIN porem precisa estar atento porque o volume de negociacao
* geralmente eh muito baixo, unica vantagem eh q geralmente ele obedece a mesma
* direcao de quando foi fechado o mercado Bovespa as 17h:
* 17:00 ~ 18:15
*
*/
2026-01-22 08:31:56 -03:00
bool WinFutHorarioBovespaLibs::validaBoletasIntraday(void) {
2026-01-19 20:37:51 -03:00
return (
winLeilaoAberturaBMF()
|| winLeilaoAberturaBovespa()
|| winAlmocoBovespa()
|| winTardeBovespa()
|| winLeilaoFechamentoBMF()
);
}
2026-01-22 08:31:56 -03:00
bool WinFutHorarioBovespaLibs::validaBoletasIntradayForexBRL(void) {
2026-01-19 20:37:51 -03:00
return horarioBovespaBMFFBS();
}
2026-01-28 22:22:04 -03:00
bool WinFutHorarioBovespaLibs::VerificarNovoDia() {
msgLogs.WinFutMsgLogsSetVerificarNovoDia();
datetime agora = TimeCurrent();
MqlDateTime dt;
TimeToStruct(agora, dt);
datetime diaAtual = StringToTime(
StringFormat(
"%04d.%02d.%02d 00:00",
dt.year,
dt.mon,
dt.day
)
);
if(ultimoDia != diaAtual) {
ultimoDia = diaAtual;
return true;
}
return false;
}
bool WinFutHorarioBovespaLibs::HorarioTradingPermitido() {
msgLogs.WinFutMsgLogsSetHorarioTradingPermitido();
MqlDateTime dt;
TimeToStruct(TimeCurrent(), dt);
int hora = dt.hour;
int minuto = dt.min;
int horaMinuto = hora * 100 + minuto;
if(dt.day_of_week == 0 || dt.day_of_week == 6) {
msgLogs.WinFutMsgInfoTrace("Verificar se <00> dia <00>til (Segunda a Sexta)");
return false;
}
if(OperarAberturaBMF && horaMinuto >= 915 && horaMinuto < 1000) {
msgLogs.WinFutMsgInfoTrace("Horarios de trading (Bras<00>lia)");
msgLogs.WinFutMsgInfoTrace("09:15-10:00: Apos leilao abertura BMF");
return true;
}
if(OperarAberturaBovespa && horaMinuto >= 1015 && horaMinuto < 1030) {
msgLogs.WinFutMsgInfoTrace("10:15-10:30: Apos leilao abertura Bovespa");
return true;
}
if(OperarAberturaEUA && horaMinuto >= 1030 && horaMinuto < 1200) {
msgLogs.WinFutMsgInfoTrace("10:30-12:00: Abertura mercado americano");
return true;
}
if(OperarTarde && horaMinuto >= 1400 && horaMinuto < 1645) {
msgLogs.WinFutMsgInfoTrace("14:00-16:45: Per<00>odo da tarde");
return true;
}
if(OperarFechamento && horaMinuto >= 1700 && horaMinuto < 1800) {
msgLogs.WinFutMsgInfoTrace("17:00-18:00: Ap<00>s fechamento Bovespa");
return true;
}
msgLogs.WinFutMsgInfoTrace("fora do horario Bovespa");
return false;
}
bool WinFutHorarioBovespaLibs::HorarioAltaVolatilidade() {
msgLogs.WinFutMsgLogsSetHorarioAltaVolatilidade();
MqlDateTime dt;
TimeToStruct(TimeCurrent(), dt);
int hora = dt.hour;
int minuto = dt.min;
int horaMinuto = hora * 100 + minuto;
if(horaMinuto >= 915 && horaMinuto < 1000) {
msgLogs.WinFutMsgInfoTrace("Hor<00>rios de alta volatilidade");
msgLogs.WinFutMsgInfoTrace("09:15-10:00: Ap<00>s leil<00>o BMF");
return true;
}
if(horaMinuto >= 1000 && horaMinuto < 1100) {
msgLogs.WinFutMsgInfoTrace("10:00-11:00: Abertura Bovespa + EUA");
return true;
}
if(horaMinuto >= 1700 && horaMinuto < 1800) {
msgLogs.WinFutMsgInfoTrace("17:00-18:00: Fechamento");
return true;
}
msgLogs.WinFutMsgInfoTrace("fora do horario de alta volatilidade Bovespa");
return false;
}
2026-01-19 20:37:51 -03:00
2026-01-22 08:31:56 -03:00
//+------------------------------------------------------------------+
//| Configura<EFBFBD><EFBFBD>es de hor<EFBFBD>rios espec<EFBFBD>ficos do mercado brasileiro |
//+------------------------------------------------------------------+
class HorariosBrasil {
2026-01-19 20:37:51 -03:00
2026-01-22 08:31:56 -03:00
public:
//--- Hor<EFBFBD>rios em formato HHMM
static int InicioLeilaoAberturaBMF() { return 900; }
static int FimLeilaoAberturaBMF() { return 915; }
static int InicioTradingBMF() { return 915; }
static int InicioLeilaoAberturaBovespa() { return 1000; }
static int FimLeilaoAberturaBovespa() { return 1015; }
static int AberturaEUA() { return 1030; }
static int InicioAlmoco() { return 1200; }
static int FimAlmoco() { return 1400; }
static int InicioLeilaoFechamentoBovespa() { return 1645; }
static int FechamentoBovespa() { return 1700; }
static int FechamentoBMF() { return 1800; }
//--- Verificar se <EFBFBD> hor<EFBFBD>rio de alta volatilidade
static bool IsAltaVolatilidade(int horaMinuto) {
// 09:15-10:00: Ap<EFBFBD>s leil<EFBFBD>o BMF
if(horaMinuto >= 915 && horaMinuto < 1000) return true;
// 10:00-11:00: Abertura Bovespa + prepara<EFBFBD><EFBFBD>o EUA
if(horaMinuto >= 1000 && horaMinuto < 1100) return true;
// 17:00-18:00: Fechamento
if(horaMinuto >= 1700 && horaMinuto < 1800) return true;
return false;
2026-01-19 20:37:51 -03:00
}
2026-01-22 08:31:56 -03:00
//--- Verificar se <EFBFBD> hor<EFBFBD>rio de trading permitido
static bool IsTradingPermitido(int horaMinuto) {
// 09:15-10:00: Ap<EFBFBD>s leil<EFBFBD>o abertura BMF
if(horaMinuto >= 915 && horaMinuto < 1000) return true;
// 10:15-12:00: Bovespa + prepara<EFBFBD><EFBFBD>o EUA
if(horaMinuto >= 1015 && horaMinuto < 1200) return true;
// 14:00-16:45: Per<EFBFBD>odo da tarde
if(horaMinuto >= 1400 && horaMinuto < 1645) return true;
// 17:00-18:00: Ap<EFBFBD>s fechamento Bovespa
if(horaMinuto >= 1700 && horaMinuto < 1800) return true;
return false;
}
//--- Verificar se deve evitar trading (hor<EFBFBD>rios de leil<EFBFBD>o)
static bool IsHorarioEvitar(int horaMinuto) {
// Leil<EFBFBD>o abertura BMF
if(horaMinuto >= 900 && horaMinuto < 915) return true;
// Leil<EFBFBD>o abertura Bovespa
if(horaMinuto >= 1000 && horaMinuto < 1015) return true;
// Hor<EFBFBD>rio de almo<EFBFBD>o
if(horaMinuto >= 1200 && horaMinuto < 1400) return true;
// Leil<EFBFBD>o fechamento Bovespa
if(horaMinuto >= 1645 && horaMinuto < 1700) return true;
return false;
}
};
2026-01-19 20:37:51 -03:00