113 lines
2.9 KiB
MQL5
113 lines
2.9 KiB
MQL5
|
//+------------------------------------------------------------------+
|
||
|
//| Structs.mq5 |
|
||
|
//| Copyright 2021, MetaQuotes Ltd. |
|
||
|
//| https://www.mql5.com |
|
||
|
//+------------------------------------------------------------------+
|
||
|
|
||
|
#define N_COEF 3
|
||
|
|
||
|
struct Settings
|
||
|
{
|
||
|
datetime start;
|
||
|
int barNumber;
|
||
|
ENUM_APPLIED_PRICE price;
|
||
|
int components;
|
||
|
};
|
||
|
|
||
|
struct Result
|
||
|
{
|
||
|
// public: is assumed by default for structs
|
||
|
double probability;
|
||
|
double coef[N_COEF];
|
||
|
int direction;
|
||
|
|
||
|
private:
|
||
|
string status;
|
||
|
|
||
|
public:
|
||
|
void Result()
|
||
|
{
|
||
|
static int count = 0;
|
||
|
Print(__FUNCSIG__, " ", ++count);
|
||
|
status = "ok";
|
||
|
}
|
||
|
|
||
|
void Result(string s)
|
||
|
{
|
||
|
static int count = 0;
|
||
|
Print(__FUNCSIG__, " ", ++count);
|
||
|
status = s;
|
||
|
}
|
||
|
|
||
|
void ~Result()
|
||
|
{
|
||
|
static int count = 0;
|
||
|
Print(__FUNCSIG__, " ", ++count);
|
||
|
}
|
||
|
|
||
|
void print()
|
||
|
{
|
||
|
Print(probability, " ", direction, " ", status);
|
||
|
ArrayPrint(coef);
|
||
|
}
|
||
|
};
|
||
|
|
||
|
//+------------------------------------------------------------------+
|
||
|
//| Some calculations stub |
|
||
|
//+------------------------------------------------------------------+
|
||
|
Result calculate(Settings &settings)
|
||
|
{
|
||
|
// adjust inputs: read and write struct members
|
||
|
if(settings.barNumber > 1000)
|
||
|
{
|
||
|
settings.components = (int)(MathSqrt(settings.barNumber) + 1);
|
||
|
}
|
||
|
// ...
|
||
|
// simulate a result
|
||
|
Result r;// = {}; // 'r' - cannot be initialized with initializer list
|
||
|
r.probability = 0.5;
|
||
|
r.direction = +1;
|
||
|
|
||
|
// error:
|
||
|
// cannot access to private member 'status' declared in struct 'Result'
|
||
|
// r.status = "message";
|
||
|
|
||
|
for(int i = 0; i < N_COEF; i++) r.coef[i] = i + 1;
|
||
|
return r;
|
||
|
}
|
||
|
|
||
|
//+------------------------------------------------------------------+
|
||
|
//| Script program start function |
|
||
|
//+------------------------------------------------------------------+
|
||
|
void OnStart()
|
||
|
{
|
||
|
Settings s = {D'2021.01.01', 1000, PRICE_CLOSE, 8};
|
||
|
|
||
|
// error: '{' - parameter conversion not allowed
|
||
|
// s = {D'2021.01.01', 1000, PRICE_CLOSE, 8};
|
||
|
|
||
|
/* ok: member-wise assignment
|
||
|
s.start = D'2021.01.01';
|
||
|
s.barNumber = 1000;
|
||
|
s.price = PRICE_CLOSE;
|
||
|
s.components = 8;
|
||
|
*/
|
||
|
|
||
|
Result r = calculate(s);
|
||
|
// Print(r); // error: 'r' - objects are passed by reference only
|
||
|
// Print(&r); // error: 'r' - class type expected
|
||
|
r.print();
|
||
|
// will output:
|
||
|
// 0.5 1 ok
|
||
|
// 1.00000 2.00000 3.00000
|
||
|
|
||
|
Result r2("n/a");
|
||
|
r2 = r; // ok: full member-wise copy
|
||
|
r2.print();
|
||
|
// will output the same data:
|
||
|
// 0.5 1 ok
|
||
|
// 1.00000 2.00000 3.00000
|
||
|
|
||
|
Print(offsetof(Result, status)); // 36
|
||
|
}
|