NorthfoxTrueEdge/indicators/ticks_volume.mq5
super.admin 639c303b4b convert
2025-05-30 16:13:38 +02:00

130 lines
9.7 KiB
MQL5

//+------------------------------------------------------------------+
//| TicksVolume.mq5 |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, MetaQuotes Software Corp."
#property link "http://www.mql5.com"
#property indicator_separate_window
#property indicator_buffers 4
#property indicator_plots 4
//--- plot UpBuffer
#property indicator_label1 "Pips Up"
#property indicator_type1 DRAW_HISTOGRAM
#property indicator_color1 Navy
#property indicator_style1 STYLE_SOLID
#property indicator_width1 6
//--- plot UpTick
#property indicator_label2 "Tick Up"
#property indicator_type2 DRAW_HISTOGRAM
#property indicator_color2 LawnGreen
#property indicator_style2 STYLE_SOLID
#property indicator_width2 2
//--- plot DnBuffer
#property indicator_label3 "Pips Down"
#property indicator_type3 DRAW_HISTOGRAM
#property indicator_color3 FireBrick
#property indicator_style3 STYLE_SOLID
#property indicator_width3 6
//--- plot DnTick
#property indicator_label4 "Tick Down"
#property indicator_type4 DRAW_HISTOGRAM
#property indicator_color4 Yellow
#property indicator_style4 STYLE_SOLID
#property indicator_width4 2
//--- plot level line
#property indicator_level1 0
#property indicator_levelcolor White
#property indicator_levelstyle STYLE_DOT
//--- Indicator buffer
double UpBuffer[];
double DnBuffer[];
double UpTick[];
double DnTick[];
//---
double _Bid=0,_Ask=0,PriceUp=0,PriceDn=0,TickUp=0,TickDn=0;
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
SetIndexBuffer(0,UpBuffer, INDICATOR_DATA);
SetIndexBuffer(1,UpTick, INDICATOR_DATA);
SetIndexBuffer(2,DnBuffer, INDICATOR_DATA);
SetIndexBuffer(3,DnTick, INDICATOR_DATA);
IndicatorSetString(INDICATOR_SHORTNAME,"TicksVolume");
IndicatorSetInteger(INDICATOR_DIGITS,_Digits);
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[])
{
ArraySetAsSeries(UpBuffer, true);
ArraySetAsSeries(DnBuffer, true);
ArraySetAsSeries(UpTick, true);
ArraySetAsSeries(DnTick, true);
ArraySetAsSeries(time, true);
int bars = rates_total-1;
if(prev_calculated>0) bars = rates_total - (prev_calculated-1);
for(int i=bars; i>=0; i--)
{
static datetime LastBar=0;
datetime CurBar=time[0];
//---
// Check if new tick
MqlTick last_tick;
SymbolInfoTick(_Symbol,last_tick);
double Bid=last_tick.bid;
double Ask=last_tick.ask;
//---
// Set parameters to zero if new bar
if(LastBar!=CurBar)
{
TickUp=0;
TickDn=0;
PriceUp= 0;
PriceDn= 0;
LastBar=CurBar;
}
if(_Bid == 0) _Bid = Bid; // If still the initialized bid value change to current bid value
if(_Ask == 0) _Ask = Ask; // If still the initialized bid value change to current ask value
//---
// Check if price goes up or down
if(Bid>_Bid || (_Bid==Bid && _Ask>Ask)) //
{
PriceUp += Bid - _Bid; // Current difference value from current and last bid
UpBuffer[0] = PriceUp/_Point; // Pass current Price diff to UpBuffer buffer
TickUp++; // Add one point to Tick up
UpTick[0] = TickUp; // Pass current value to UpTick buffer
}
if(Bid<_Bid || (_Bid==Bid && _Ask<Ask)) //
{
PriceDn += Bid - _Bid; // Current difference value from current and last bid
DnBuffer[0] = PriceDn/_Point; // Pass current Price diff to UpBuffer buffer
TickDn--; // Add one point to Tick down
DnTick[0] = TickDn; // Pass current value to DnTick buffer
}
_Bid = Bid;
_Ask = Ask;
}
return(rates_total);
}
//+------------------------------------------------------------------+