Initial commit: MQL5 Indicators Collection (MetaTrader 5) - Part 4
This commit is contained in:
@@ -0,0 +1,21 @@
|
||||
# 🚀 Unlock the Power of Trading!
|
||||
|
||||
Welcome to this open-source trading project. Here you will find powerful tools to enhance your trading journey. If you find this project useful, please consider starring ⭐, sharing, or donating to support further development!
|
||||
|
||||
---
|
||||
|
||||
**Support the project:**
|
||||
- Star this repository on GitHub
|
||||
- Share it with your trading friends
|
||||
- [Donate here](https://www.paypal.com/donate/?hosted_button_id=YOUR_BUTTON_ID) to help us grow!
|
||||
|
||||
---
|
||||
|
||||
## Files included:
|
||||
### Source Files:
|
||||
- `wmivol_pluse.mq5`
|
||||
|
||||
### Screenshots:
|
||||

|
||||
|
||||
> Made with ❤️ for the trading community.
|
||||
Binary file not shown.
|
After Width: | Height: | Size: 2.6 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 1.8 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 2.6 KiB |
@@ -0,0 +1,165 @@
|
||||
//+---------------------------------------------------------------------+
|
||||
//| WmiVol_Pluse.mq5 |
|
||||
//| Copyright 2014, Murad Ismayilov |
|
||||
//| http://www.mql4.com/ru/users/wmlab |
|
||||
//+---------------------------------------------------------------------+
|
||||
#property copyright "Copyright 2014, Murad Ismayilov"
|
||||
#property link "http://www.mql4.com/ru/users/wmlab"
|
||||
//---- íîìåð âåðñèè èíäèêàòîðà
|
||||
#property version "1.00"
|
||||
//---- îòðèñîâêà èíäèêàòîðà â îòäåëüíîì îêíå
|
||||
#property indicator_separate_window
|
||||
//---- êîëè÷åñòâî èíäèêàòîðíûõ áóôåðîâ 2
|
||||
#property indicator_buffers 2
|
||||
//---- èñïîëüçîâàíî âñåãî îäíî ãðàôè÷åñêîå ïîñòðîåíèå
|
||||
#property indicator_plots 1
|
||||
//+-----------------------------------+
|
||||
//| Ïàðàìåòðû îòðèñîâêè èíäèêàòîðà |
|
||||
//+-----------------------------------+
|
||||
//---- îòðèñîâêà èíäèêàòîðà â âèäå ÷åòûð¸õöâåòíîé ãèñòîãðàììû
|
||||
#property indicator_type1 DRAW_COLOR_HISTOGRAM
|
||||
//---- â êà÷åñòâå öâåòîâ ÷åòûð¸õöâåòíîé ãèñòîãðàììû èñïîëüçîâàíû
|
||||
#property indicator_color1 clrDodgerBlue,clrMagenta
|
||||
//---- ëèíèÿ èíäèêàòîðà - ñïëîøíàÿ
|
||||
#property indicator_style1 STYLE_SOLID
|
||||
//---- òîëùèíà ëèíèè èíäèêàòîðà ðàâíà 2
|
||||
#property indicator_width1 2
|
||||
//---- îòîáðàæåíèå ìåòêè èíäèêàòîðà
|
||||
#property indicator_label1 "WmiVol_Pluse"
|
||||
|
||||
#property indicator_maximum 1.1
|
||||
#property indicator_minimum 0.0
|
||||
//+-----------------------------------+
|
||||
//| ÂÕÎÄÍÛÅ ÏÀÐÀÌÅÒÐÛ ÈÍÄÈÊÀÒÎÐÀ |
|
||||
//+-----------------------------------+
|
||||
input ENUM_TIMEFRAMES TimeFrame=PERIOD_D1; //Òàéìôðåéì
|
||||
//+-----------------------------------+
|
||||
//---- Îáúÿâëåíèå öåëûõ ïåðåìåííûõ íà÷àëà îòñ÷¸òà äàííûõ
|
||||
int min_rates_total;
|
||||
//---- îáúÿâëåíèå äèíàìè÷åñêèõ ìàññèâîâ, êîòîðûå áóäóò â
|
||||
// äàëüíåéøåì èñïîëüçîâàíû â êà÷åñòâå èíäèêàòîðíûõ áóôåðîâ
|
||||
double IndBuffer[],ColorIndBuffer[];
|
||||
double barVols[],avgVol;
|
||||
int barsInDay,barCounts[];
|
||||
//+------------------------------------------------------------------+
|
||||
//| Ïîëó÷åíèå òàéìôðåéìà â âèäå ñòðîêè |
|
||||
//+------------------------------------------------------------------+
|
||||
string GetStringTimeframe(ENUM_TIMEFRAMES timeframe)
|
||||
{return(StringSubstr(EnumToString(timeframe),7,-1));}
|
||||
//+------------------------------------------------------------------+
|
||||
//| WmiVol_Pluse indicator initialization function |
|
||||
//+------------------------------------------------------------------+
|
||||
int OnInit()
|
||||
{
|
||||
//---- Èíèöèàëèçàöèÿ ïåðåìåííûõ íà÷àëà îòñ÷¸òà äàííûõ
|
||||
if(Period()>=TimeFrame)
|
||||
{
|
||||
Print(__FUNCTION__+"(): Ïåðèîä ãðàôèêà äîëæåí áûòü ìåíüøå, ÷åì "+GetStringTimeframe(TimeFrame));
|
||||
Print(__FUNCTION__+"(): Ñëåäóåò óìåíüøèòü ïåðèîä ãðàôèêà ëèáî óâåëè÷èòü çíà÷åíèå âõîäíîãî ïàðàìåòðà èíäèêàòîðà <<TimeFrame>>!");
|
||||
return(INIT_FAILED);
|
||||
}
|
||||
barsInDay=PeriodSeconds(TimeFrame)/(PeriodSeconds(PERIOD_CURRENT));
|
||||
if(!barsInDay) return(INIT_FAILED);
|
||||
min_rates_total=barsInDay;
|
||||
|
||||
//---- Ðàñïðåäåëåíèå ïàìÿòè ïîä ìàññèâû ïåðåìåííûõ
|
||||
if(ArrayResize(barCounts,barsInDay)<barsInDay)
|
||||
{
|
||||
Print("Íå óäàëîñü ðàñïðåäåëèòü ïàìÿòü ïîä ìàññèâ barCounts[]");
|
||||
return(INIT_FAILED);
|
||||
}
|
||||
if(ArrayResize(barVols,barsInDay)<barsInDay)
|
||||
{
|
||||
Print("Íå óäàëîñü ðàñïðåäåëèòü ïàìÿòü ïîä ìàññèâ barVols[]");
|
||||
return(INIT_FAILED);
|
||||
}
|
||||
//---- Èíèöèàëèçàöèÿ ìàññèâîâ ïåðåìåííûõ
|
||||
ArrayInitialize(barCounts,0);
|
||||
ArrayInitialize(barVols,0.0);
|
||||
|
||||
//---- ïðåâðàùåíèå äèíàìè÷åñêîãî ìàññèâà IndBuffer â èíäèêàòîðíûé áóôåð
|
||||
SetIndexBuffer(0,IndBuffer,INDICATOR_DATA);
|
||||
//---- îñóùåñòâëåíèå ñäâèãà íà÷àëà îòñ÷¸òà îòðèñîâêè èíäèêàòîðà
|
||||
PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,min_rates_total);
|
||||
//---- óñòàíîâêà çíà÷åíèé èíäèêàòîðà, êîòîðûå íå áóäóò âèäèìû íà ãðàôèêå
|
||||
PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,EMPTY_VALUE);
|
||||
|
||||
//---- ïðåâðàùåíèå äèíàìè÷åñêîãî ìàññèâà â öâåòîâîé, èíäåêñíûé áóôåð
|
||||
SetIndexBuffer(1,ColorIndBuffer,INDICATOR_COLOR_INDEX);
|
||||
|
||||
//---- èíèöèàëèçàöèè ïåðåìåííîé äëÿ êîðîòêîãî èìåíè èíäèêàòîðà
|
||||
string shortname;
|
||||
StringConcatenate(shortname,"WmiVol_Pluse(",GetStringTimeframe(TimeFrame),")");
|
||||
//--- ñîçäàíèå èìåíè äëÿ îòîáðàæåíèÿ â îòäåëüíîì ïîäîêíå è âî âñïëûâàþùåé ïîäñêàçêå
|
||||
IndicatorSetString(INDICATOR_SHORTNAME,shortname);
|
||||
|
||||
//--- îïðåäåëåíèå òî÷íîñòè îòîáðàæåíèÿ çíà÷åíèé èíäèêàòîðà
|
||||
IndicatorSetInteger(INDICATOR_DIGITS,2);
|
||||
//--- çàâåðøåíèå èíèöèàëèçàöèè
|
||||
return(INIT_SUCCEEDED);
|
||||
}
|
||||
//+------------------------------------------------------------------+
|
||||
//| WmiVol_Pluse 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(rates_total<min_rates_total) return(0);
|
||||
|
||||
///---- îáúÿâëåíèÿ ëîêàëüíûõ ïåðåìåííûõ
|
||||
int first,bar;
|
||||
double;
|
||||
|
||||
//---- ðàñ÷¸ò ñòàðòîâîãî íîìåðà first äëÿ öèêëà ïåðåñ÷¸òà áàðîâ è èíèöèàëèçàöèÿ ïåðåìåííûõ â áëîêå OnCalculate
|
||||
if(prev_calculated>rates_total || prev_calculated<=0) // ïðîâåðêà íà ïåðâûé ñòàðò ðàñ÷¸òà èíäèêàòîðà
|
||||
{
|
||||
first=0;
|
||||
for(bar=rates_total-1; bar>0; bar--)
|
||||
{
|
||||
int barOfDay=iBarOfDay(time[bar]);
|
||||
barVols[barOfDay]+=high[bar]-low[bar];
|
||||
barCounts[barOfDay]++;
|
||||
}
|
||||
for(bar=0; bar<barsInDay; bar++) if(barCounts[bar]) barVols[bar]/=barCounts[bar];
|
||||
double minVol=barVols[ArrayMinimum(barVols)];
|
||||
double maxVol=barVols[ArrayMaximum(barVols)];
|
||||
avgVol=0.0;
|
||||
for(bar=0; bar<barsInDay; bar++) if(maxVol>minVol) avgVol+=barVols[bar]=(barVols[bar]-minVol)/(maxVol-minVol);
|
||||
avgVol/=barsInDay;
|
||||
}
|
||||
else first=prev_calculated-1; // ñòàðòîâûé íîìåð äëÿ ðàñ÷¸òà íîâûõ áàðîâ
|
||||
|
||||
//---- Îñíîâíîé öèêë ðàñ÷¸òà èíäèêàòîðà
|
||||
for(bar=first; bar<rates_total && !IsStopped(); bar++)
|
||||
{
|
||||
int barOfDay=iBarOfDay(time[bar]);
|
||||
double vol=barVols[barOfDay];
|
||||
IndBuffer[bar]=vol;
|
||||
if(vol>=avgVol) ColorIndBuffer[bar]=0;
|
||||
else ColorIndBuffer[bar]=1;
|
||||
}
|
||||
//----
|
||||
return(rates_total);
|
||||
}
|
||||
//+------------------------------------------------------------------+
|
||||
//| iBarOfDay() |
|
||||
//+------------------------------------------------------------------+
|
||||
int iBarOfDay(datetime timeOpenBar)
|
||||
{
|
||||
//----
|
||||
int minutesInPeriod=PeriodSeconds()/60;
|
||||
double minutesSinceMidnight=MathMod(timeOpenBar/60,PeriodSeconds(TimeFrame)/60);
|
||||
int barsSinceMidnight=(int)MathFloor(minutesSinceMidnight/minutesInPeriod);
|
||||
//----
|
||||
return (barsSinceMidnight);
|
||||
}
|
||||
//+------------------------------------------------------------------+
|
||||
Reference in New Issue
Block a user