/*
3. ANÁLISE TÉCNICA
├── 3.1 Informacoes_Candles()
├── 3.2 OnInit()
├── 3.3 Atualizar_Indicadores()
├── 3.4 Estrategia_1()
└── 3.5 Estrategia_2()
*/
//-----------------------------------//
// 3. ANÁLISE TÉCNICA
//-----------------------------------//
// 3.1 Informacoes_Candles(): Função para extrair informações de candles.
// Versão com numCandles individualizado por timeframe
bool Informacoes_Candles(MultiTimeframeCandleInfo &candleInfo,
int numCandles_M1 = 120,
int numCandles_M5 = 288,
int numCandles_M15 = 80,
int numCandles_H1 = 240,
int numCandles_H4 = 40,
int numCandles_D1 = 180,
int numCandles_W1 = 50,
int numCandles_MN1 = 12,
bool verbose = false)
{
// Configura todos os arrays como série temporal
ArraySetAsSeries(candles_M1, true);
ArraySetAsSeries(candles_M5, true);
ArraySetAsSeries(candles_M15, true);
ArraySetAsSeries(candles_H1, true);
ArraySetAsSeries(candles_H4, true);
ArraySetAsSeries(candles_D1, true);
ArraySetAsSeries(candles_W1, true);
ArraySetAsSeries(candles_MN1, true);
// Redimensiona os arrays com os tamanhos específicos
ArrayResize(candles_M1, numCandles_M1);
ArrayResize(candles_M5, numCandles_M5);
ArrayResize(candles_M15, numCandles_M15);
ArrayResize(candles_H1, numCandles_H1);
ArrayResize(candles_H4, numCandles_H4);
ArrayResize(candles_D1, numCandles_D1);
ArrayResize(candles_W1, numCandles_W1);
ArrayResize(candles_MN1, numCandles_MN1);
// Copia os dados para cada timeframe com seus respectivos tamanhos
int copiedM1 = CopyRates(_Symbol, PERIOD_M1, 0, numCandles_M1, candles_M1);
int copiedM5 = CopyRates(_Symbol, PERIOD_M5, 0, numCandles_M5, candles_M5);
int copiedM15 = CopyRates(_Symbol, PERIOD_M15, 0, numCandles_15m, candles_M15);
int copiedH1 = CopyRates(_Symbol, PERIOD_H1, 0, numCandles_H1, candles_H1);
int copiedH4 = CopyRates(_Symbol, PERIOD_H4, 0, numCandles_H4, candles_H4);
int copiedD1 = CopyRates(_Symbol, PERIOD_D1, 0, numCandles_D1, candles_D1);
int copiedW1 = CopyRates(_Symbol, PERIOD_W1, 0, numCandles_W1, candles_W1);
int copiedMN1 = CopyRates(_Symbol, PERIOD_MN1, 0, numCandles_MN1, candles_MN1);
// Verificação de erros detalhada
if(copiedM1 <= 0 || copiedM5 <= 0 || copiedM15 <= 0 || copiedH1 <= 0 ||
copiedH4 <= 0 || copiedD1 <= 0 || copiedW1 <= 0 || copiedMN1 <= 0)
{
if(verbose)
{
Print("Erro ao copiar dados:");
if(copiedM1 <= 0) Print("- PERIOD_M1: ", GetLastError(), " (Solicitados: ", numCandles_M1, ")");
if(copiedM5 <= 0) Print("- PERIOD_M5: ", GetLastError(), " (Solicitados: ", numCandles_M5, ")");
if(copiedM15 <= 0) Print("- PERIOD_M15: ", GetLastError(), " (Solicitados: ", numCandles_M15, ")");
if(copiedH1 <= 0) Print("- PERIOD_H1: ", GetLastError(), " (Solicitados: ", numCandles_H1, ")");
if(copiedH4 <= 0) Print("- PERIOD_H4: ", GetLastError(), " (Solicitados: ", numCandles_H4, ")");
if(copiedD1 <= 0) Print("- PERIOD_D1: ", GetLastError(), " (Solicitados: ", numCandles_D1, ")");
if(copiedW1 <= 0) Print("- PERIOD_W1: ", GetLastError(), " (Solicitados: ", numCandles_W1, ")");
if(copiedMN1 <= 0) Print("- PERIOD_MN1: ", GetLastError(), " (Solicitados: ", numCandles_MN1, ")");
}
return false;
}
// Preenche a estrutura com os candles mais recentes
candleInfo.current_M1 = candles_M1[0];
candleInfo.current_M5 = candles_M5[0];
candleInfo.current_M15 = candles_M15[0];
candleInfo.current_H1 = candles_H1[0];
candleInfo.current_H4 = candles_H4[0];
candleInfo.current_D1 = candles_D1[0];
candleInfo.current_W1 = candles_W1[0];
candleInfo.current_MN1 = candles_MN1[0];
if(verbose)
{
Print("Dados copiados com sucesso:");
Print("- M1: ", copiedM1, "/", numCandles_M1, " candles");
Print("- M5: ", copiedM5, "/", numCandles_M5, " candles");
Print("- M15: ", copiedM15, "/", numCandles_M15, " candles");
Print("- H1: ", copiedH1, "/", numCandles_H1, " candles");
Print("- H4: ", copiedH4, "/", numCandles_H4, " candles");
Print("- D1: ", copiedD1, "/", numCandles_D1, " candles");
Print("- W1: ", copiedW1, "/", numCandles_W1, " candles");
Print("- MN1: ", copiedMN1, "/", numCandles_MN1, " candles");
}
return true;
}
// 3.2 OnInit(), inicializa indicadores:
int OnInit() {
// Criação do indicador Média Móvel.
HandleMA_M1 = iMA(_Symbol, PERIOD_M1,InpPeriod_MA_M1,0,MODE_SMA,PRICE_CLOSE);
HandleMA_M5 = iMA(_Symbol, PERIOD_M5,InpPeriod_MA_M5,0,MODE_SMA,PRICE_CLOSE);
HandleMA_M15 = iMA(_Symbol, PERIOD_M15,InpPeriod_MA_M15,0,MODE_SMA,PRICE_CLOSE);
HandleMA_H1 = iMA(_Symbol, PERIOD_H1,InpPeriod_MA_H1,0,MODE_SMA,PRICE_CLOSE);
HandleMA_H4 = iMA(_Symbol, PERIOD_H4,InpPeriod_MA_H4,0,MODE_SMA,PRICE_CLOSE);
HandleMA_D1 = iMA(_Symbol, PERIOD_D1,InpPeriod_MA_D1,0,MODE_SMA,PRICE_CLOSE);
HandleMA_W1 = iMA(_Symbol, PERIOD_W1,InpPeriod_MA_W1,0,MODE_SMA,PRICE_CLOSE);
HandleMA_MN = iMA(_Symbol, PERIOD_MN1,InpPeriod_MA_MN,0,MODE_SMA,PRICE_CLOSE);
int handlesMA[] = {HandleMA_M1, HandleMA_M5, HandleMA_M15, HandleMA_H1, HandleMA_H4, HandleMA_D1, HandleMA_W1, HandleMA_MN};
string MAPeriods[] = {"1min", "5min", "15min", "1hour", "4hours", "1day", "1week", "1month"};
for (int i = 0; i < ArraySize(handlesMA); i++) {
if (handlesMA[i] == INVALID_HANDLE) {
Alert("Erro ao criar handles para Médias Móveis (", MAPeriods[i], ")");
return INIT_FAILED;
}
}
ArraySetAsSeries(BufferMA_M1, true);
ArraySetAsSeries(BufferMA_M5, true);
ArraySetAsSeries(BufferMA_M15, true);
ArraySetAsSeries(BufferMA_H1, true);
ArraySetAsSeries(BufferMA_H4, true);
ArraySetAsSeries(BufferMA_D1, true);
ArraySetAsSeries(BufferMA_W1, true);
ArraySetAsSeries(BufferMA_MN, true);
Print("Robô de simulação inicializado com sucesso.");
return INIT_SUCCEEDED;
}
// 3.3 AtualizarIndicadores()
void AtualizarIndicadores() {
// Atualização do Média Móvel para 1min.
if (CopyBuffer(HandleMA_M1, 0, 0, 12, BufferMA_M1) < 12) {
Print("Erro ao carregar valores da Média Móvel (M1)");
}
// Atualização do Média Móvel para 5min.
if (CopyBuffer(HandleMA_M5, 0, 0, 12, BufferMA_M5) < 12) {
Print("Erro ao carregar valores da Média Móvel (M5)");
}
if (CopyBuffer(HandleMA_M15, 0, 0, 12, BufferMA_M15) < 12) {
Print("Erro ao carregar valores da Média Móvel (M15)");
}
// Atualização do Média Móvel para 1h.
if (CopyBuffer(HandleMA_H1, 0, 0, 12, BufferMA_H1) < 12) {
Print("Erro ao carregar valores da Média Móvel (H1)");
}
// Atualização do Média Móvel para 4h.
if (CopyBuffer(HandleMA_H4, 0, 0, 12, BufferMA_H4) < 12) {
Print("Erro ao carregar valores da Média Móvel (H4)");
}
// Atualização do Média Móvel para 1D.
if (CopyBuffer(HandleMA_D1, 0, 0, 12, BufferMA_D1) < 12) {
Print("Erro ao carregar valores da Média Móvel (D1)");
}
// Atualização do Média Móvel para 1w.
if (CopyBuffer(HandleMA_W1, 0, 0, 12, BufferMA_w1) < 12) {
Print("Erro ao carregar valores da Média Móvel (W1)");
}
// Atualização do Média Móvel para 1month.
if (CopyBuffer(HandleMA_MN, 0, 0, 12, BufferMA_MN) < 12) {
Print("Erro ao carregar valores da Média Móvel (MN1)");
}
}
// 3.4 Estratégia_1():
int Estrategia_1() {
int buy1, sell1, buy2, sell2;
ContarPosicoesPorMagicNumber(buy1, sell1, buy2, sell2);
// Atualiza as informações dos candlesticks.
Informacoes_Candles(candles);
// 2. Obtenção de dados do mercado.
double currentBid = SymbolInfoDouble(_Symbol, SYMBOL_BID);
double currentAsk = SymbolInfoDouble(_Symbol, SYMBOL_ASK);
if(currentBid == 0 || currentAsk == 0) {
Print("Erro: não foi possível obter preços atuais (currentBid e currentAsk), Estratégia 1.");
return 0;
}
if (Ontime() == 0 && !HorarioRestrito()) {
// COMPRA CE.
if (buy1 == 0 &&
BufferMA_W1[0] > BufferMA_W1[1] && //Semanal
BufferMA_D1[0] > BufferMA_D1[1] && // Diário
BufferMA_D1[1] > BufferMA_D1[2] &&
CurrenBid > candles_D1[0].open &&
(BufferMA_H1[0] - BufferMA_H1[1]) > 0 && // Horário
(BufferMA_H1[1] - BufferMA_H1[2]) > 0 &&
(BufferMA_H1[0] - BufferMA_H1[1]) > (BufferMA_H1[1] - BufferMA_H1[2]) &&
BufferMA_M15[0] > BufferMA_M15[1] && // 15 min
BufferMA_M5[0] > BufferMA_M5[1] && // 5 min
BufferMA_M1[0] > BufferMA_M1[1] && // 1 min
(candles_M1[0].open - BufferMA_M1[0]) > 0 &&
(candles_M1[1].open - BufferMA_M1[1]) > 0 &&
(candles_M1[0].open - BufferMA_M1[0]) > (candles_M1[1].open - BufferMA_M1[1]) &&
currentAsk > candles_M1[1].high
) {
Print("Buy, Estratégia 1.");
// VERIFICA BLOQUEIO ANTES DE RETORNAR SINAL.
if(!IsMagicBlocked(InpMagicnumber1)) {
return 1; // Condição de compra atendida.
}
else {
Print("Buy: Magic Number ", InpMagicnumber1, " temporariamente bloqueado.");
}
}
// VENDA CE.
if (sell1 == 0 &&
BufferMA_W1[0] > BufferMA_W1[1] && //Semanal
BufferMA_D1[0] > BufferMA_D1[1] && // Diário
BufferMA_D1[1] > BufferMA_D1[2] &&
Currenbid < candles_D1[0].open &&
(BufferMA_H1[0] - BufferMA_H1[1]) > 0 && // Horário
(BufferMA_H1[1] - BufferMA_H1[2]) > 0 &&
(BufferMA_H1[0] - BufferMA_H1[1]) < (BufferMA_H1[1] - BufferMA_H1[2]) &&
BufferMA_M15[0] < BufferMA_M15[1] && // 15 min
BufferMA_M5[0] < BufferMA_M5[1] && // 5 min
BufferMA_M1[0] < BufferMA_M1[1] && // 1 min
(BufferMA_M1[0] - candles_M1[0].open) > 0 &&
(BufferMA_M1[1] - candles_M1[1].open) > 0 &&
(BufferMA_M1[0] - candles_M1[0].open) < (BufferMA_M1[1] - candles_M1[1].open) &&
currentBid < candles_M1[1].low
) {
Print("Sell, Estratégia 1.");
// VERIFICA BLOQUEIO ANTES DE RETORNAR SINAL
if(!IsMagicBlocked(InpMagicnumber1)) {
return -1; // Condição de compra atendida
}
else {
Print("Sell: Magic Number ", InpMagicnumber1, " temporariamente bloqueado.");
}
}
}
return 0;
}
//PARA HABILITAR A FUNÇÃO DELETE OS SÍMBOLOS /* e */, que estão no início e final da função Estratégia_2
/*
// 3.5 Estratégia_2:
int Estrategia_2() {
int buy1, sell1, buy2, sell2;
ContarPosicoesPorMagicNumber(buy1, sell1, buy2, sell2);
// Atualiza as informações dos candlesticks.
Informacoes_Candles(candles);
// 2. Obtenção de dados do mercado.
double currentBid = SymbolInfoDouble(_Symbol, SYMBOL_BID);
double currentAsk = SymbolInfoDouble(_Symbol, SYMBOL_ASK);
if(currentBid == 0 || currentAsk == 0) {
Print("Erro: não foi possível obter preços atuais (currentBid e currentAsk), Estratégia2");
return 0;
}
if (Ontime() == 0 && !HorarioRestrito()) {
// COMPRA CE
if (buy2 == 0 &&
BufferMA_W1[0] > BufferMA_W1[1] && //Semanal
BufferMA_D1[0] > BufferMA_D1[1] && // Diário
//Escreva a sua estratégia de compra:
) {
Print("Buy, Estratégia 2.");
// VERIFICA BLOQUEIO ANTES DE RETORNAR SINAL
if(!IsMagicBlocked(InpMagicnumber2)) {
return 1; // Condição de compra atendida
}
else {
Print("Buy: Magic Number ", InpMagicnumber2, " temporariamente bloqueado.");
}
}
// VENDA CE.
if (sell2 == 0 &&
BufferMA_W1[0] < BufferMA_W1[1] && //Semanal
BufferMA_D1[0] < BufferMA_D1[1] && // Diário
//Escreva a sua estratégia de venda:
) {
Print("Sell, Estratégia 2.");
// VERIFICA BLOQUEIO ANTES DE RETORNAR SINAL
if(!IsMagicBlocked(InpMagicnumber2)) {
return -1; // Condição de venda atendida
}
else {
Print("Sell: Magic Number ", InpMagicnumber2, " temporariamente bloqueado.");
}
}
}
return 0;
}
*/
DISCLAIMER – USO DE CÓDIGOS MQL5
Todo o conteúdo disponibilizado nesta página, incluindo, mas não se limitando a códigos-fonte em linguagem MQL5, exemplos de implementação, funções, rotinas, módulos e estruturas de robôs de negociação automatizada, tem finalidade exclusivamente educacional, acadêmica e demonstrativa.
Os códigos aqui apresentados NÃO devem, em hipótese alguma, ser utilizados em contas reais de negociação, seja parcial ou integralmente, sob pena de total responsabilidade do usuário por quaisquer perdas financeiras, danos patrimoniais, falhas operacionais, mau funcionamento de plataformas, bloqueios de conta, inconsistências de execução, slippage, requotes, falhas de corretoras ou quaisquer outros riscos inerentes à atividade de trading automatizado.
O uso dos códigos é estritamente permitido apenas em ambiente simulado (Conta de Demonstração – DEMO) do MetaTrader 5 (MT5), com objetivo de estudo, aprendizado, testes controlados e validação técnica de conceitos de programação e lógica de mercado.
O proprietário do site, bem como seus desenvolvedores, autores, colaboradores e representantes legais:
Não se responsabilizam por perdas financeiras de qualquer natureza;
Não oferecem garantia de rentabilidade, desempenho, estabilidade, integridade ou adequação dos códigos a qualquer finalidade específica;
Não prestam consultoria financeira, de investimentos ou recomendações de trading;
Não se responsabilizam por decisões operacionais tomadas com base direta ou indireta nos códigos aqui apresentados.
O usuário declara estar ciente de que operações no mercado financeiro envolvem riscos elevados, podendo resultar na perda total do capital investido, e que qualquer utilização dos códigos fora do ambiente educacional simulado é feita por conta e risco exclusivamente do usuário.
Ao acessar, copiar, estudar, modificar ou executar qualquer trecho de código disponibilizado nesta página, o usuário declara concordar integralmente com os termos deste aviso de isenção de responsabilidade (Disclaimer).
Caso o usuário não concorde com qualquer dos termos acima, deverá interromper imediatamente o acesso a este conteúdo e abster-se de utilizar os códigos aqui disponibilizados.
Código Bloco 3
Indicadores
Produtos
Artigos
Determine
Estudo Semanal
Robô MQL5
