forked from airat77786/MQL5Book
135 lines
5.1 KiB
MQL5
135 lines
5.1 KiB
MQL5
//+------------------------------------------------------------------+
| |||
//| SeriesTicksDeltaVolume.mq5 |
| |||
//| Copyright 2021, MetaQuotes Ltd. |
| |||
//| https://www.mql5.com |
| |||
//+------------------------------------------------------------------+
| |||
#property script_show_inputs
| |||
| |||
#include "..\..\Include\PRTF.mqh"
| |||
#include "..\..\Include\TickEnum.mqh"
| |||
| |||
input string WorkSymbol = NULL; // Symbol (leave empty for current)
| |||
input ENUM_TIMEFRAMES _TimeFrame = PERIOD_CURRENT; // TimeFrame
| |||
input int BarCount = 100;
| |||
input COPY_TICKS TickType = INFO_TICKS;
| |||
| |||
// we need this replacement variable because inputs are read-only
| |||
const ENUM_TIMEFRAMES TimeFrame = _TimeFrame == PERIOD_CURRENT ? _Period : _TimeFrame;
| |||
| |||
//+------------------------------------------------------------------+
| |||
//| Delta volume per single bar: timestamp, buy, sell, delta |
| |||
//+------------------------------------------------------------------+
| |||
struct DeltaVolumePerBar
| |||
{
| |||
datetime time;
| |||
ulong buy;
| |||
ulong sell;
| |||
long delta;
| |||
};
| |||
| |||
//+------------------------------------------------------------------+
| |||
//| Script program start function |
| |||
//+------------------------------------------------------------------+
| |||
void OnStart()
| |||
{
| |||
if(TimeFrame >= PERIOD_D1
| |||
|| TimeFrame == PERIOD_M1)
| |||
{
| |||
Print("Use intraday timeframe larger than M1 and smaller than D1, please");
| |||
return;
| |||
}
| |||
| |||
DeltaVolumePerBar deltas[];
| |||
ArrayResize(deltas, BarCount);
| |||
ZeroMemory(deltas);
| |||
| |||
for(int i = 0; i < BarCount; ++i)
| |||
{
| |||
MqlTick ticks[];
| |||
const datetime next = iTime(WorkSymbol, TimeFrame, i);
| |||
const datetime prev = iTime(WorkSymbol, TimeFrame, i + 1);
| |||
ResetLastError();
| |||
const int n = CopyTicksRange(WorkSymbol, ticks, COPY_TICKS_ALL, prev * 1000, next * 1000 - 1);
| |||
if(n > -1 && _LastError == 0)
| |||
{
| |||
deltas[i].time = prev;
| |||
for(int j = 0; j < n; ++j)
| |||
{
| |||
// when real volumes are expected to be available, check them in the ticks
| |||
if(TickType == TRADE_TICKS)
| |||
{
| |||
// accumulate volumes for buy and sell deals separately
| |||
if((ticks[j].flags & TICK_FLAG_BUY) != 0)
| |||
{
| |||
deltas[i].buy += ticks[j].volume;
| |||
}
| |||
if((ticks[j].flags & TICK_FLAG_SELL) != 0)
| |||
{
| |||
deltas[i].sell += ticks[j].volume;
| |||
}
| |||
}
| |||
else
| |||
if(TickType == INFO_TICKS && j > 0)
| |||
{
| |||
// when real volumes are unavailable, use price moves up/down to estimate volume change
| |||
if((ticks[j].flags & (TICK_FLAG_ASK | TICK_FLAG_BID)) != 0)
| |||
{
| |||
const long d = (long)(((ticks[j].ask + ticks[j].bid) - (ticks[j - 1].ask + ticks[j - 1].bid)) / _Point);
| |||
if(d > 0) deltas[i].buy += d;
| |||
else deltas[i].sell += -d;
| |||
}
| |||
}
| |||
}
| |||
deltas[i].delta = (long)(deltas[i].buy - deltas[i].sell);
| |||
}
| |||
else
| |||
{
| |||
Print(i, ": ", _LastError);
| |||
}
| |||
}
| |||
| |||
PrintFormat("Delta volumes per intraday bar\nProcessed %d bars on %s %s %s",
| |||
BarCount, StringLen(WorkSymbol) > 0 ? WorkSymbol : _Symbol,
| |||
EnumToString(TimeFrame), EnumToString(TickType));
| |||
| |||
ArrayPrint(deltas);
| |||
| |||
/*
| |||
output example 1 (excerpt):
| |||
| |||
Delta volumes per intraday bar
| |||
Processed 100 bars on YNDX.MM PERIOD_H1 TRADE_TICKS
| |||
[time] [buy] [sell] [delta]
| |||
[ 0] 2021.10.13 11:00:00 7912 14169 -6257
| |||
[ 1] 2021.10.13 10:00:00 8470 11467 -2997
| |||
[ 2] 2021.10.13 09:00:00 10830 13047 -2217
| |||
[ 3] 2021.10.13 08:00:00 23682 19478 4204
| |||
[ 4] 2021.10.13 07:00:00 14538 11600 2938
| |||
[ 5] 2021.10.12 20:00:00 2132 4786 -2654
| |||
[ 6] 2021.10.12 19:00:00 9173 13775 -4602
| |||
[ 7] 2021.10.12 18:00:00 1297 1719 -422
| |||
[ 8] 2021.10.12 17:00:00 3803 2995 808
| |||
[ 9] 2021.10.12 16:00:00 6743 7045 -302
| |||
[10] 2021.10.12 15:00:00 17286 37286 -20000
| |||
...
| |||
| |||
output example 2 (excerpt):
| |||
| |||
Delta volumes per intraday bar
| |||
Processed 100 bars on YNDX.MM PERIOD_H1 INFO_TICKS
| |||
[time] [buy] [sell] [delta]
| |||
[ 0] 2021.10.13 11:00:00 1939 2548 -609
| |||
[ 1] 2021.10.13 10:00:00 2222 2400 -178
| |||
[ 2] 2021.10.13 09:00:00 2903 2909 -6
| |||
[ 3] 2021.10.13 08:00:00 4489 4060 429
| |||
[ 4] 2021.10.13 07:00:00 4999 4285 714
| |||
[ 5] 2021.10.12 20:00:00 1444 1556 -112
| |||
[ 6] 2021.10.12 19:00:00 5464 5867 -403
| |||
[ 7] 2021.10.12 18:00:00 2522 2653 -131
| |||
[ 8] 2021.10.12 17:00:00 2111 2017 94
| |||
[ 9] 2021.10.12 16:00:00 4617 6096 -1479
| |||
[10] 2021.10.12 15:00:00 5716 5411 305
| |||
...
| |||
*/
| |||
}
| |||
//+------------------------------------------------------------------+
|