//+------------------------------------------------------------------+ //| 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); } //+------------------------------------------------------------------+