//--------------------------------------------------//
// 4. Gestão de Riscos $↑³
//--------------------------------------------------//
// 4.1 Fechar_Posicoes():
void Fechar_Posicoes(ENUM_POSITION_TYPE posType, long magicNumberToClose) {
for (int i = PositionsTotal() - 1; i >= 0; i--) {
if (!PositionSelect(PositionGetSymbol(i))) continue;
// Verificar se a posição corresponde ao símbolo e magic number.
long magicNumber = PositionGetInteger(POSITION_MAGIC);
// Verificar se o magic number corresponde a qualquer um dos quatro magic numbers.
if ((magicNumber == InpMagicnumber1 || magicNumber == InpMagicnumber2 ||
magicNumber == InpMagicnumber3) &&
PositionGetInteger(POSITION_TYPE) == posType) {
ulong ticket = PositionGetInteger(POSITION_TICKET);
if (trade.PositionClose(ticket)) {
// Atualizar o tempo de fechamento conforme o magic number.
if (magicNumber == InpMagicnumber1) {
lastTradeCloseTimeMagicNumber1 = TimeCurrent(); // Para InpMagicnumber1.
Print("Posição com InpMagicnumber1 fechada. Atualizando lastTradeCloseTimeMagicNumber1 para: ",
TimeToString(lastTradeCloseTimeMagicNumber1, TIME_DATE | TIME_MINUTES));
}
else if (magicNumber == InpMagicnumber2) {
lastTradeCloseTimeMagicNumber2 = TimeCurrent(); // Para InpMagicnumber2.
Print("Posição com InpMagicnumber2 fechada. Atualizando lastTradeCloseTimeMagicNumber2 para: ",
TimeToString(lastTradeCloseTimeMagicNumber2, TIME_DATE | TIME_MINUTES));
}
else if (magicNumber == InpMagicnumber3) {
lastTradeCloseTimeMagicNumber3 = TimeCurrent(); // Para InpMagicnumber3.
Print("Posição com InpMagicnumber3 fechada. Atualizando lastTradeCloseTimeMagicNumber3 para: ",
TimeToString(lastTradeCloseTimeMagicNumber3, TIME_DATE | TIME_MINUTES));
}
Print("Posição fechada: Ticket ", ticket, ". Hora: ", TimeToString(TimeCurrent(), TIME_DATE | TIME_MINUTES));
} else {
Print("Falha ao fechar posição. Ticket: ", ticket, ". Erro: ", GetLastError());
}
}
}
}
// 4.2 Contar_Posicoes_por_MagicNumber():
void Contar_Posicoes_por_MagicNumber(int &buy1, int &sell1, int &buy2, int &sell2) {
// Inicializar contadores
buy1 = sell1 = buy2 = sell2 = 0;
// Variável para verificar se há posições abertas.
bool posicoesAbertas = false;
// Percorrer todas as posições abertas.
for (int i = 0; i < PositionsTotal(); i++) {
ulong ticket = PositionGetTicket(i); // Obtém o ticket da posição.
if (ticket > 0) {
// Seleciona a posição pelo ticket.
if (PositionSelectByTicket(ticket)) {
long magic = PositionGetInteger(POSITION_MAGIC); // Obtém o Magic Number.
ENUM_POSITION_TYPE tipo = (ENUM_POSITION_TYPE)PositionGetInteger(POSITION_TYPE); // Obtém o tipo de posição (BUY/SELL).
// Log para depuração
Print("Posição ", i, " - Ticket: ", ticket, " | Magic: ", magic, " | Tipo: ", EnumToString(tipo));
// Verifica qual Magic Number e incrementa contadores de compra ou venda.
if (magic == InpMagicnumber1) {
if (tipo == POSITION_TYPE_BUY) buy1++;
else if (tipo == POSITION_TYPE_SELL) sell1++;
}
else if (magic == InpMagicnumber2) {
if (tipo == POSITION_TYPE_BUY) buy2++;
else if (tipo == POSITION_TYPE_SELL) sell2++;
}
// Se houver pelo menos uma posição, marca como verdadeira.
posicoesAbertas = true;
}
}
}
// Exibir os resultados no log somente se houver posições abertas.
if (posicoesAbertas) {
Print("Posições abertas por Magic Number:");
Print("MagicNumber1 (", InpMagicnumber1, ") -> Compras: ", buy1, " | Vendas: ", sell1);
Print("MagicNumber2 (", InpMagicnumber2, ") -> Compras: ", buy2, " | Vendas: ", sell2);
}
}
//4.3 Checar_Historico():
void Checar_Historico() {
// Verificação de conexão
if(!TerminalInfoInteger(TERMINAL_CONNECTED)) {
Print("Erro: Terminal não está conectado");
return;
}
// Seleção do histórico com verificação
datetime start_time = TimeCurrent() - 1; // 1 segundo atrás
datetime end_time = TimeCurrent();
if(!HistorySelect(start_time, end_time)) {
Print("Falha ao selecionar histórico do período");
return;
}
int totalDeals = HistoryDealsTotal();
if(totalDeals <= 0) return;
for(int i = totalDeals - 1; i >= 0; i--) {
ulong deal_ticket = HistoryDealGetTicket(i);
if(deal_ticket == 0) {
Print("Erro: Falha ao obter ticket do negócio #", i);
continue;
}
if(HistoryDealGetInteger(deal_ticket, DEAL_ENTRY) == DEAL_ENTRY_OUT) {
long magic = HistoryDealGetInteger(deal_ticket, DEAL_MAGIC);
// Tenta obter magic da posição se não estiver no negócio
if(magic == 0) {
ulong position_ticket = HistoryDealGetInteger(deal_ticket, DEAL_POSITION_ID);
if(PositionSelectByTicket(position_ticket)) {
magic = PositionGetInteger(POSITION_MAGIC);
}
}
// Verifica se o magic está na lista de magics permitidos
bool isAllowedMagic = false;
for(int m = 0; m < ArraySize(magicNumbers); m++) {
if(magicNumbers[m] == magic) {
isAllowedMagic = true;
break;
}
}
if(!isAllowedMagic) continue;
// Processa apenas magics válidos
if(magic > 0) {
// Verifica se já está bloqueado
bool isAlreadyBlocked = false;
int magicIndex = -1;
// Encontra o índice do magic number
for(int m = 0; m < ArraySize(magicNumbers); m++) {
if(magicNumbers[m] == magic) {
magicIndex = m;
break;
}
}
if(magicIndex == -1) continue;
// Verifica se o bloqueio já está ativo
if(blockTimes[magicIndex] > TimeCurrent()) {
isAlreadyBlocked = true;
}
// Aplica novo bloqueio se necessário
if(!isAlreadyBlocked) {
blockTimes[magicIndex] = TimeCurrent() + BLOCK_TIME;
PrintFormat("Bloqueio ativado: Magic %d até %s",
magic, TimeToString(blockTimes[magicIndex], TIME_DATE|TIME_MINUTES|TIME_SECONDS));
}
}
}
}
}
// 4.4 Função Magic_Bloqueado(): Verificar se um Magic Number está bloqueado para condição de mercado.
long Magic_Bloqueado(long magic) {
for (int i = 0; i < ArraySize(magicNumbers); i++) {
if (magicNumbers[i] == magic) {
if (TimeCurrent() < blockTimes[i]) {
// Retorna o Magic Number bloqueado.
return magic;
}
}
}
// Se não estiver bloqueado, retorna 0 (nenhum bloqueio)
return 0;
}
/* Esta função verifica se um determinado Magic Number está atualmente bloqueado e impede novas operações para ele até que o tempo de bloqueio expire.
Percorre o array magicNumbers[] para encontrar o Magic Number passado como argumento (magic).
Se encontrar o Magic Number, verifica se o tempo atual (TimeCurrent()) é menor que o tempo de bloqueio (blockTimes[i]).
Se o Magic Number ainda estiver bloqueado, imprime uma mensagem e retorna true (impedindo a operação).
Caso contrário, retorna false, permitindo a operação.
*/
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 4
Indicadores
Produtos
Artigos
Determine
Estudo Semanal
Robô MQL5
