- Obchodování
- Algoritmické obchodování
- Obchodní poradci NetTradeX
- Konvertace skriptů z MetaTrader 4 do NetTradeX Advisors
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 PrintTento 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 declaredNá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' availablePromě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 valueTato 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ýchV 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 lotuV 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 DLLPrá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
nebo
identifikátor.CallProc ("název_funkce", parametry
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 integerK 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é konstantyV 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 datV 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é funkceNě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í.