Price Data Components
Indicators Used
2
Views
0
Downloads
0
Favorites
CMA
ÿþ//+------------------------------------------------------------------+
//| CMA.mq5 |
//| Copyright 2018, MetaQuotes Software Corp. |
//| https://mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2018, MetaQuotes Software Corp."
#property link "https://mql5.com"
#property version "1.00"
#property description "Centred moving average"
#property indicator_chart_window
#property indicator_buffers 2
#property indicator_plots 1
//--- plot CMA
#property indicator_label1 "Centred MA"
#property indicator_type1 DRAW_LINE
#property indicator_color1 clrRed
#property indicator_style1 STYLE_SOLID
#property indicator_width1 1
//--- input parameters
input uint InpPeriod = 14; // Period
input ENUM_APPLIED_PRICE InpAppliedPrice = PRICE_CLOSE; // Applied price
//--- indicator buffers
double BufferCMA[];
double BufferPrice[];
//--- global variables
int period_ma;
int period2;
int odd;
int handle_ma;
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
//--- set global variables
period_ma=int(InpPeriod<2 ? 2 : InpPeriod);
period2=(int)floor(period_ma/2);
odd=(period2*2<period_ma ? 1 : 0);
//--- indicator buffers mapping
SetIndexBuffer(0,BufferCMA,INDICATOR_DATA);
SetIndexBuffer(1,BufferPrice,INDICATOR_CALCULATIONS);
//--- setting indicator parameters
IndicatorSetString(INDICATOR_SHORTNAME,"Centred MA ("+(string)period_ma+")");
IndicatorSetInteger(INDICATOR_DIGITS,Digits());
//--- setting buffer arrays as timeseries
ArraySetAsSeries(BufferCMA,true);
ArraySetAsSeries(BufferPrice,true);
//--- create MA handle
ResetLastError();
handle_ma=iMA(NULL,PERIOD_CURRENT,1,0,MODE_SMA,InpAppliedPrice);
if(handle_ma==INVALID_HANDLE)
{
Print("The iMA (1) object was not created: Error ",GetLastError());
return INIT_FAILED;
}
//---
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[])
{
//--- @>25@:0 :>;8G5AB20 4>ABC?=KE 10@>2
if(rates_total<4) return 0;
//--- @>25@:0 8 @0AGQB :>;8G5AB20 ?@>AG8BK205<KE 10@>2
int limit=rates_total-prev_calculated;
if(limit>1)
{
limit=rates_total-period2-1;
ArrayInitialize(BufferCMA,EMPTY_VALUE);
ArrayInitialize(BufferPrice,0);
}
//--- >43>B>2:0 40==KE
int count=(limit>0 ? rates_total : 1),copied=0;
copied=CopyBuffer(handle_ma,0,0,count,BufferPrice);
if(copied!=count) return 0;
//--- 0AGQB 8=48:0B>@0
for(int i=limit; i>=0 && !IsStopped(); i--)
{
if(i>period2)
BufferCMA[i]=GetSMA(rates_total,i-period2,period_ma,BufferPrice);
else
BufferCMA[i]=(GetSMA(rates_total,0,i+period2,BufferPrice)*(period2+i+1)+GetSMA(rates_total,0,1,BufferPrice)*(period2-i-1+odd))/period_ma;
}
//--- return value of prev_calculated for next call
return(rates_total);
}
//+------------------------------------------------------------------+
//| Simple Moving Average |
//+------------------------------------------------------------------+
double GetSMA(const int rates_total,const int index,const int period,const double &price[],const bool as_series=true)
{
//---
double result=0.0;
//--- check position
bool check_index=(as_series ? index<=rates_total-period-1 : index>=period-1);
if(period<1 || !check_index)
return 0;
//--- calculate value
for(int i=0; i<period; i++)
result+=(as_series ? price[index+i]: price[index-i]);
//---
return(result/period);
}
//+------------------------------------------------------------------+
Comments
Markdown Formatting Guide
# H1
## H2
### H3
**bold text**
*italicized text*
[title](https://www.example.com)

`code`
```
code block
```
> blockquote
- Item 1
- Item 2
1. First item
2. Second item
---