forked from rosh/MQL5Book
119 lines
4 KiB
MQL5
119 lines
4 KiB
MQL5
//+------------------------------------------------------------------+
| |||
//| SymbolFilterSpread.mq5 |
| |||
//| Copyright 2022, MetaQuotes Ltd. |
| |||
//| https://www.mql5.com |
| |||
//| Print out spread and freeze levels for selected symbols |
| |||
//+------------------------------------------------------------------+
| |||
#property script_show_inputs
| |||
| |||
#include "..\..\Include\SymbolFilter.mqh"
| |||
| |||
//+------------------------------------------------------------------+
| |||
//| Enum with part of elements of ENUM_SYMBOL_INFO_INTEGER |
| |||
//+------------------------------------------------------------------+
| |||
enum ENUM_SYMBOL_INFO_INTEGER_PART
| |||
{
| |||
SPREAD_FIXED = SYMBOL_SPREAD,
| |||
SPREAD_FLOAT = SYMBOL_SPREAD_FLOAT,
| |||
STOPS_LEVEL = SYMBOL_TRADE_STOPS_LEVEL,
| |||
FREEZE_LEVEL = SYMBOL_TRADE_FREEZE_LEVEL
| |||
};
| |||
| |||
input bool UseMarketWatch = true;
| |||
input ENUM_SYMBOL_INFO_INTEGER_PART Property = SPREAD_FIXED;
| |||
input bool ShowPerSymbolDetails = true;
| |||
| |||
//+------------------------------------------------------------------+
| |||
//| Composite struct to hold symbol namd and its requested propery |
| |||
//+------------------------------------------------------------------+
| |||
struct SymbolDistance
| |||
{
| |||
string name;
| |||
int value;
| |||
};
| |||
| |||
//+------------------------------------------------------------------+
| |||
//| Script program start function |
| |||
//+------------------------------------------------------------------+
| |||
void OnStart()
| |||
{
| |||
SymbolFilter f; // filter object
| |||
string symbols[]; // array for names
| |||
long values[]; // array for values
| |||
SymbolDistance distances[]; // array for detailed printout
| |||
MapArray<long,int> stats; // counters per specific value of selected property
| |||
| |||
// apply the filter and collect values for symbols, then sort
| |||
f.select(UseMarketWatch, (ENUM_SYMBOL_INFO_INTEGER)Property, symbols, values, true);
| |||
const int n = ArraySize(symbols);
| |||
if(ShowPerSymbolDetails) ArrayResize(distances, n);
| |||
| |||
// calculate stats and collect details
| |||
for(int i = 0; i < n; ++i)
| |||
{
| |||
stats.inc(values[i]);
| |||
if(ShowPerSymbolDetails)
| |||
{
| |||
distances[i].name = symbols[i];
| |||
distances[i].value = (int)values[i];
| |||
}
| |||
}
| |||
| |||
PrintFormat("===== Distances for %s symbols =====",
| |||
(UseMarketWatch ? "Market Watch" : "all available"));
| |||
PrintFormat("Total symbols: %d", n);
| |||
| |||
PrintFormat("Stats per %s:", EnumToString((ENUM_SYMBOL_INFO_INTEGER)Property));
| |||
stats.print();
| |||
| |||
if(ShowPerSymbolDetails)
| |||
{
| |||
Print("Details per symbol:");
| |||
ArrayPrint(distances);
| |||
}
| |||
}
| |||
//+------------------------------------------------------------------+
| |||
/*
| |||
| |||
example output (1-st run with default settings):
| |||
| |||
===== Distances for Market Watch symbols =====
| |||
Total symbols: 13
| |||
Stats per SYMBOL_SPREAD:
| |||
[key] [value]
| |||
[0] 0 2
| |||
[1] 2 3
| |||
[2] 3 1
| |||
[3] 6 1
| |||
[4] 7 1
| |||
[5] 9 1
| |||
[6] 151 1
| |||
[7] 319 1
| |||
[8] 3356 1
| |||
[9] 3400 1
| |||
Details per symbol:
| |||
[name] [value]
| |||
[ 0] "USDJPY" 0
| |||
[ 1] "EURUSD" 0
| |||
[ 2] "USDCHF" 2
| |||
[ 3] "USDCAD" 2
| |||
[ 4] "GBPUSD" 2
| |||
[ 5] "AUDUSD" 3
| |||
[ 6] "XAUUSD" 6
| |||
[ 7] "SP500m" 7
| |||
[ 8] "NZDUSD" 9
| |||
[ 9] "USDCNH" 151
| |||
[10] "USDSEK" 319
| |||
[11] "BTCUSD" 3356
| |||
[12] "USDRUB" 3400
| |||
| |||
example output (2-nd run, Property=SPREAD_FLOAT, ShowPerSymbolDetails=false):
| |||
| |||
===== Distances for Market Watch symbols =====
| |||
Total symbols: 13
| |||
Stats per SYMBOL_SPREAD_FLOAT:
| |||
[key] [value]
| |||
[0] 1 13
| |||
| |||
*/
| |||
//+------------------------------------------------------------------+
|