RenkoBR/RenkoBR.mq5

200 lines
14 KiB
MQL5
Raw Permalink Normal View History

2025-05-30 16:20:23 +02:00
<EFBFBD><EFBFBD>//+------------------------------------------------------------------+
//| RenkoBR.mq5 |
//| Copyright 2019, RenkoBR |
//| https://www.renkobr.com.br |
//+------------------------------------------------------------------+
#property service
#property copyright "<00> 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<EFBFBD>RIO |
//+------------------------------------------------------------------+
input group "Renko Box:"
input string P_Ativo_Base = ""; // Ativo Base (Symbol)
input int P_Tempo_Refresh = 1; // Tempo Atualiza<EFBFBD><EFBFBD>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<00><00>es:"
input bool P_Sombras = true; // Mostrar Sombra
input bool P_Assimetrica = true; // Revers<EFBFBD>o Assim<EFBFBD>trica (Abertura Artificial na Revers<EFBFBD>o)
input bool P_Gap = true; // Mostrar o Gap?
input bool P_Nivelar = true; // Nivelar pelo Box?
input bool P_Avancar = true; // Avan<EFBFBD>ar Box no tempo?
input group "Hist<00>rico:"
input datetime P_RatesHistory = 0; // Taxas (o padr<EFBFBD>o <EFBFBD> 7 dias 1M taxas de OHLC.)
input bool P_RealTicks = false; // Ticks reais (Hist<EFBFBD>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<00>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<00>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<00>digo de erro: " + (string) GetLastError();
if (GetLastError() == 4306)
{
s_Msg = "Limite de Ativos atingido na janela de Observa<00><00>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<00>o foi possivel gerar o ativo customizado pelo Renko! C<00>digo de erro: ", GetLastError());
return(INIT_FAILED);
}
if(!SymbolSelect(m_AtivoRenko, true))
{
delete RenkoBR;
Print("N<00>o foi possivel adicionar o ativo customizado pelo Renko! C<00>digo de erro: ", GetLastError());
return(INIT_FAILED);
}
//4. Carrega hist<EFBFBD>rico
CustomSymbolSetInteger(m_AtivoRenko, SYMBOL_BACKGROUND_COLOR, clrLightSalmon);
RenkoBR.CarregaHistorico();
//5. Hist<EFBFBD>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<EFBFBD> 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<EFBFBD>fico usando o ID gr<EFBFBD>fico anterior
if(currChart < 0) break; // Fim da lista de gr<EFBFBD>fico
prevChart = currChart;
i++;
}
}
if (!TemJaAberto)
{
ChartOpen(m_AtivoRenko, PERIOD_M1);
}
//6. Inicia Servi<EFBFBD>o
while(!IsStopped())
{
RenkoBR.Refresh();
Sleep(P_Tempo_Refresh);
}
//7. Finaliza Servi<EFBFBD>o
if(RenkoBR != NULL)
{
delete RenkoBR;
}
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+