Ótimo indicador! Criei o mesmo usando buffers. Alguma ideia de como plotar os níveis de suporte e resistência para cada dia, em vez de ter apenas o dia atual?
Esta é a minha versão até o momento. Mas não consigo encontrar uma maneira de obter 10 dias de barras diárias para cada barrade "timeframe atual"...
//+------------------------------------------------------------------+ //|B_ATR_Levels.mq5 | //+------------------------------------------------------------------+ #property copyright "Skullnick" #property link "https://www.mql5.com" #property version "1.00" //--- Configurações de plotagem do indicador #property indicator_chart_window #property indicator_buffers 6 #property indicator_plots 6 #property indicator_type1 DRAW_LINE #property indicator_color1 clrDeepSkyBlue #property indicator_width1 1 #property indicator_label1 "Resistance 1" #property indicator_style1 STYLE_DASH #property indicator_type2 DRAW_LINE #property indicator_color2 clrDeepSkyBlue #property indicator_width2 1 #property indicator_label2 "Resistance 2" #property indicator_style2 STYLE_DASH #property indicator_type3 DRAW_LINE #property indicator_color3 clrDeepSkyBlue #property indicator_width3 1 #property indicator_label3 "Resistance 3" #property indicator_style3 STYLE_DASH #property indicator_type4 DRAW_LINE #property indicator_color4 clrOrangeRed #property indicator_width4 1 #property indicator_label4 "Support 1" #property indicator_style4 STYLE_DASH #property indicator_type5 DRAW_LINE #property indicator_color5 clrOrangeRed #property indicator_width5 1 #property indicator_label5 "Support 2" #property indicator_style5 STYLE_DASH #property indicator_type6 DRAW_LINE #property indicator_color6 clrOrangeRed #property indicator_width6 1 #property indicator_label6 "Support 3" #property indicator_style6 STYLE_DASH //--- Entradas input int inpAtrPeriod = 21; // Período ATR //--- Buffers de indicadores double ExtR1Buffer[]; double ExtR2Buffer[]; double ExtR3Buffer[]; double ExtS1Buffer[]; double ExtS2Buffer[]; double ExtS3Buffer[]; // Pesos para o Average True Range double dWeights[]; // Variável global double dATR = 0; double dPreviousClose = 0; //+------------------------------------------------------------------+ //| Função de inicialização do indicador personalizado //+------------------------------------------------------------------+ int OnInit() { //--- mapeamento de buffers de indicadores SetIndexBuffer(0,ExtR1Buffer, INDICATOR_DATA); // Nível de resistência 1 SetIndexBuffer(1,ExtR2Buffer, INDICATOR_DATA); // Nível de resistência 2 SetIndexBuffer(2,ExtR3Buffer, INDICATOR_DATA); // Nível de resistência 3 SetIndexBuffer(3,ExtS1Buffer, INDICATOR_DATA); // Nível de suporte 1 SetIndexBuffer(4,ExtS2Buffer, INDICATOR_DATA); // Nível de suporte 2 SetIndexBuffer(5,ExtS3Buffer, INDICATOR_DATA); // Nível de suporte 3 ArraySetAsSeries(ExtR1Buffer, true); ArraySetAsSeries(ExtR2Buffer, true); ArraySetAsSeries(ExtR3Buffer, true); ArraySetAsSeries(ExtS1Buffer, true); ArraySetAsSeries(ExtS2Buffer, true); ArraySetAsSeries(ExtS3Buffer, true); // Redimensionar pesos ArrayResize(dWeights, inpAtrPeriod); // Definir suavização double dSmoothing = 2.0 / (ArraySize(dWeights) + 1); // Cálculo de pesos for(int i = 0; i < ArraySize(dWeights); i++) dWeights[i] = dSmoothing * MathPow(1 - dSmoothing, i); //--- return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ //| Função de iteração de indicador personalizado| //+------------------------------------------------------------------+ int OnCalculate(const int rates_total, const int prev_calculated, const datetime &time[], const double &open[], const double &high[], const double &low[], const double &close[], const long &tick_volume[], const long &volume[], const int &spread[]) { //--- // Obter dados diários e verificar se há dados suficientes MqlRates oDailyRates[]; ArraySetAsSeries(oDailyRates, true); int iLast = 0; if(prev_calculated == 0) iLast = rates_total - 1; else iLast = rates_total - prev_calculated; //--- Calcular níveis for(int i = iLast; i >= 0 && !IsStopped();i--) { int iNumDaysCopied = CopyRates(_Symbol, PERIOD_D1, 1, inpAtrPeriod + 1, oDailyRates); if(iNumDaysCopied >= (inpAtrPeriod+1) && bIsNewDay() == true) { // Calcular o ATR para o dia dATR = dCalculateATR(oDailyRates); dPreviousClose = oDailyRates[0].close; } ExtR1Buffer[i] = dPreviousClose + 0.5 * dATR; ExtR2Buffer[i] = dPreviousClose + 0.75 * dATR; ExtR3Buffer[i] = dPreviousClose + 1.0 * dATR; ExtS1Buffer[i] = dPreviousClose - 0.5 * dATR; ExtS2Buffer[i] = dPreviousClose - 0.75 * dATR; ExtS3Buffer[i] = dPreviousClose - 1.0 * dATR; } //--- valor de retorno de prev_calculated para a próxima chamada return(rates_total); } //+------------------------------------------------------------------+ //+------------------------------------------------------------------+ //| Calcular ATR| //+------------------------------------------------------------------+ double dCalculateATR(const MqlRates &oRates[]) { double dValue = 0; int iIndex = 0; for (int i = 0; i < ArraySize(dWeights); i++) { double dHL = oRates[i].high - oRates[i].low; double dHCp = MathAbs(oRates[i].high - oRates[i+1].close); double dLCp = MathAbs(oRates[i].low - oRates[i+1].close); double dTR = MathMax(MathMax(dHL, dHCp),dLCp); dValue += dTR * dWeights[iIndex]; iIndex++; } return dValue; } //----------------------------- // -- Check New Day //----------------------------- bool bIsNewDay(void) { bool bNewDay = false; static datetime oDateOld; datetime oDateNew[1]; MqlDateTime oStructDateOld; MqlDateTime oStructDateNew; // Copiar matriz da hora atual para New_Time int iCopyHandle = CopyTime(_Symbol, PERIOD_D1, 0, 1, oDateNew); TimeToStruct(oDateNew[0] , oStructDateNew); TimeToStruct(oDateOld , oStructDateOld); // Se a cópia for bem-sucedida if(iCopyHandle>0) { // If New Day if(oStructDateNew.day != oStructDateOld.day) { bNewDay = true; oDateOld = oDateNew[0]; } } return bNewDay; }
Hi
você pode tentar criar uma linha horizontal usando
ObjectCreate(0,_name,OBJ_HLINE,0,0,0);
e a hora de início + 'n' períodos como hora de parada.
Hi
Você pode tentar criar uma linha horizontal usando
e a hora de início + 'n' períodos como hora de parada.
A linha horizontal sempre se expande em todo o gráfico - você não pode limitá-la pelo parâmetro de tempo: https: //www.mql5.com/en/docs/constants/objectconstants/enum_object/obj_hline
- www.mql5.com
- Aplicativos de negociação gratuitos
- 8 000+ sinais para cópia
- Notícias econômicas para análise dos mercados financeiros
Você concorda com a política do site e com os termos de uso

ATR Probability Levels:
Níveis probabilísticos baseados em ATR. A "probabilidade" é calculada com base na média projetada do ATR e no preço Close do período anterior.
Autor: Mladen Rakic