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

3.6. Typy zmiennych: typ wyliczeniowy

enum

Za pomocą tego typu można stworzyć własną listę wartości. W skrócie wygląda to w następujący sposób.

Kod 1
enum Wyliczenie
  {
   lista wartości,
  };

Najpierw idzie słowo kluczowe enum, po którym należy wpisać dowolną nazwę tego wyliczenia (Wyliczenie). Dalej między klamrami {} należy umieścić listę wartości, gdzie na końcu każdej z nich należy zapisać przecinek. Po zamykającej klamrze - średnik. Niżej przedstawiam przykład skryptu z enum.

Kod 2
#property strict
#property script_show_inputs

//--- wyliczenie stałych
enum tydzien
  {
   Poniedzialek,
   Wtorek,
   Sroda,
   Czwartek,
   Piatek,
   Sobota,
   Niedziela
  };
input tydzien WybierzDzienTygodnia = 0;

//---
void OnStart()
  {
  }

Tutaj po enum idzie nazwa wyliczenia tydzien. W ciele tego wyliczenia, określamy nazwy stałych: Poniedzialek, ... Niedziela, pamiętając o tym że stosujemy litery tylko angielskiego alfabetu, tj. bez ą, ć, ę, ł, ń, ó, ś, ź, ż lub podobnych specyficznych liter z innych języków. W MQL4 na końcu ostatniej stałej, w tym przykładzie Niedziela przecinek można nie pisać. Jeśli przecinek zostanie to kompilator nie wygeneruje błędu.

Dalej za pomocą modyfikatora input tworzymy zewnętrzny parametr o nazwie WybierzDzienTygodnia, który będzie naszym wyliczeniem dla zmiennej tydzien. Temu parametrowi od razu przypisujemy domyślną wartość 0.


Jeśli członkom z listy wyliczeń nie zostaną przypisane wartości liczbowe, to wartości zostaną im przydzielone automatycznie. Pierwszy człon będzie miał 0, kolejny o 1 większy niż poprzedni i tak dalej. W powyższym przykładzie (kod 2) Poniedzialek zostanie przydzielony 0, Wtorek = 1 itd, a ostatni człon Niedziela = 6.

Po uruchomieniu tego skryptu w dowolnym oknie notowań pojawi się okienko, gdzie w sekcji Wpisz parametry będzie widoczna jedna zmienna WybierzDzienTygodnia. Klikając po prawej stronie na wartość rozwinie się okienko, gdzie można będzie wybrać odpowiedni człon wyliczenia.

Rys. 1. Własna lista wyliczeń, typ enum.


Jeśli będziesz chciał, nadać każdemu członowi określoną wartość liczbową, można to zrobić w sposób opisany w poniższym kodzie 3.

Kod 3
#property strict
#property script_show_inputs

//---
enum minute
  {
   a = 1,   // 1 minuta
   b = 5,   // 5 minut
   c = 15,  // 15 minut
   d = 30   // 30 minut
  };
input minute SelectMinute = 15; // Wybierz minutę

//---
void OnStart()
  {
   switch(SelectMinute)
     {
      case 1:  Print ("Wybrano 1 minutę."); break;
      case 5:  Print ("Wybrano 5 minut.");  break;
      case 15: Print ("Wybrano 15 minut."); break;
      case 30: Print ("Wybrano 30 minut."); break;
      default: Print ("Nie wybrano minutę.");
     }
  }

Po uruchomieniu tego skryptu w okienku zobaczymy Wybierz minutę, ponieważ w kodzie po prawej stronie od SelectMinute zapisaliśmy jednowierszowy komentarz // Wybierz minutę. Klikając na wartość, rozwinie się lista członów wyliczenia a zamiast nazw zmiennych zobaczymy opisy tych zmiennych jak w komentarzach (rys. 2).

Rys. 2. Własna lista wyliczeń, typ enum.


Zostawiając domyślną wartość 15 minut i klikając na OK w logach terminala zobaczymy komunikaty jak na poniższym rysunku 3.

Rys. 3. Wynik działania skryptu.


Uruchom ten skrypt kilka razy, wybierając za każdym razem inną wartość i porównaj wpisy w logach terminala.


Członom wyliczenia można przypisać tylko liczby całkowite w zakresie od -2147483647 do 2147483647.

Typ enum jest bardzo wygodnym narzędziem w przypadku jeśli chcemy ograniczyć wybór wartości. W powyższym kodzie 3 można było by zastosować na przykład typ uchar i wymagać od użytkownika, aby w okienku ręcznie wpisywał jedną z czterech liczb: 1, 5, 15 lub 30. Jednak należało by najpierw poinformować go jakie cyfry w ogóle można wpisać i jednocześnie dopisać w kodzie algorytm reagowania programu na niewłaściwą cyfrę. Zaś enum po prostu nie pozwoli wybrać niewłaściwą wartość.