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
|
|
|
|
*/
|
|
//+------------------------------------------------------------------+
|