Populære Indlæg

Redaktørens Valg - 2019

MQL4: Vi skriver én rådgiver på én gang til MT4 og MT5

Hilsen venner!

Mange af jer har sandsynligvis allerede stået over for denne ulempe mere end én gang: De skrev en rådgiver i mql4, og så ville jeg prøve at lege med MetaTrader 5. Omskrivning af al koden igen er en temmelig omhyggelig og langvarig opgave, og du er også nødt til først at beskæftige sig med arbejdet med den eksisterende . At skrive to forskellige ekspertrådgivere separat til MT4 og MT5 er også tidskrævende. Vi løser dette problem i dag i en ny videotutorial.

Så hvad skal jeg gøre? Svaret er enkelt - skriv en rådgiver for to terminaler på én gang. Når alt kommer til alt, for det meste er sprogene mql4 og mql5 ikke så meget forskellige, mange metoder og den grundlæggende struktur for scripts på disse sprog er ens. Hvis det var muligt at skrive fælles kode i et script, og de forskellige sektioner bare kunne skrives på en eller anden måde på begge sprog og tvinge kompilatoren til at vælge de nødvendige kodestykker, ville det spare en masse tid og nerver.

Heldigvis understøtter MetaEditor direktiver om betinget kompilering af præprocessor. Og i dag vil vi se på, hvordan dette gøres ved hjælp af et meget simpelt eksempel.

#ifdef-id // Koden her er samlet, hvis identifikatoren allerede er defineret for forbehandleren i kommandoen #define. #endif

I koden til MT5 erstatter vi variablerne fra MQL4 ved hjælp af #define-direktivet:

#ifdef __MQL5__ # Definer ordrerTotale positionerTotalt #endif

I headerens rådgiver placerer vi inputvariablerne:

input int Stop = 300; input int Take = 400; input int Slip = 100; input int MN = 123; input dobbelt LT = 0,1;

Nu kan du skrive metoder til køb og salg:

bool Køb (dobbelt pris, dobbelt sl, dobbelt tp) {#ifdef __MQL4__ int ticket = OrderSend (Symbol (), 0, LT, pris, Slip, sl, tp, "", MN); if (billet <0) {PrintFormat ("OrderSend-fejl% d", GetLastError ()); } #endif #ifdef __MQL5__ // --- erklæring og initialisering af forespørgslen og resultatet MqlTradeRequest anmodning = {0}; MqlTradeResult resultat = {0}; // --- anmodningsparametre request.action = TRADE_ACTION_DEAL; // type handelsoperationsanmodning.symbol = Symbol (); // tegnforespørgsel.volumen = LT; // volume request.type = 0; // ordretypeanmodning.pris = pris; // pris for åbningsanmodning.sl = sl; // pris StopLoss anmodning.tp = tp; // pris TakeProfit request.deviation = Slip; // tilladt afvigelse fra prisanmodningen.magic = MN; // MagicNumber ordrer // --- at sende en anmodning hvis (! OrderSend (anmodning, resultat)) {// hvis anmodningen ikke kunne sendes, udskriv en fejlkode PrintFormat ("OrderSend error% d", GetLastError ()); } // --- information om operationen PrintFormat ("retcode =% u deal =% I64u rækkefølge =% I64u", result.retcode, result.deal, result.order); #endif // --- returnering (falsk); }

Salgsmetoden ligner metoden buy (). Vi vil ikke tænke særlig på strategien i dette eksempel, vi vil modtage en betingelse for at åbne tilfældigt og sætte denne kode i OnTick ():

int oper = (int) (GetTickCount ()% 2); // resten af ​​dividering med to er altid enten 0 eller 1 hvis (oper == 0) {dobbelt pris = Spørg; dobbelt SL = NormalizeDouble (Bud - Stop * _Point, _Digits); dobbelt TP = NormalizeDouble (Bud + Take * _Point, _Digits); Køb (Ask, SL, TP); } if (oper == 1) {dobbelt pris = Bud; dobbelt SL = NormalizeDouble (Spør + Stop * _Point, _Digits); dobbelt TP = NormalizeDouble (Spørg - Tag * _Point, _Digits); Sælg (Spørg, SL, TP); }

Konklusion

Det er alt. Nu kan du kompilere koden i MetaEditor 4, og i MetaTrader 4-terminalen fungerer den. Du kan kompilere Expert Advisor i MetaEditor 5, og den fungerer normalt i MetaTrader 5. -terminalen, og for at ændre terminalen behøver du ikke at omskrive en enkelt kodelinie - alt sammenkompileres og fungerer fint.

Efterlad Din Kommentar