Indicador CCI combinado com Média Móvel

 

Olá, estou tentando configurar um indicador de coloração de candles que combina o CCI juntamente com uma média móvel, mas algo não está certo no código. Ele está deixando tudo vermelho embaixo da média móvel, além de interpretar o período do CCI também como uma média móvel. Eu agradeceria imensamente, de coração, se alguém puder me ajudar.

//+------------------------------------------------------------------+
//|                                                MediaMovelCCI.mq5 |
//|                                  Copyright 2022, MetaQuotes Ltd. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2022, MetaQuotes Ltd."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property indicator_chart_window

#property indicator_buffers 7
#property indicator_plots   1

#property indicator_label1  "Candles"
#property indicator_type1   DRAW_COLOR_CANDLES
#property indicator_color1  clrRed,clrLime,clrBlack
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1

#define VERMELHO 0
#define VERDE 1
#define PRETO 2
//--- input parameters
input int                 Periodo=50;
input ENUM_MA_METHOD      Metodo=MODE_EMA;
input ENUM_APPLIED_PRICE  Preco=PRICE_CLOSE;
input int                 PeriodoCCI=14;
input ENUM_APPLIED_PRICE  PrecoCCI=PRICE_CLOSE;

//--- indicator buffers
double         CandlesBuffer1[];
double         CandlesBuffer2[];
double         CandlesBuffer3[];
double         CandlesBuffer4[];
double         CandlesColors[];
//---
double         MediaBuffer[];
double         CCIBuffer[];
//---
int            media_handle;
int            cci_handle;



int OnInit()
  {
 SetIndexBuffer(0,CandlesBuffer1,INDICATOR_DATA);
   SetIndexBuffer(1,CandlesBuffer2,INDICATOR_DATA);
   SetIndexBuffer(2,CandlesBuffer3,INDICATOR_DATA);
   SetIndexBuffer(3,CandlesBuffer4,INDICATOR_DATA);
   SetIndexBuffer(4,CandlesColors,INDICATOR_COLOR_INDEX);
   SetIndexBuffer(5,MediaBuffer,INDICATOR_CALCULATIONS);
   SetIndexBuffer(6,CCIBuffer,INDICATOR_CALCULATIONS);
   
   ArraySetAsSeries(CandlesBuffer1, true);
   ArraySetAsSeries(CandlesBuffer2, true);
   ArraySetAsSeries(CandlesBuffer3, true);
   ArraySetAsSeries(CandlesBuffer4, true);
   ArraySetAsSeries(CandlesColors, true);
   ArraySetAsSeries(MediaBuffer, true);
   ArraySetAsSeries(CCIBuffer, true);
   
   media_handle = iMA(_Symbol, _Period, Periodo, 0, Metodo, Preco);
   cci_handle = iCCI(_Symbol,_Period,PeriodoCCI,PrecoCCI); 
   
   
   //iRSI(_Symbol, _Period, PeriodoCCI, PrecoCCI);
   
   if(media_handle==INVALID_HANDLE || cci_handle==INVALID_HANDLE)
      return INIT_SUCCEEDED;
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
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[])
  {
//---
   ArraySetAsSeries(open, true);
   ArraySetAsSeries(high, true);
   ArraySetAsSeries(low, true);
   ArraySetAsSeries(close, true);


   int copiar = MathMin(rates_total, rates_total - prev_calculated + 1);
   
   if(CopyBuffer(media_handle, 0, 0, copiar, MediaBuffer)<=0) 
      return 0;
   if(CopyBuffer(cci_handle, 0, 0, copiar, CCIBuffer)<=0) 
      return 0;
   return(rates_total);
   
   
   for(int i=copiar-1; i>=0; i--)
      {
       CandlesBuffer1[i] = open[i];
       CandlesBuffer2[i] = high[i];
       CandlesBuffer3[i] = low[i];
       CandlesBuffer4[i] = close[i];
       
       CandlesColors[i] = PRETO;
       
       if(i>=rates_total-1) continue;
       
       if(CCIBuffer[i] <= -100 && MediaBuffer[i] > MediaBuffer[i+1]) CandlesColors[i] = VERDE; 
       if(CCIBuffer[i] >= 100 && MediaBuffer[i] < MediaBuffer[i+1]) CandlesColors[i] = VERMELHO; 
      }
  }
//+------------------------------------------------------------------+

adeceria imensamente, de coração, se alguém puder me ajudar.

Discover new MetaTrader 5 opportunities with MQL5 community and services
Discover new MetaTrader 5 opportunities with MQL5 community and services
  • 2022.11.26
  • www.mql5.com
MQL5: language of trade strategies built-in the MetaTrader 5 Trading Platform, allows writing your own trading robots, technical indicators, scripts and libraries of functions
 
Gabriell2020:

Olá, estou tentando configurar um indicador de coloração de candles que combina o CCI juntamente com uma média móvel, mas algo não está certo no código. Ele está deixando tudo vermelho embaixo da média móvel, além de interpretar o período do CCI também como uma média móvel. Eu agradeceria imensamente, de coração, se alguém puder me ajudar.

adeceria imensamente, de coração, se alguém puder me ajudar.

Bom dia.

Do jeito que você fez você está calculando a média dos preços e não do CCI.

Faça assim, inerte a ordem da criação dos handles, primeiro chama o CCI... E no handle da média, no último parâmetro, ao invés de preço coloca "cci_handle".

Ah, não olhei o resto do código, mas no init isto já inviabilizaria o que você quer.

Dica: se no calculate você usar o print, vai ver que os valores da média são dos preços e não do CCI.

Avisa aí se deu certo, abs.
d

Razão: