155 lines
5.4 KiB
MQL5
155 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
|
||
|
|
||
|
*/
|
||
|
//+------------------------------------------------------------------+
|