3. MQL4 dla początkujących. Część III.

3.9. Przekształcenie double do string

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.

Kod 1
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ą.

Kod 2
#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().

  • W nagłówku funkcji zapisano liczbę zmiennoprzecinkową 5.436, a po przecinku liczbę całkowitą 2.
  • W nagłówku zapisano liczbę 5.436, a po przecinku zmienną precision, której wcześniej została przypisana liczba 12.
  • Zapisano dwie zmienne number i precision, którym wcześniej zostały przypisane wartości liczbowe.

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.

Kod 3
#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).

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.