CojoneAlAire/VolumewSMA.mq5

84 lines
6.9 KiB
MQL5
Raw Permalink Normal View History

2025-05-30 14:46:52 +02:00
<EFBFBD><EFBFBD>// volume e media a 20 periodi sul volume
//------------------------------------------------------------------
#property copyright "<00> mladen, 2018"
#property link "mladenfx@gmail.com"
#property version "1.00"
//------------------------------------------------------------------
#property indicator_separate_window
#property indicator_buffers 3
#property indicator_plots 2
#property indicator_label1 "Volume"
#property indicator_type1 DRAW_COLOR_HISTOGRAM
#property indicator_color1 clrRed,clrGreen
#property indicator_width1 2
#property indicator_label2 "Average"
#property indicator_type2 DRAW_LINE
#property indicator_color2 clrDarkGray
//--- input parameters
input int inpAveragePeriod = 20; // Average period
input double inpBreakoutPercent = 50; // Breakout percentage
//--- buffers
double val[],valc[],average[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
void OnInit()
{
//---- indicator buffers mapping
SetIndexBuffer(0,val,INDICATOR_DATA);
SetIndexBuffer(1,valc,INDICATOR_COLOR_INDEX);
SetIndexBuffer(2,average,INDICATOR_DATA);
IndicatorSetString(INDICATOR_SHORTNAME,"Volume SMA average ("+(string)inpAveragePeriod+")");
}
//+------------------------------------------------------------------+
//| 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[])
{
if(Bars(_Symbol,_Period)<rates_total) return(-1);
int i=(int)MathMax(prev_calculated-1,0); for(; i<rates_total && !_StopFlag; i++)
{
double _volume=double(tick_volume[i]);
average[i] = iSma(_volume,inpAveragePeriod,i,rates_total,0);
val[i] = _volume;
if(val[i]>=average[i]){
valc[i] = 1;
}else{
valc[i] = 0;
}
//if(i>0 && close[i] > close[i-1]) valc[i] = (_volume > average[i]*(1+inpBreakoutPercent*0.01)) ? 3 : 1;
//if(i>0 && close[i] < close[i-1]) valc[i] = (_volume > average[i]*(1+inpBreakoutPercent*0.01)) ? 4 : 2;
}
return(i);
}
//+------------------------------------------------------------------+
//| Custom functions |
//+------------------------------------------------------------------+
#define _maInstances 1
#define _maWorkBufferx1 1*_maInstances
double workSma[][_maWorkBufferx1];
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
double iSma(double price,int period,int r,int _bars,int instanceNo=0){
if(ArrayRange(workSma,0)!=_bars) ArrayResize(workSma,_bars);
workSma[r][instanceNo]=price;
double avg=price;
int k=1;
for(; k<period && (r-k)>=0; k++) avg+=workSma[r-k][instanceNo];
return(avg/(double)k);
}