Zdalnie sterowany EA

Kategoria: Poradniki i FAQ, Repozytorium kodu MQL4 | 31 sierpnia 2009 o 22:00 | Odpowiedzi: 2 | Permalink

Astra nie tak dawno temu wspominał na swoim blogu o genialnym narzędziu jakim jest Dropbox. Napomknął także o tym, że Dropboxa można wykorzystać jako podstawę do budowy zdalnie sterowanego EA.

W tym wpisie pokażę przykładowe rozwiązanie, dzięki któremu możliwa będzie zmiana parametrów EA ze zdalnego komputera, bez konieczności stosowania rozwiązań typu Remote Desktop, za to przy użyciu Dropboxa.

Słowem wstępu

Załóżmy przykładowy kod EA:

extern double param1;
extern string param2;

int init() {
 // ...
}

int start() {
 // ...
 // zakładamy, że kod odwołuje się do param1 i param2
}

Jaka jest idea działania tego rozwiązania?
To bardzo proste: MQL umożliwia bezproblemowy odczyt plików z katalogu experts\files, wystarczy więc sprawić, aby katalog files lub jego wybrany podkatalog były synchronizowane przy użyciu Dropboxa, a następnie regularnie odczytywać plik ustawień oraz zastosować te odczytane ustawienia.

Synchronizacja

Sprawienie, aby katalog files lub wybrany jego podkatalog były synchronizowane jest bajecznie proste, wystarczy w linii poleceń wpisać (Vista/Win7):

mklink /J "D:\My Dropbox\MT4Files" "C:\Program Files\MetaTrader\experts\files"

Oczywiście zakładamy, że D:\My Dropbox to katalog Dropboxa, a C:\Program Files\MetaTrader to ścieżka do katalogu MetaTradera oraz mamy do czynienia z systemem plików NTFS.

Jeżeli używacie Windows XP, który nie posiada polecenia mklink pobierzcie narzędzie Junction Tool (opis składni pod linkiem).

Po wydaniu tego polecenia Dropbox powinien natychmiast rozpocząć synchronizację katalogu files, przed przejściem dalej polecam sprawdzenie czy tak rzeczywiście się dzieje - albo poprzez stronę Dropboxa, gdzie można przeglądać wszystkie pliki albo też z innego komputera, z którym Dropbox jest synchronizowany.

Import ustawień

Import ustawień jest zadaniem stosunkowo prostym, wystarczy wykorzystać poniższą funkcję:

void importSettings(string file) {
   int f=FileOpen(file,FILE_READ|FILE_CSV,"=");
   if(f==-1) return;

   while(!FileIsEnding(f)) {
      string name=FileReadString(f);

      if(name=="param1") param1=StrToDouble(FileReadString(f));
      if(name=="param2") param2=FileReadString(f);

   }
}

Parametry możemy dodawać wg. powyższego schematu i tutaj jedna uwaga: zalecam używanie zawsze funkcji FileReadString i dopiero konwersję do typu danego parametru - po prostu z moich obserwacji wynika, że taka konstrukcja gwarantuje minimalną ilość błędów, które powstają np. przy użyciu FileReadDouble (w sumie nie wiadomo z czego to wynika).

Zdalne sterowanie w działaniu

Jeśli ukończyliśmy modyfikację naszego EA wzbogacając do o funkcję importującą, możemy przystąpić do uruchomienia.

Tworzymy w katalgu files plik z konfiguracją np. settings.txt i wpisujemy w nim wartości dla poszczególnych parametrów:

param1=test
param2=2

A następnie wywołujemy import ustawień z funkcji start:

int start() {
    importSettings("settings.txt");
    Comment("param1: "+param1+"\nparam2: "+param2);
    // ...
}

Teraz wystarczy jedynie modyfikować plik ustawień, aby EA automatycznie wczytał nowe ustawienia - dzięki Dropboxowi nie ma znaczenia na którym komputerze (z podłączonym Dropboxem) dokonamy zmian - Dropbox sam prześle je na komputer z EA, aby EA mógł je zastosować.

2 odpowiedzi do wpisu "Zdalnie sterowany EA"

  • Akwilion

    13 września 2009 o 12:55

    Proste zdalne sterowanie można też zrealizować za pomocą zlecenia oczekującego z abstrakcyjną ceną. Rozkazy dla EA są wtedy pod postacią Magic Number lub w komentarzu. Po wykonaniu polecenia EA kasuje to zlecenie. Faktem jest że przy prostych działaniach na zmiennych double pojawiają się błędy. Dlatego konwertując np. Take Profit aby go umieścić w Magic Number jako parametr od czasu do czasu wyskakuje błąd (niewielki ale irytujący). Użycie Normalize Double nieco pomaga ale nie do końca:) Pozdrawiam

  • luktom

    14 września 2009 o 00:26 | Odwiedź stronę WWW autora

    Wiesz, zawsze możesz taki take profit określać w polu take profit po dodaniu np. 1000 pipsów, drugi terminal sobie odejmie te 1000 pipsów i pozyska łatwo wartość.