HMA Indicator For MT5
HMA Indicator For MT5 är inte som ett klassiskt glidande medelvärde som alltid har problem i beräkningen i realtid. Med hjälp av det rörliga medelvärdet av skrovet kan du hitta en unik HMA som ofta kallas skrovets rörliga medelvärde som svarar på prisrörelsen på ett mycket exakt sätt. När priset på handelsinstrumentet sjunker kommer det rörliga genomsnittet också att söka och bekräfta etableringen av den baisseartade trenden. Tvärtom, när priset börjar få hausseartad fart kommer det rörliga genomsnittet att börja handla i norr. För att maximera vinstfaktorerna med det här verktyget bör du använda det i den dagliga tidsramen. De som känner till prisstrategins handelsstrategi kan också leta efter prisåtgärdssignalerna i Hull Moving Average för att placera sin handel. Men se till att du aldrig använder för snäva stopp eller stor volym när du handlar marknaden med denna indikator.
Installera HMA Indicator For MT5
När du har laddat ner indikatorn via formuläret ovan måste du packa upp zip-filen. Sedan måste du kopiera filen HMA.mq5 till mappen MQL5Indicators för din MT5 installation. Efter det kan du starta om MT5 så kan du se indikatorn i listan över indikatorer.
Parametrar för HMA Indicator For MT5
HMA Indicator For MT5 har parametrar för 2 att konfigurera.
input uint InpPeriod = 20; // Period
input ENUM_APPLIED_PRICE InpAppliedPrice = PRICE_CLOSE; // Applied price
Buffertar från HMA Indicator For MT5
HMA Indicator For MT5 tillhandahåller 4 buffertar.
SetIndexBuffer(0,BufferHMA,INDICATOR_DATA);
SetIndexBuffer(1,BufferRAW,INDICATOR_CALCULATIONS);
SetIndexBuffer(2,BufferMAP,INDICATOR_CALCULATIONS);
SetIndexBuffer(3,BufferMAL,INDICATOR_CALCULATIONS);
Huvuddelar i koden
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);
}
//+------------------------------------------------------------------+