Files
mql5_indicators_mt5_part3/MinMax indicator - indicator for MetaTrader 5/minmax.mq5
T

113 lines
8.7 KiB
Plaintext

//------------------------------------------------------------------
#property copyright "© mladen, 2018"
#property link "mladenfx@gmail.com"
#property version "1.00"
//------------------------------------------------------------------
#property indicator_chart_window
#property indicator_buffers 7
#property indicator_plots 3
#property indicator_label1 "MinMax"
#property indicator_type1 DRAW_COLOR_LINE
#property indicator_color1 clrDarkGray,clrMediumSeaGreen,clrOrangeRed
#property indicator_style1 STYLE_DOT
#property indicator_label2 "MinMax"
#property indicator_type2 DRAW_COLOR_LINE
#property indicator_color2 clrDarkGray,clrMediumSeaGreen,clrOrangeRed
#property indicator_style2 STYLE_DOT
#property indicator_label3 "Midle"
#property indicator_type3 DRAW_COLOR_LINE
#property indicator_color3 clrDarkGray,clrMediumSeaGreen,clrOrangeRed
#property indicator_width3 2
//
//--- input parameters
//
input int inpPeriod = 25; // MinMax period
input ENUM_APPLIED_PRICE inpPrice = PRICE_CLOSE; // Price
//
//--- indicator buffers
//
double valu[],valuc[],vald[],valdc[],valm[],valmc[],prices[];
//------------------------------------------------------------------
// Custom indicator initialization function
//------------------------------------------------------------------
int OnInit()
{
//
//--- indicator buffers mapping
//
SetIndexBuffer(0,valu ,INDICATOR_DATA);
SetIndexBuffer(1,valuc ,INDICATOR_COLOR_INDEX);
SetIndexBuffer(2,vald ,INDICATOR_DATA);
SetIndexBuffer(3,valdc ,INDICATOR_COLOR_INDEX);
SetIndexBuffer(4,valm ,INDICATOR_DATA);
SetIndexBuffer(5,valmc ,INDICATOR_COLOR_INDEX);
SetIndexBuffer(6,prices,INDICATOR_COLOR_INDEX);
//
//--- indicator short name assignment
//
IndicatorSetString(INDICATOR_SHORTNAME,"MinMax ("+(string)inpPeriod+")");
return (INIT_SUCCEEDED);
}
void OnDeinit(const int reason)
{
}
//------------------------------------------------------------------
// Custom pseudo function(s)
//------------------------------------------------------------------
//
//---
//
#define _setPrice(_priceType,_where,_index) { \
switch(_priceType) \
{ \
case PRICE_CLOSE: _where = close[_index]; break; \
case PRICE_OPEN: _where = open[_index]; break; \
case PRICE_HIGH: _where = high[_index]; break; \
case PRICE_LOW: _where = low[_index]; break; \
case PRICE_MEDIAN: _where = (high[_index]+low[_index])/2.0; break; \
case PRICE_TYPICAL: _where = (high[_index]+low[_index]+close[_index])/3.0; break; \
case PRICE_WEIGHTED: _where = (high[_index]+low[_index]+close[_index]+close[_index])/4.0; break; \
default : _where = 0; \
}}
//------------------------------------------------------------------
// 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[])
{
int i=(prev_calculated>0?prev_calculated-1:0); for (; i<rates_total && !_StopFlag; i++)
{
_setPrice(inpPrice,prices[i],i);
int _start = i-inpPeriod+1; if (_start<0) _start=0;
double _max = prices[ArrayMaximum(prices,_start,inpPeriod)];
double _min = prices[ArrayMinimum(prices,_start,inpPeriod)];
//
//---
//
valu[i] = _max; valuc[i] = (i>0) ?(valu[i]>valu[i-1]) ? 1 :(valu[i]<valu[i-1]) ? 2 : valuc[i-1]: 0;
vald[i] = _min; valdc[i] = (i>0) ?(vald[i]>vald[i-1]) ? 1 :(vald[i]<vald[i-1]) ? 2 : valdc[i-1]: 0;
valm[i] = (_min+_max)/2.0; valmc[i] = (i>0) ?(valm[i]>valm[i-1]) ? 1 :(valm[i]<valm[i-1]) ? 2 : valmc[i-1]: 0;
}
return(i);
}