Populære Innlegg

Redaksjonens - 2020

MQL4: Vi skriver én rådgiver samtidig for MT4 og MT5

Hilsen venner!

Mange av dere har sannsynligvis allerede møtt denne ulempen mer enn en gang: de skrev en rådgiver i mql4, og da ville jeg prøve å spille med MetaTrader 5. Å skrive om koden på nytt er en ganske møysommelig og langvarig oppgave, og du må også først ta tak i arbeidet med den eksisterende . Å skrive to forskjellige ekspertrådgivere separat for MT4 og MT5 er også tidkrevende. Vi løser dette problemet i dag i en ny videoopplæring.

Så hva skal jeg gjøre? Svaret er enkelt - skriv en rådgiver for to terminaler samtidig. Tross alt, for det meste, skiller ikke mql4- og mql5-språkene seg så mye, mange metoder og den grunnleggende strukturen til skript på disse språkene er like. Hvis det var mulig å skrive vanlig kode i ett skript, og de forskjellige seksjonene bare på en eller annen måte kan skrives om på begge språk og tvinge kompilatoren til å velge nødvendige kodestykker, ville det spart mye tid og nerver.

Heldigvis støtter MetaEditor direktiver om betinget kompilering. Og i dag skal vi se på hvordan dette gjøres ved hjelp av et veldig enkelt eksempel.

#ifdef identifier // Koden her er satt sammen hvis identifikatoren allerede er definert for forbehandleren i #define-kommandoen. #endif

I koden for MT5 vil vi erstatte variablene fra MQL4 ved å bruke #define-direktivet:

#ifdef __MQL5__ # definere ordrerTotale stillingerTotalt #endif

I overskriften til rådgiveren plasserer vi inngangsvariablene:

input int Stopp = 300; input int Ta = 400; input int Slip = 100; input int MN = 123; inngang dobbel LT = 0,1;

Nå kan du skrive metoder for kjøp og salg:

bool Kjøp (dobbel pris, dobbel sl, dobbel tp) {#ifdef __MQL4__ int-billett = OrderSend (Symbol (), 0, LT, pris, Slip, sl, tp, "", MN); if (billett <0) {PrintFormat ("OrderSend-feil% d", GetLastError ()); } #endif #ifdef __MQL5__ // --- erklæring og initialisering av spørringen og resultatet MqlTradeRequest request = {0}; MqlTradeResult resultat = {0}; // --- forespørsel parametere request.action = TRADE_ACTION_DEAL; // type handelsoperasjonsforespørsel.symbol = Symbol (); // tegnforespørsel. volum = LT; // volumforespørsel. type = 0; // type bestillingsforespørsel. pris = pris; // pris for åpningsforespørsel.sl = sl; // pris StopLoss forespørsel.tp = tp; // pris TakeProfit request.deviation = Slip; // tillatt avvik fra prisforespørselen. magisk = MN; // MagicNumber ordrer // --- sende en forespørsel hvis (! OrderSend (forespørsel, resultat)) {// hvis forespørselen ikke kunne sendes, skriv ut en feilkode PrintFormat ("OrderSend error% d", GetLastError ()); } // --- informasjon om operasjonen PrintFormat ("retcode =% u deal =% I64u rekkefølge =% I64u", result.retcode, result.deal, result.order); #endif // --- return (falsk); }

Salgsmetoden ligner på kjøp () -metoden. Vi vil ikke spesielt tenke på strategien i dette eksemplet, vi vil motta et vilkår for å åpne tilfeldig og legge denne koden i OnTick ():

int oper = (int) (GetTickCount ()% 2); // resten av å dele med to er alltid enten 0 eller 1 hvis (oper == 0) {dobbel pris = Spør; dobbelt SL = NormalizeDouble (Bud - Stopp * _Point, _Digits); dobbelt TP = NormalizeDouble (Bud + Ta * _Point, _Digits); Kjøp (Ask, SL, TP); } if (oper == 1) {dobbel pris = Bud; dobbel SL = NormalizeDouble (Spør + Stopp * _Point, _Digits); dobbelt TP = NormalizeDouble (Spør - Ta * _Point, _Digits); Selg (Ask, SL, TP); }

Konklusjon

Det er alt. Nå kan du sette sammen koden i MetaEditor 4 og i MetaTrader 4-terminalen vil den fungere. Du kan kompilere ekspertrådgiveren i MetaEditor 5, og den vil fungere normalt i MetaTrader 5. -terminalen. For å endre terminalen trenger du ikke å omskrive en eneste kodelinje - alt vil kompilere og fungere fint.

Legg Igjen Din Kommentar