HMA Indicator For MT5
O HMA Indicator For MT5 não é como uma média móvel clássica que sempre apresenta problemas de cálculo em tempo real. Com a ajuda da média móvel do casco, é possível encontrar um HMA exclusivo, conhecido como média móvel do casco, respondendo ao movimento dos preços de uma maneira muito precisa. Quando o preço do instrumento de negociação cair, a média móvel também seguirá para o sul, confirmando o estabelecimento da tendência de baixa. Pelo contrário, quando o preço começar a ganhar impulso, a média móvel começará a ser negociada no norte. Para maximizar os fatores de lucro usando essa ferramenta, você deve usá-lo no período diário. Aqueles que conhecem a estratégia de negociação de ação de preço também podem procurar os sinais de ação de preço na Média Móvel do Casco para realizar suas operações. Mas certifique-se de nunca usar paradas muito apertadas ou grande volume ao negociar o mercado com esse indicador.
Instalando o HMA Indicator For MT5
Depois de baixar o indicador através do formulário acima, você precisa descompactar o arquivo zip. Em seguida, você precisa copiar o arquivo HMA.mq5 na pasta MQL5Indicators da sua instalação do MT5 . Depois disso, reinicie o MT5 e você poderá ver o indicador na lista de indicadores.
Parâmetros da HMA Indicator For MT5
O HMA Indicator For MT5 possui parâmetros 2 para configurar.
input uint InpPeriod = 20; // Period
input ENUM_APPLIED_PRICE InpAppliedPrice = PRICE_CLOSE; // Applied price
Buffers of the HMA Indicator For MT5
O HMA Indicator For MT5 fornece buffers 4 .
SetIndexBuffer(0,BufferHMA,INDICATOR_DATA);
SetIndexBuffer(1,BufferRAW,INDICATOR_CALCULATIONS);
SetIndexBuffer(2,BufferMAP,INDICATOR_CALCULATIONS);
SetIndexBuffer(3,BufferMAL,INDICATOR_CALCULATIONS);
Principais partes do código
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[])
{
//--- @ gt 25@:0 =0 lt 8=8 lt 0;L= gt 5 : gt ;85AB2 gt 10@ gt 2 4;O @0AGQB0
if(rates_total lt period_ma) return 0;
//--- @ gt 25@:0 8 @0AGQB : gt ;8G5AB20 ?@ gt AG8BK205 lt KE 10@ gt 2
int limit=rates_total-prev_calculated;
if(limit gt 1)
{
limit=rates_total-period_ma-1;
ArrayInitialize(BufferHMA,EMPTY_VALUE);
ArrayInitialize(BufferRAW,0);
ArrayInitialize(BufferMAP,0);
ArrayInitialize(BufferMAL,0);
}
//--- gt 43 gt B gt 2:0 40==KE
int copied=0,count=(limit==0 ? 1 : rates_total);
copied=CopyBuffer(handle_maP,0,0,count,BufferMAP);
if(copied!=count) return 0;
copied=CopyBuffer(handle_maL,0,0,count,BufferMAL);
if(copied!=count) return 0;
for(int i=limit; i gt =0 && !IsStopped(); i--)
BufferRAW[i]=2*BufferMAL[i]-BufferMAP[i];
//--- 0AGQB 8=48:0B gt @0
for(int i=limit; i gt =0 && !IsStopped(); i--)
BufferHMA[i]=MAOnArray(BufferRAW,0,period_sqrt,0,MODE_LWMA,i);
//--- return value of prev_calculated for next call
return(rates_total);
}
//+------------------------------------------------------------------+
//| iMAOnArray() https://www.mql5.com/ru/articles/81 |
//+------------------------------------------------------------------+
double MAOnArray(double &array[],int total,int period,int ma_shift,int ma_method,int shift)
{
double buf[],arr[];
if(total==0) total=ArraySize(array);
if(total gt 0 && total lt =period) return(0);
if(shift gt total-period-ma_shift) return(0);
//---
switch(ma_method)
{
case MODE_SMA :
{
total=ArrayCopy(arr,array,0,shift+ma_shift,period);
if(ArrayResize(buf,total) lt 0) return(0);
double sum=0;
int i,pos=total-1;
for(i=1;i lt period;i++,pos--)
sum+=arr[pos];
while(pos gt =0)
{
sum+=arr[pos];
buf[pos]=sum/period;
sum-=arr[pos+period-1];
pos--;
}
return(buf[0]);
}
case MODE_EMA :
{
if(ArrayResize(buf,total) lt 0) return(0);
double pr=2.0/(period+1);
int pos=total-2;
while(pos gt =0)
{
if(pos==total-2) buf[pos+1]=array[pos+1];
buf[pos]=array[pos]*pr+buf[pos+1]*(1-pr);
pos--;
}
return(buf[shift+ma_shift]);
}
case MODE_SMMA :
{
if(ArrayResize(buf,total) lt 0) return(0);
double sum=0;
int i,k,pos;
pos=total-period;
while(pos gt =0)
{
if(pos==total-period)
{
for(i=0,k=pos;i lt period;i++,k++)
{
sum+=array[k];
buf[k]=0;
}
}
else sum=buf[pos+1]*(period-1)+array[pos];
buf[pos]=sum/period;
pos--;
}
return(buf[shift+ma_shift]);
}
case MODE_LWMA :
{
if(ArrayResize(buf,total) lt 0) return(0);
double sum=0.0,lsum=0.0;
double price;
int i,weight=0,pos=total-1;
for(i=1;i lt =period;i++,pos--)
{
price=array[pos];
sum+=price*i;
lsum+=price;
weight+=i;
}
pos++;
i=pos+period;
while(pos gt =0)
{
buf[pos]=sum/weight;
if(pos==0) break;
pos--;
i--;
price=array[pos];
sum=sum-lsum+price*period;
lsum-=array[i];
lsum+=price;
}
return(buf[shift+ma_shift]);
}
default: return(0);
}
return(0);
}
//+------------------------------------------------------------------+