RenkoBR/RenkoBR.mq5
super.admin 63d7c86ec6 convert
2025-05-30 16:20:23 +02:00

199 lines
14 KiB
MQL5

//+------------------------------------------------------------------+
//| RenkoBR.mq5 |
//| Copyright 2019, RenkoBR |
//| https://www.renkobr.com.br |
//+------------------------------------------------------------------+
#property service
#property copyright "© RenkoBR"
#property link "https://www.renkobr.com.br/"
#property icon "\\Shared Projects\\RenkoBR\\Images\\RenkoBR.ico";
#define VersaoCodigo "131.120"
#define NomeServico "RenkoBR"
#property version VersaoCodigo
#property description NomeServico
#property description "Formas de uso e Manuais, no nosso site:"
#property description "https://www.renkobr.com.br"
//+------------------------------------------------------------------+
//| INCLUDES PRINCIPAIS |
//+------------------------------------------------------------------+
#include "CustomCharts.mqh"
//+------------------------------------------------------------------+
//| PARAMETROS DE ENTRADA DO USUÁRIO |
//+------------------------------------------------------------------+
input group "Renko Box:"
input string P_Ativo_Base = ""; // Ativo Base (Symbol)
input int P_Tempo_Refresh = 1; // Tempo Atualização em ms (Quanto menor mais cpu usa)
input ENUM_CUSTOM_TYPE P_Tipo_Box = RENKO_TYPE_R; // Tipo de Box Renko
input double P_Tamanho_Box = 20; // Tamanho do Box
input group "Opções:"
input bool P_Sombras = true; // Mostrar Sombra
input bool P_Assimetrica = true; // Reversão Assimétrica (Abertura Artificial na Reversão)
input bool P_Gap = true; // Mostrar o Gap?
input bool P_Nivelar = true; // Nivelar pelo Box?
input bool P_Avancar = true; // Avançar Box no tempo?
input group "Histórico:"
input datetime P_RatesHistory = 0; // Taxas (o padrão é 7 dias 1M taxas de OHLC.)
input bool P_RealTicks = false; // Ticks reais (Histórico baseado em ticks reais. MAIS LENTO!)
//+------------------------------------------------------------------+
//| INICIO DO PROCESSAMENTO DO SERVICE RENKO |
//+------------------------------------------------------------------+
int OnStart()
{
ResetLastError();
string NomeAtivo = P_Ativo_Base;
if (NomeAtivo == "")
{
string s_Msg = "Informe o Ativo base no parametro: Ativo Base (Symbol)";
Print(s_Msg);
MessageBox(s_Msg, NomeServico, MB_ICONSTOP || MB_OK);
return(INIT_FAILED);
}
if (!SymbolInfoInteger(NomeAtivo, SYMBOL_EXIST))
{
string s_Msg = "O Ativo base: " + NomeAtivo + " - informado no parametro não existe!";
Print(s_Msg);
MessageBox(s_Msg, NomeServico, MB_ICONSTOP || MB_OK);
return(INIT_FAILED);
}
ResetLastError();
//1. Cria classe e simbolo
CustomCharts *RenkoBR;
RenkoBR = new CustomCharts();
if(RenkoBR == NULL)
{
delete RenkoBR;
string s_Msg = "Erro ao criar Classe do Renko. Código de erro: " + (string) GetLastError();
Print(s_Msg);
MessageBox(s_Msg, NomeServico, MB_ICONSTOP || MB_OK);
return(INIT_FAILED);
}
//2. Cria ativo
string m_AtivoRenko = "";
switch(P_Tipo_Box)
{
case RENKO_TYPE_R:
m_AtivoRenko = StringFormat("%s.%gR", NomeAtivo, P_Tamanho_Box);
break;
case RENKO_TYPE_PIPS:
m_AtivoRenko = StringFormat("%s.%gpip", NomeAtivo, P_Tamanho_Box);
break;
case RENKO_TYPE_POINTS:
m_AtivoRenko = StringFormat("%s.%gpoint", NomeAtivo, P_Tamanho_Box);
break;
case RENKO_TYPE_TICKS:
m_AtivoRenko = StringFormat("%s.%gtks", NomeAtivo, P_Tamanho_Box);
break;
case POINTS_TYPE_TICKS:
m_AtivoRenko = StringFormat("%s.P%gtks", NomeAtivo, P_Tamanho_Box);
break;
case POINTS_TYPE_PIPS:
m_AtivoRenko = StringFormat("%s.P%gpip", NomeAtivo, P_Tamanho_Box);
break;
case POINTS_TYPE_POINTS:
m_AtivoRenko = StringFormat("%s.P%gpts", NomeAtivo, P_Tamanho_Box);
break;
case POINTS_TYPE_P:
m_AtivoRenko = StringFormat("%s.P%g", NomeAtivo, P_Tamanho_Box);
break;
}
ResetLastError();
if(!RenkoBR.Setup(NomeAtivo, P_Tipo_Box, P_Tamanho_Box, P_Sombras, P_Assimetrica, P_Gap, P_Nivelar, P_Avancar, P_RatesHistory, P_RealTicks, true))
{
string s_Msg = "Erro ao iniciar Renko. Código de erro: " + (string) GetLastError();
if (GetLastError() == 4306)
{
s_Msg = "Limite de Ativos atingido na janela de Observação de mercado.\n Apague (Oculte) alguns e reinicie o Renko.";
}
delete RenkoBR;
Print(s_Msg);
MessageBox(s_Msg, NomeServico, MB_ICONSTOP || MB_OK);
return(INIT_FAILED);
}
//3. Cria simbolo customizado
if (!RenkoBR.CreateCustomSymbol(m_AtivoRenko))
{
delete RenkoBR;
Print("Não foi possivel gerar o ativo customizado pelo Renko! Código de erro: ", GetLastError());
return(INIT_FAILED);
}
if(!SymbolSelect(m_AtivoRenko, true))
{
delete RenkoBR;
Print("Não foi possivel adicionar o ativo customizado pelo Renko! Código de erro: ", GetLastError());
return(INIT_FAILED);
}
//4. Carrega histórico
CustomSymbolSetInteger(m_AtivoRenko, SYMBOL_BACKGROUND_COLOR, clrLightSalmon);
RenkoBR.CarregaHistorico();
//5. Histórico carregado
SymbolSelect(m_AtivoRenko, false);
CustomSymbolSetInteger(m_AtivoRenko, SYMBOL_BACKGROUND_COLOR, clrLightGreen);
SymbolSelect(m_AtivoRenko, true);
long currChart = ChartFirst();
long prevChart = currChart;
int i = 0;
bool TemJaAberto = false;
if(currChart >= 0)
{
while(i <= CHARTS_MAX)
{
if(ChartSymbol(currChart) == m_AtivoRenko)
{
if(ChartPeriod(currChart) != PERIOD_M1 && StringLen(ChartGetString(currChart, CHART_EXPERT_NAME)) == 0)
{
// Só mexe no grafico aberto se nao tem nenhum EA no grafico.
ChartSetSymbolPeriod(currChart, m_AtivoRenko, PERIOD_M1);
}
TemJaAberto = true;
}
currChart = ChartNext(prevChart); // Obter o ID do novo gráfico usando o ID gráfico anterior
if(currChart < 0) break; // Fim da lista de gráfico
prevChart = currChart;
i++;
}
}
if (!TemJaAberto)
{
ChartOpen(m_AtivoRenko, PERIOD_M1);
}
//6. Inicia Serviço
while(!IsStopped())
{
RenkoBR.Refresh();
Sleep(P_Tempo_Refresh);
}
//7. Finaliza Serviço
if(RenkoBR != NULL)
{
delete RenkoBR;
}
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+