Lemmik Postitused

Toimetaja Valik - 2020

MQL4: kirjutame MT4 ja MT5 jaoks ühe nõustaja korraga

Tervitused, sõbrad!

Tõenäoliselt on paljud teist juba varem selle ebamugavusega silmitsi seisnud: nad kirjutasid mql4-s nõustaja ja siis tahtsin proovida mängida MetaTrader 5 abil. Kogu koodi uuesti kirjutamine on üsna vaevarikas ja pikk ülesanne ning peate esmalt tegelema ka olemasoleva tööga. . Kahe erineva eksperdinõustaja eraldi kirjutamine MT4 ja MT5 jaoks on samuti aeganõudev. Lahendame selle probleemi täna uues videoõpetuses.

Mida siis teha? Vastus on lihtne - kirjutage kahele terminalile üks nõustaja korraga. Lõppude lõpuks ei erine mql4 ja mql5 keeled enamasti nii palju, paljud meetodid ja skriptide põhistruktuur nendes keeltes on sarnased. Kui oleks võimalik kirjutada ühine skript ühte skripti ja erinevaid sektsioone saaks lihtsalt mõlemas keeles ümber kirjutada ja sundida kompilaatorit vajalikke kooditükke valima, säästaks see palju aega ja närve.

Õnneks toetab MetaEditor eeltöötluse tingimuskompileerimise direktiive. Ja täna vaatame väga lihtsa näite abil, kuidas seda tehakse.

#ifdef-identifikaator // Siin kodeeritakse kood, kui käsk #define on eeltöötleja jaoks juba määratletud. #endif

MT5 koodis asendame MQL4 muutujad, kasutades #define direktiivi:

#ifdef __MQL5__ #defineeri tellimusedKokku positsioonidKokku #endif

Nõustaja päisesse paneme sisendmuutujad:

sisend int Stop = 300; sisend int võta = 400; sisend int Libisemine = 100; sisend MN = 123; sisend kahekordne LT = 0,1;

Nüüd saate kirjutada ostu-müügi meetodeid:

bool Osta (topelthind, topelt sl, topelt tp) {#ifdef __MQL4__ int pilet = OrderSend (sümbol (), 0, LT, hind, libisemine, sl, tp, "", MN); if (pilet <0) {PrintFormat ("OrderSend error% d", GetLastError ()); } #endif #ifdef __MQL5__ // --- päringu ja tulemuse deklareerimine ja initsialiseerimine MqlTradeRequest request = {0}; MqlTradeResult tulemus = {0}; // --- päringu parameetrid request.action = TRADE_ACTION_DEAL; // kaubandustegevuse päringu tüüp.symbol = sümbol (); // märgi taotlus.maht = LT; // mahu taotlus.tüüp = 0; // tellimuse tüüp request.price = hind; // taotluse avamise hind.sl = sl; // hind StopLoss request.tp = tp; // hind TakeProfit request.deviation = Libisemine; // lubatud kõrvalekalle hinnastaotlusest.magic = MN; // MagicNumberi tellimused // --- päringu saatmine, kui (! OrderSend (päring, tulemus)) {// kui päringut ei õnnestunud saata, printige tõrkekood PrintFormat ("OrderSend viga% d", GetLastError ()); } // --- teave operatsiooni PrintFormat kohta ("retcode =% u deal =% I64u order =% I64u", result.retcode, tulemus.deal, tulemus.korder); #endif // --- tagasi (vale); }

Müügimeetod sarnaneb ostu () meetodile. Me ei mõtle selles näites eriti strateegiale, saame juhusliku avanemise tingimuse ja paneme selle koodi OnTicki ():

int oper = (int) (GetTickCount ()% 2); // kahega jagamise ülejäänud osa on alati kas 0 või 1, kui (oper == 0) {topelthind = küsi; topelt SL = NormalizeDouble (Bid - Stop * _Point, _Digits); topelt TP = NormalizeDouble (Pakkumine + Võtke * _Point, _Digits); Osta (Ask, SL, TP); } if (oper == 1) {topelthind = pakkumine; topelt SL = NormalizeDouble (Ask + Stop * _Point, _Digits); topelt TP = NormalizeDouble (Küsi - võta * _Point, _Digits); Müüa (küsi, SL, TP); }

Järeldus

See on kőik. Nüüd saate koodi kompileerida MetaEditor 4-s ja MetaTrader 4 terminalis see töötab. Võite ekspertide nõustaja kompileerida MetaEditor 5-s ja see töötab MetaTrader 5. terminalis normaalselt. Lisaks ei pea terminali muutmiseks kirjutama ühte koodirida - kõik kompileeritakse ja töötab hästi.

Jäta Oma Kommentaar