Konvertace skriptů z MetaTrader 4 do NetTradeX Advisors


Úvod

V daný moment pro obchodní platformu MetaTrader 4 je vytvářeno velké množství poradců a skriptů. Obchodníci, kteří tyto skripty využívali na platformě NetTradeX dříve museli zpracovat kompletní zdrojový kód, což bylo časově náročné. Pro usnadnění této práce byla vytvořena knihovna kompatibility jazyků MQL4 a NTL+. Tato knihovna umožňuje výrazně zjednodušit proces konvertace skriptů v jazyku NTL+ pro jejich následné zahájení v terminále NetTradeX Advisors. Kvůli rozdílů obchodních platforem MetaTrader a NetTradex (a jazyků MQL4 a NTL+) je třeba provést v konvertovaných skriptech několik drobných změn. Velkou část práce této adaptace na sebe bere knihovna MQL4.ntl, zařazenou do dodání terminálu NetTradeX Advisors; nicméně možná programátor bude muset modifikovat svůj skript ke spuštění. Tento článek ukazuje jak využívat funkce z této knihovny a jaké je třeba provést změny.

Hlavní principy práce s knihovnou MQL4.ntl

Takže, předtím než začnete zasádní práci, je třeba mít plnohodnotný skript v jazyku MQL4. Jaké kroky je třeba udělat, abyste přeměnili tento kód do pracujícího NTL+ skriptu?

První krok – nejdřív si musíte vytvořit nový soubor ve stromě Scripts okna Navigátor terminálu NetTradeX Advisors. Samotný soubor musí být umístěn ve složce Advisors nebo Utilities v závislosti na jeho určení. Pak do tohoto souboru zkopirujeme celý text skriptu v jazyku MQL4.

Druhý krok - spojení knihovny MQL4.ntl. Je třeba na začátku Vašeho souboru přidat řádek #include "Libraries\MQL4.ntl" . Je třeba poznamenat, že není třeba sestavit samotnou knihovnu MQL4.ntl a pro práci funkcí ze knihovny se nevyžaduje spustitelný soubor. Tato knihovna není určena k samostatnému spouštění a má pomocnou úlohu.

Тřetí krok – pokus sestavit vytvořený skript. Je třeba v editoru kódu kliknout na tlačítko Compile nebo klepnout na klávesu F7. S největší pravděpodobností kompilátor zobrazí seznam chyb a varování, které budeme postupně odstraňovat. Nyní nás zajímá dva klíčové body: jestli našel kompilátor knihovnu a zda všechny speciální funkce jsou v našem skriptu.

V případě, že kompilátor nemůže najít soubor knihovny, zobrazí se zpráva "Failed to open script file". V tomto případě se ujistěte, jestli soubor MQL4.ntl je opravdu na cestě, uvedené ve směrnici #include a jestli jeho název je zadán správně.

Speciální funkce v jazyce MQL4 jsou tři funkce s předurčenými názvy init(), start(), deinit(). Pro spuštění do terminálu NetTradeX Advisors všechny tyto funkce mají být určeny. Nicméně, v některých skriptech mohou chybět jedna nebo dvě funkce init() a deinit(). V podobné situaci kompilátor Vám zobrazí "No matching signatures to 'init()'" nebo "No matching signatures to 'deinit()'". V takovém případě je třeba přidat funkce init() a deinit() s jediným operátorem return 0;

int init() { return 0; } int deinit() { return 0; }

První fáze lze považovat za úspěšně dokončena, v případě, že nemáte zprávy "Failed to open script file" a "No matching signatures to 'init()'" / "No matching signatures to 'deinit()'". Nyní je možné přistoupit k odstranění místních problémů.

Částé zprávy kompilátoru, přičiny a způsoby jejího odstranění.

V této kapitole se dozvíte o častých zprávách kompilátoru, vznikajících v procesu adaptace skriptů a budou uvedena praktická řešení pro odstranění nesouladů v kódu.

No matching signatures to Print

Tento typ chyby je způsoben tím, že není v jazyce NTL+ povoleno použít funkce s proměnným číslem parametrů. V tomto případě je třeba změnit funkci tak, aby číslo parametrů v zadání přesně odpovídalo počtu parametrů v jeho určení. Funkce Print() musí mít jenom jeden vstupní parametr. Takže, místo Print(parametr1, parametr2, parametr3) má být provedena konkatenace - Print(parametr1 + parametr2 + parametr3).

Unexpected token 'unrecognized token'

Jednou z příčin vzniku této zprávy je pokus spojit přes směrnici #include soubory knihovny jazyka MQL4. Jazyk NTL+ nefunguje s podobnými knihovnami a proto použití těchto souborů není možné a tyto řádky mají být odstraněny z programu.

'True'/'False' is not declared

Názvy logických proměnnýh v jazyce NTL+ začínají malým písmenem, takže stačí vyměnit True na true a False na false.

No conversion from '_bars&' to 'int' available

Proměnná Bars v jazyce MQL4 je navržena k určování počtu barů pro aktuální graf. V jazyce NTL+ existuje stejnojménny objekt Bars, a proto je v knihovně MQL4.ntl přidána proměnná bars (s malým písmenem b), vracející počet barů pro aktuální graf. Právě jej je třeba využít ve skriptu místo Bars.

Must return a value

Tato zpráva se zobrazí při vyvolání operátora «return» bez zpětné hodnoty. Přitom funkce, ve které se používá tento operátor, je oznámena s odlišnou od void vrácené hodnoty. Při existenci této zprávy bude třeba buď upravit samotnou funkci nebo ukázat hodnotu pro return.

Použití magického čísla (Magic number)

Použití magických čísel není podporováno v aktuální verzi jazyka NTL+. Pro všechny otevřené pozice se vrácí nulová hodnota magického čísla. Ve skriptu v jazyce MQL4 se doporučuje věnovat zvýšenou pozornost uživání magických čísel v podmíněných operátorech. Často stačí jenom odstranit nebo zakomentovat funkci OrderMagicNumber(), pokud nepořebujete identifikovat pozice vytvořené tímto poradcem.

Používání statických proměnných

V jazyce NTL+ se nepoužívá klíčové slovo „static“. Chcete-li uložit hodnoty proměnných mezi zahájeními funkcemi, je třeba udělat takové proměnné globálními (bez klíčovéha slova static), umístěním jich mimo funkcí. V případě potřeby můžete přidat modifikátor extern, pokud předpokládáte změnu těchto parametrů uživatelem při spouštění nebo práci expertů.

Určení objemu lotu

V aktuální verzi velikost lotu nebo jakéhokoli instrumentu činí 100 000 jednotek, a proto, pokud využíváte instrument s jinou velikostí lotu, zadejte oddělené odpovídající proměnnou a přiřaďte ji požadovanou hodnotu velikosti lotu, pokud se liší od 100 000.

Odlišná práce se soubory DLL

Práce se soubory DLL v terminálech NetTradeX Advisors a MetaTrader4 probíhá různé. V jazyce MQL4 se vyžaduje plný popis funkcí z DLL modulu, naopak v jazyce NTL+ se podobný popis nevyžaduje. Místo zadání

#import "název_souboru_nebo_modulu" popis funkcí function1; popis funkcí function2; popis funkcí functionN; #import

je třeba jednoduše vytvořit objekt dll libovolný_identifikátor ("název_souboru_nebo_modulu"); a vyvolat Vámi požadovanou funkci přes
identifikátor.Call ("název_funkce", parametry_funkce_přes_čárku);
nebo
identifikátor.CallProc ("název_funkce", parametry_funkce_přes_čárku );

Kontrola vyhrazených slov jazyka

V jazycích MQL4 a NTL+ jsou rozdíly ve vyhrazených slovech jazyka. Poradci v jazyce MQL4 mohou využívat názvy proměnných nebo funkcí nedostupné v jazyce NTL+ a naopak. Kompilátor může například vyvolat zprávu Expected '(' pro řádek, ve kterém použití závorky se nenabízí). Jedna z možných přičin je shoda názvu proměnné s jedním z vyhrazených slov jazyka. Při této shodě je třeba změnit název proměnné ve všech místech v kódu programu. Pro rychlé vyvolání okna Replace v editoru je klávesová zkratka Ctrl+H.

Float value truncated in implicit convertion to integer

K tomuto upozornění dochází při pokusu přiřadit hodnotu typu float nebo double proměnné typu int. Úprava tohoto typu nesouladu není povinná, ale je žádoucí ke spuštění skriptu. Přetvoření z double v int a z float v int je třeba provádět zřejmě. Např. pro proměnnou d typu double bude vypadat takto int(d).

Nepřítomnost automatického přetvoření z bool v int a zpět.

Automatické přetvoření typu int i; bool b = true; i=b; není možné v jazyce NTL+. Zobrazí se zpráva Can't implicitly convert from 'bool' to 'int' a proto když budete potřebovat toto přetvoření, můžete použít následující konstrukci:

int Run() { // convertion from bool to int; bool a=false; int b = a?1:0; // convertion from int to bool int c=1; bool d = c==0?false:true; } Can't implicitly convert from 'datetime' to 'int'

V jazyce NTL+ se vyžaduje zřejmě provádět přetvoření typu pro objekty datetime do proměnné int. To lze provést následujícím způsobem int i; datetime d; i=int(d);

Barevné konstanty

V MQL4 mohou být využívány různé konstanty pro práci s barvou objektů grafických primitiv. Tyto konstanty v kódu lze jednoduše nahradit některou z 16 základních barev, například zadáním White nebo Black. Jedinou výjimkou je použití barvy v grafických indikátorech. Pokud se používá barva, kterou jazyk NTL+ nerozpozná, je třeba určit barvu přes zadání RGB komponent. Např. pro barvu Tomato určení bude následující: color Tomato = 0xFF6347

Práce s polemi dat

V jazycích MQL4 a NTL+ se různé uskutečňuje práce s polemi dat. V NTL+ oznámení ve formě typ název[] se používá jenom pro indikační pole. Všechna pole pro uložení dalších dat jsou oznámeny ve formě array "typ" název; nebo array "typ" název (velikost) . Takže, místo string symb[3] = {"EURUSD", "GBPUSD", "AUDCAD"}; je třeba použít array "string" symb= {"EURUSD", "GBPUSD", "AUDCAD"};

Nepodporované funkce

Některé funkce nejsou podporovány v jazyce NTL+. Tyto funkce je třeba odstranit nebo změnit logiku práce skriptu tak, aby byly používány konstrukce jazyka NTL+. Při použití těchto funkcí bude zobrazena zpráva 'The function is not supported' nebo 'No matching signatures to function_name'.

Seznam některých nepodporovaných funkcí:

  • SendMail()
  • souhrn funkcí onArray
  • funkce FileOpenHistory, FileIsLineEnding
  • souhrn funkcí objects a vlastnotsti objektů
  • pro další režimy funkce MarketInfo vrácí nulové hodnoty:
    • MODE_SWAPLONG
    • MODE_SWAPSHORT
    • MODE_STARTING
    • MODE_EXPIRATION
    • MODE_MINLOT
    • MODE_LOTSTEP
    • MODE_SWAPTYPE
    • MODE_PROFITCALCMODE
    • MODE_MARGINCALCMODE
    • MODE_MARGININIT
    • MODE_MARGINHEDGED
    • MODE_FREEZELEVEL
  • оperátor goto
  • funkce pro výpočet uživatelského indikátoru iCustom
  • souhrn funkcí pro práci s okny (Window functions), MessageBox
  • TerminalCompany(), TerminalName(), TerminalPath()
  • Parametry #property

Závěr

V tomto článku jsme hovořili o typických obtížích vznikajících při konvertaci skriptů z platformy MetaTrader do NetTradeX. Tento proces výrazně zjednodušuje knihovna MQL4.ntl, dodána spolu s terminálem. Výhodou této knihovny je plně otevřený kód, který programátor může změnit nebo doplnit dle svého uvážení.