MQL5Book/Scripts/p6/SymbolFilterSpread.mq5

120 lines
4 KiB
MQL5
Raw Permalink Normal View History

2025-05-30 16:09:41 +02:00
//+------------------------------------------------------------------+
//| 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
*/
//+------------------------------------------------------------------+