W tym rozdziale chciałbym opowiedzieć o standardowej funkcji MQL4, która pozwala liczbę zmiennoprzecinkową przekonwertować na tekst, tj. double na string. Niżej przedstawiam schemat zapisu tej funkcji.
DoubleToString(argument_1 , argument_2);
DoubleToString - to nazwa funkcji. W jej nagłówku, tj. między nawiasami (), zapisuje się 2 argumenty rozdzielone przecinkiem: argument_1 - to liczba typu double, którą trzeba zamienić na tekst, argument_2 - to liczba typu int, która określa ilość cyfr po znaku dziesiętnym. Niżej przykład kodu z tą funkcją.
#property strict
double number = 0.123456789012345;
int precision = 12;
string text_1, text_2, text_3;
//---
void OnStart()
{
text_1 = DoubleToString(5.436 , 2);
text_2 = DoubleToString(5.436 , precision);
text_3 = DoubleToString(number , precision);
Print("text_1 = " , text_1);
Print("text_2 = " , text_2);
Print("text_3 = " , text_3);
}
W tym kodzie w ciele głównej funkcji OnStart() widzimy trzy sposoby zainicjowania działania funkcji DoubleToString().
Otrzymane wartości tekstowe zostały przypisane trzem zmiennym typu string, odpowiednio text_1, text_2 i text_3. Dalej funkcje Print() wyświetlą odpowiednie komunikaty w logach terminala (rys. 1).
Rys. 1. Wynik działania skryptu.
W pierwszym przypadku liczba 5.436 została wyświetlona z dokładnością 2 cyfr po znaku dziesiętnym przy tym, zgodnie z zasadami matematyki, została ona zaokrąglona w większą stronę: text_1 = 5.44. W drugim przypadku postanowiliśmy tę samą liczbę wyświetlić z dokładnością 12: text_2 = 5.436000000000. Tutaj funkcja DoubleToString() dopisała tyle zer, aby ilość cyfr po kropce była 12. W trzecim przypadku liczba przechowywana w zmiennej number została obcięta do 12-ej cyfry po kropce: text_3 = 0.123456789012.
Aby skrócić powyższy kod, każdą funkcję DoubleToString() z zawartością jej nagłówka można umieścić wewnątrz funkcji Print() żeby nie tworzyć zmienne text_1, text_2 i text_3. Pomimo skrócenia kodu drugą korzyścią jest fakt, że komputer nie będzie w pamięci RAM rezerwować trzy komórki pod te zmienne przez co będzie działać nieco szybciej. Choć w tym przypadku nie będzie to odczuwalne, dobrze było by jednak wypracować w sobie taki nawyk. Niżej przedstawiam krótszą wersje kodu 2.
#property strict
double number = 0.123456789012345;
int precision = 12;
//---
void OnStart()
{
Print("text_1 = " , DoubleToString(5.436 , 2) );
Print("text_2 = " , DoubleToString(5.436 , precision) );
Print("text_3 = " , DoubleToString(number , precision) );
}
Drugiego argument w tej funkcji można nie pisać. Wtedy domyślnie liczba zmiennoprzecinkowa będzie zawierać 8 znaków po kropce. Jeśli jako 2 argument zapisać cyfrę ujemną (od –1 do –16) to tekstowe przedstawienie liczby zostanie wyświetlone w formacie naukowym, a ostatnia cyfra zaokrąglona zgodnie z zasadami matematyki (kod 4).
#property strict
double number_4 = 0.123456789012345;
double number_5 = 555.123456;
double number_6 = -0.000000789;
double number_7 = 0.000000789;
//---
void OnStart()
{
Print("text_4 = " , DoubleToString(number_4) );
Print("text_5 = " , DoubleToString(number_5 , -7) );
Print("text_6 = " , DoubleToString(number_6 , -3) );
Print("text_7 = " , DoubleToString(number_7 , -10) );
}
Rys. 2. Wynik działania skryptu.