199 lines
14 KiB
MQL5
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);
|
|
}
|
|
//+------------------------------------------------------------------+
|