323 lines
28 KiB
MQL5
323 lines
28 KiB
MQL5
//+------------------------------------------------------------------+
|
|
//| 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
|
|
//+------------------------------------------------------------------+
|
|
|
|
#include <Object.mqh>
|
|
|
|
//#######################################################################
|
|
//functions para horarios Bovespa #
|
|
//#######################################################################
|
|
|
|
class WinFutHorarioBovespaLibs : public CObject {
|
|
|
|
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);
|
|
};
|
|
|
|
WinFutHorarioBovespaLibs::WinFutHorarioBovespaLibs(void) { }
|
|
WinFutHorarioBovespaLibs::~WinFutHorarioBovespaLibs(void){ }
|
|
|
|
string WinFutHorarioBovespaLibs::getTimestampChart(void) {
|
|
return (string) TimeCurrent();
|
|
}
|
|
|
|
string WinFutHorarioBovespaLibs::getTimeDate(string data) {
|
|
datetime time = (datetime) data;
|
|
return TimeToString(time, TIME_DATE);
|
|
}
|
|
|
|
string WinFutHorarioBovespaLibs::getTime(string data) {
|
|
datetime time = (datetime) data;
|
|
return TimeToString(time, TIME_MINUTES|TIME_SECONDS);
|
|
}
|
|
|
|
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;
|
|
}
|
|
|
|
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;
|
|
}
|
|
|
|
/************************************************************************
|
|
* 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; *
|
|
*************************************************************************/
|
|
bool WinFutHorarioBovespaLibs::winLeilaoAberturaBMF(void) {
|
|
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 *
|
|
**************************************************************************/
|
|
bool WinFutHorarioBovespaLibs::horarioBovespaBMFFBS(void) {
|
|
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çã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 *
|
|
*************************************************************************/
|
|
bool WinFutHorarioBovespaLibs::winLeilaoAberturaBovespa(void) {
|
|
return (bool) ((getTime(getTimestampChart()) > "10:15:00") && (getTime(getTimestampChart()) < "11:59:00"));
|
|
}
|
|
|
|
/*************************************************************************
|
|
* 3)horario do almoço *
|
|
* neste horario eh um periodo nulo, por conta que nas bolsas de valores*
|
|
* os operadores estao em horario de almoç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 *
|
|
**************************************************************************/
|
|
bool WinFutHorarioBovespaLibs::winAlmocoBovespa(void) {
|
|
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 *
|
|
**************************************************************************/
|
|
bool WinFutHorarioBovespaLibs::winTardeBovespa(void) {
|
|
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 *
|
|
* é 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 *
|
|
***************************************************************************/
|
|
bool WinFutHorarioBovespaLibs::winLeilaoFechamentoBMF(void) {
|
|
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çã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ço
|
|
* neste horario eh um periodo nulo, por conta que nas bolsas de valores os operadores
|
|
* estao em horario de almoç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, é 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
|
|
*
|
|
*/
|
|
|
|
bool WinFutHorarioBovespaLibs::validaBoletasIntraday(void) {
|
|
return (
|
|
winLeilaoAberturaBMF()
|
|
|| winLeilaoAberturaBovespa()
|
|
|| winAlmocoBovespa()
|
|
|| winTardeBovespa()
|
|
|| winLeilaoFechamentoBMF()
|
|
);
|
|
}
|
|
|
|
|
|
bool WinFutHorarioBovespaLibs::validaBoletasIntradayForexBRL(void) {
|
|
return horarioBovespaBMFFBS();
|
|
}
|
|
|
|
|
|
//+------------------------------------------------------------------+
|
|
//| Configurações de horários específicos do mercado brasileiro |
|
|
//+------------------------------------------------------------------+
|
|
class HorariosBrasil {
|
|
|
|
public:
|
|
//--- Horá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 é horário de alta volatilidade
|
|
static bool IsAltaVolatilidade(int horaMinuto) {
|
|
// 09:15-10:00: Após leilão BMF
|
|
if(horaMinuto >= 915 && horaMinuto < 1000) return true;
|
|
|
|
// 10:00-11:00: Abertura Bovespa + preparação EUA
|
|
if(horaMinuto >= 1000 && horaMinuto < 1100) return true;
|
|
|
|
// 17:00-18:00: Fechamento
|
|
if(horaMinuto >= 1700 && horaMinuto < 1800) return true;
|
|
|
|
return false;
|
|
}
|
|
|
|
//--- Verificar se é horário de trading permitido
|
|
static bool IsTradingPermitido(int horaMinuto) {
|
|
// 09:15-10:00: Após leilão abertura BMF
|
|
if(horaMinuto >= 915 && horaMinuto < 1000) return true;
|
|
|
|
// 10:15-12:00: Bovespa + preparação EUA
|
|
if(horaMinuto >= 1015 && horaMinuto < 1200) return true;
|
|
|
|
// 14:00-16:45: Período da tarde
|
|
if(horaMinuto >= 1400 && horaMinuto < 1645) return true;
|
|
|
|
// 17:00-18:00: Após fechamento Bovespa
|
|
if(horaMinuto >= 1700 && horaMinuto < 1800) return true;
|
|
|
|
return false;
|
|
}
|
|
|
|
//--- Verificar se deve evitar trading (horários de leilão)
|
|
static bool IsHorarioEvitar(int horaMinuto) {
|
|
// Leilão abertura BMF
|
|
if(horaMinuto >= 900 && horaMinuto < 915) return true;
|
|
|
|
// Leilão abertura Bovespa
|
|
if(horaMinuto >= 1000 && horaMinuto < 1015) return true;
|
|
|
|
// Horário de almoço
|
|
if(horaMinuto >= 1200 && horaMinuto < 1400) return true;
|
|
|
|
// Leilão fechamento Bovespa
|
|
if(horaMinuto >= 1645 && horaMinuto < 1700) return true;
|
|
|
|
return false;
|
|
}
|
|
};
|