forked from rosh/MQL5Book
154 lines
5.4 KiB
MQL5
154 lines
5.4 KiB
MQL5
//+------------------------------------------------------------------+
| |
//| SymbolFilterSwap.mq5 |
| |
//| Copyright 2022, MetaQuotes Ltd. |
| |
//| https://www.mql5.com |
| |
//| Print out swaps stats or per symbol settings |
| |
//+------------------------------------------------------------------+
| |
#property script_show_inputs
| |
| |
#include "..\..\Include\SymbolFilter.mqh"
| |
| |
input bool UseMarketWatch = true;
| |
input bool ShowPerSymbolDetails = false;
| |
input ENUM_SYMBOL_SWAP_MODE Mode = SYMBOL_SWAP_MODE_POINTS;
| |
| |
//+------------------------------------------------------------------+
| |
//| Composite struct to hold symbol name and its requested property |
| |
//+------------------------------------------------------------------+
| |
struct SymbolSwap
| |
{
| |
string name;
| |
double value;
| |
};
| |
| |
//+------------------------------------------------------------------+
| |
//| Script program start function |
| |
//+------------------------------------------------------------------+
| |
void OnStart()
| |
{
| |
SymbolFilter f; // filter object
| |
PrintFormat("===== Swap modes for %s symbols =====",
| |
(UseMarketWatch ? "Market Watch" : "all available"));
| |
| |
if(ShowPerSymbolDetails)
| |
{
| |
// prepare table of swaps for symbols with Mode
| |
string buyers[], sellers[]; // arrays for names
| |
double longs[], shorts[]; // arrays for swap values
| |
SymbolSwap swaps[]; // array for detailed printout
| |
| |
f.let(SYMBOL_SWAP_MODE, Mode);
| |
// apply the filter and collect values 2 times for longs and shorts
| |
f.select(UseMarketWatch, SYMBOL_SWAP_LONG, buyers, longs, true);
| |
f.select(UseMarketWatch, SYMBOL_SWAP_SHORT, sellers, shorts, true);
| |
const int l = ArraySize(longs);
| |
const int s = ArraySize(shorts);
| |
const int n = ArrayResize(swaps, l + s); // should be l == s
| |
PrintFormat("Total symbols with %s: %d", EnumToString(Mode), l);
| |
| |
// merge two arrays into one array of structs
| |
if(n > 0)
| |
{
| |
int i = l - 1, j = s - 1, k = 0;
| |
while(k < n)
| |
{
| |
const double swapLong = i >= 0 ? longs[i] : -DBL_MAX;
| |
const double swapShort = j >= 0 ? shorts[j] : -DBL_MAX;
| |
| |
if(swapLong >= swapShort)
| |
{
| |
swaps[k].name = "+" + buyers[i];
| |
swaps[k].value = longs[i];
| |
--i;
| |
++k;
| |
}
| |
else
| |
{
| |
swaps[k].name = "-" + sellers[j];
| |
swaps[k].value = shorts[j];
| |
--j;
| |
++k;
| |
}
| |
}
| |
Print("Swaps per symbols (ordered):");
| |
ArrayPrint(swaps);
| |
}
| |
}
| |
else
| |
{
| |
// collect stats of swap mode usage among symbols
| |
string symbols[];
| |
long values[];
| |
MapArray<ENUM_SYMBOL_SWAP_MODE,int> stats; // counters per specific mode
| |
// apply the filter and collect values for symbols
| |
f.select(UseMarketWatch, SYMBOL_SWAP_MODE, symbols, values);
| |
const int n = ArraySize(symbols);
| |
for(int i = 0; i < n; ++i)
| |
{
| |
stats.inc((ENUM_SYMBOL_SWAP_MODE)values[i]);
| |
}
| |
PrintFormat("Total symbols: %d", n);
| |
Print("Stats per swap mode:");
| |
stats.print();
| |
Print("Legend: key=swap mode, value=count");
| |
for(int i = 0; i < stats.getSize(); ++i)
| |
{
| |
PrintFormat("%d -> %s", stats.getKey(i), EnumToString(stats.getKey(i)));
| |
}
| |
}
| |
}
| |
//+------------------------------------------------------------------+
| |
/*
| |
| |
example output (1-st run with default settings):
| |
| |
===== Swap modes for Market Watch symbols =====
| |
Total symbols: 13
| |
Stats per swap mode:
| |
[key] [value]
| |
[0] 1 10
| |
[1] 0 2
| |
[2] 2 1
| |
Legend: key=swap mode, value=count
| |
1 -> SYMBOL_SWAP_MODE_POINTS
| |
0 -> SYMBOL_SWAP_MODE_DISABLED
| |
2 -> SYMBOL_SWAP_MODE_CURRENCY_SYMBOL
| |
| |
example output (2-nd run, ShowPerSymbolDetails=true):
| |
| |
===== Swap modes for Market Watch symbols =====
| |
Total symbols with SYMBOL_SWAP_MODE_POINTS: 10
| |
Swaps per symbols (ordered):
| |
[name] [value]
| |
[ 0] "+AUDUSD" 6.30000
| |
[ 1] "+NZDUSD" 2.80000
| |
[ 2] "+USDCHF" 0.10000
| |
[ 3] "+USDRUB" 0.00000
| |
[ 4] "-USDRUB" 0.00000
| |
[ 5] "+USDJPY" -0.10000
| |
[ 6] "+GBPUSD" -0.20000
| |
[ 7] "-USDCAD" -0.40000
| |
[ 8] "-USDJPY" -0.60000
| |
[ 9] "+EURUSD" -0.70000
| |
[10] "+USDCAD" -0.80000
| |
[11] "-EURUSD" -1.00000
| |
[12] "-USDCHF" -1.00000
| |
[13] "-GBPUSD" -2.20000
| |
[14] "+USDSEK" -4.50000
| |
[15] "-XAUUSD" -4.60000
| |
[16] "-USDSEK" -4.90000
| |
[17] "-NZDUSD" -6.70000
| |
[18] "+XAUUSD" -12.60000
| |
[19] "-AUDUSD" -14.80000
| |
| |
example output (3-rd run, ShowPerSymbolDetails=true, Mode=SYMBOL_SWAP_MODE_CURRENCY_SYMBOL):
| |
| |
===== Swap modes for Market Watch symbols =====
| |
Total symbols with SYMBOL_SWAP_MODE_CURRENCY_SYMBOL: 1
| |
Swaps per symbols (ordered):
| |
[name] [value]
| |
[0] "-SP500m" -35.00000
| |
[1] "+SP500m" -41.41000
| |
| |
*/
| |
//+------------------------------------------------------------------+
|