forked from rosh/MQL5Book
127 lines
4.8 KiB
MQL5
127 lines
4.8 KiB
MQL5
//+------------------------------------------------------------------+
| |
//| SeriesTicksStats.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 int TickCount = 10000;
| |
input COPY_TICKS TickType = ALL_TICKS;
| |
| |
//+------------------------------------------------------------------+
| |
//| Storage for tick count with specific flags |
| |
//+------------------------------------------------------------------+
| |
struct TickFlagStats
| |
{
| |
TICK_FLAGS flag;
| |
int count;
| |
string legend;
| |
};
| |
| |
//+------------------------------------------------------------------+
| |
//| Calculate tick stats by specific flags |
| |
//+------------------------------------------------------------------+
| |
int CalcTickStats(const string symbol, const COPY_TICKS type,
| |
const datetime start, const int count,
| |
TickFlagStats &stats[])
| |
{
| |
MqlTick ticks[];
| |
ResetLastError();
| |
const int nf = ArraySize(stats);
| |
const int nt = CopyTicks(symbol, ticks, type, start * 1000, count);
| |
if(nt > -1 && _LastError == 0)
| |
{
| |
PrintFormat("Ticks range: %s'%03d - %s'%03d",
| |
TimeToString(ticks[0].time, TIME_DATE | TIME_SECONDS),
| |
ticks[0].time_msc % 1000,
| |
TimeToString(ticks[nt - 1].time, TIME_DATE | TIME_SECONDS),
| |
ticks[nt - 1].time_msc % 1000);
| |
| |
// loop through ticks
| |
for(int j = 0; j < nt; ++j)
| |
{
| |
// loop through TICK_FLAGs (2 4 8 16 32 64) and combos
| |
for(int k = 0; k < nf; ++k)
| |
{
| |
if((ticks[j].flags & stats[k].flag) == stats[k].flag)
| |
{
| |
stats[k].count++;
| |
}
| |
}
| |
}
| |
}
| |
return nt;
| |
}
| |
| |
//+------------------------------------------------------------------+
| |
//| Script program start function |
| |
//+------------------------------------------------------------------+
| |
void OnStart()
| |
{
| |
Print("");
| |
| |
TickFlagStats stats[8] = {};
| |
for(int k = 1; k < 7; ++k)
| |
{
| |
stats[k].flag = (TICK_FLAGS)(1 << k);
| |
stats[k].legend = EnumToString(stats[k].flag);
| |
}
| |
stats[0].flag = TF_BID_ASK; // BID & ASK combination stats
| |
stats[7].flag = TF_BUY_SELL; // BUY & SELL combination stats
| |
stats[0].legend = "TF_BID_ASK (COMBO)";
| |
stats[7].legend = "TF_BUY_SELL (COMBO)";
| |
| |
const int count = CalcTickStats(WorkSymbol, TickType, 0, TickCount, stats);
| |
| |
PrintFormat("%s stats requested: %d (got: %d) on %s",
| |
EnumToString(TickType),
| |
TickCount, count, StringLen(WorkSymbol) > 0 ? WorkSymbol : _Symbol);
| |
ArrayPrint(stats);
| |
| |
/*
| |
output example 1:
| |
| |
Ticks range: 2021.10.11 07:39:53'278 - 2021.10.13 11:51:29'428
| |
ALL_TICKS stats requested: 100000 (got: 100000) on YNDX.MM
| |
[flag] [count] [legend]
| |
[0] 6 11323 "TF_BID_ASK (COMBO)"
| |
[1] 2 26700 "TF_BID"
| |
[2] 4 33541 "TF_ASK"
| |
[3] 8 51082 "TF_LAST"
| |
[4] 16 51082 "TF_VOLUME"
| |
[5] 32 25654 "TF_BUY"
| |
[6] 64 28802 "TF_SELL"
| |
[7] 96 3374 "TF_BUY_SELL (COMBO)"
| |
| |
output example 2:
| |
Ticks range: 2021.10.06 20:43:40'024 - 2021.10.13 11:52:40'044
| |
TRADE_TICKS stats requested: 100000 (got: 100000) on YNDX.MM
| |
[flag] [count] [legend]
| |
[0] 6 0 "TF_BID_ASK (COMBO)"
| |
[1] 2 0 "TF_BID"
| |
[2] 4 0 "TF_ASK"
| |
[3] 8 100000 "TF_LAST"
| |
[4] 16 100000 "TF_VOLUME"
| |
[5] 32 51674 "TF_BUY"
| |
[6] 64 55634 "TF_SELL"
| |
[7] 96 7308 "TF_BUY_SELL (COMBO)"
| |
| |
output example 3:
| |
Ticks range: 2021.10.07 07:08:24'692 - 2021.10.13 11:54:01'297
| |
INFO_TICKS stats requested: 100000 (got: 100000) on YNDX.MM
| |
[flag] [count] [legend]
| |
[0] 6 23115 "TF_BID_ASK (COMBO)"
| |
[1] 2 60860 "TF_BID"
| |
[2] 4 62255 "TF_ASK"
| |
[3] 8 0 "TF_LAST"
| |
[4] 16 0 "TF_VOLUME"
| |
[5] 32 0 "TF_BUY"
| |
[6] 64 0 "TF_SELL"
| |
[7] 96 0 "TF_BUY_SELL (COMBO)"
| |
*/
| |
}
| |
//+------------------------------------------------------------------+
|