Monday, 4 September 2017

Skriva Forex Expertrådgivare


MetaTrader 5 - Trading Systems Steg-för-steg Guide till att skriva en expertrådgivare i MQL5 för nybörjare Inledning Denna artikel riktar sig till nybörjare som vill lära sig att skriva enkla expertrådgivare i det nya MQL5-språket. Vi börjar först genom att definiera vad vi vill ha vår EA (expertrådgivare) att göra, och sedan gå vidare till hur vi vill att EA ska göra det. 1. Handelsstrategi Vad vår EA ska göra: Det kommer att övervaka en viss indikator, och när ett visst villkor är uppfyllt (eller vissa villkor är uppfyllda) kommer det att placera en handel (antingen ShortSell eller LongBuy) beroende på nuvarande skick det har blivit uppfyllt. Ovanstående kallas en handelsstrategi. Innan du kan skriva en EA måste du först utveckla den strategi som du vill automatisera i EA. Så här låt oss ändra ovanstående uttalande så att det speglar den strategi vi vill utvecklas till ett EA. Vi kommer att använda en indikator som heter Moving Average med en period på 8 (Du kan välja vilken period som helst, men för vår strategi kommer vi att använda 8) Vi vill att vår EA ska placera en Long (Buy) - handel när Moving Average - 8 (för vår diskussions skull kommer jag att referera till det som MA-8) ökar uppåt och priset ligger nära det och det kommer att placera en kort (Sälj) när MA-8 sänks nedåt och priset är nära under det. Vi kommer också att använda en annan indikator som kallas Average Directional Movement (ADX) med period 8 också för att hjälpa oss att avgöra om marknaden är trendig eller inte. Vi gör det här eftersom vi bara vill komma in i handeln när marknaden trender och slappna av när marknaden sträcker sig (det vill säga inte trend). För att uppnå detta kommer vi endast att placera vår handel (Köp eller Sälj) när ovanstående villkor är uppfyllda och ADX-värdet är större än 22. Om ADX är större än 22 men minskar eller ADX är mindre än 22 kommer vi inte att handla, även om villkoret B har uppfyllts. Vi vill också skydda oss genom att ställa en Stop-förlust på 30 pips, och för vårt resultatmål kommer vi att rikta en vinst på 100 pips. Vi vill också att vår EA bara söker efter BuySell-möjligheter när en ny stapel har bildats och vi kommer också att se till att vi öppnar en köpposition om Köpvillkoren är uppfyllda och vi inte redan har en öppnad, och öppna en Säljposition när Säljvillkoren är uppfyllda och vi har inte redan öppnat en. Vi har nu utvecklat vår strategi Det är dags att börja skriva vår kod. 2. Skriv en expertrådgivare Börja med att starta MetaQuotes Language Editor 5. Tryck sedan på CtrlN eller klicka på knappen Ny på menyraden. Figur 1. Starta ett nytt MQL5-dokument I fönstret MQL5 Wizard väljer du Expert Advisor och klickar på Next as som visas i figur 2: Figur 2. Välja programtyp I nästa fönster skriver du namnet du vill ge till din EA i rutan Namn. I det här fallet skrev jag MyFirstEA. Du kan sedan skriva ditt namn i författarens rutan och även din webbadress eller e-postadress i länkrutan (om du har en). Figur 3. Allmänna egenskaper Expert Advisor Eftersom vi vill kunna ändra några av parametrarna för vår EA för att se vilka värden som kan ge oss det bästa resultatet, lägger vi till dem genom att klicka på knappen Lägg till. Figur 4. Inställning av EA-ingångsparametrar I vår EA vill vi kunna experimentera med inställningarna för Stop Loss, Take Profit, ADX Period och Moving Average Period, så vi definierar dem nu. Dubbelklicka under namnet och skriv namnet på parametern och dubbelklicka under Typ för att välja datatyp för parametern och dubbelklicka under avsnittet Initialt värde och skriv in startvärdet för parametern. När du är klar ska det se ut så här: Figur 5. Datatyper av EA-ingångsparametrar Som du kan se ovan valde jag heltal (int) datatyp för alla parametrar. Låt oss prata lite om datatyper. char: Char typen tar 1 byte minne (8 bitar) och tillåter uttryck i binär notation 28256 värden. Char typen kan innehålla både positiva och negativa värden. Värdena är från -128 till 127. uchar: Uchar-heltalstypen upptar också 1 byte minne samt char-typen, men i motsats till det är uchar endast avsett för positiva värden. Minsta värdet är noll, det maximala värdet är 255. Det första bokstaven du i namnet uchar-typen är förkortningen för unsigned. kort: Storleken på den korta typen är 2 byte (16 bitar) och kan därför uttrycka värdena lika med 2 till effekten 16: 216 65 536. Eftersom den korta typen är ett tecken en och innehåller båda positiva och negativa värden, värdena ligger mellan -32 768 och 32 767. ushort: Den osignerade korta typen är typen ushort. som också har en storlek på 2 byte. Minsta värdet är 0, det maximala värdet är 65 535. int: Storleken på int-typen är 4 byte (32 bitar). Minsta värdet är -2 147 483 648, det maximala är 2 147 483 647. uint: Den osignerade heltalstypen är uint. Det tar 4 byte minne och tillåter uttrycka heltal från 0 till 4 294 967 295. lång: Storleken på den långa typen är 8 byte (64 bitar). Minsta värdet är -9 223 372 036 854 775 808, det maximala värdet är 9 223 372 036 854 775 807. ulong: Den ulong typen upptar också 8 byte och kan lagra värden från 0 till 18 446 744 073 709 551 615. Från Ovanstående beskrivning av de olika datatyperna är de osignerade heltalstyperna inte konstruerade för att lagra negativa värden. Varje försök att ange ett negativt värde kan leda till oväntade konsekvenser. Om du till exempel vill lagra negativa värden kan du inte lagra dem inuti de osignerade typerna (dvs uchar, uint, ushort, ulong). Tillbaka till vårt EA. Om du tittar på datatyperna kommer du att hålla med mig att vi antar att använda char eller uchar datatyper eftersom de data vi avser att lagra i dessa parametrar är mindre än 127 respektive 255. För god minneshantering är detta det bästa att göra. Men för vår diskussions skull stannar vi fortfarande till int-typen. När du är färdig med att ställa in alla nödvändiga parametrar klickar du på knappen Slutför och MetaQuotes Editor kommer att skapa skelett för koden för dig som visas i nästa bild. Låt oss bryta koden i de olika sektionerna för bättre förståelse. Kodens övre del (rubrik) är där egenskapen för EA definieras. Du kan se att här är värdena du fyllde i MQL5-guiden i figur 3. I det här avsnittet av koden kan du definiera ytterligare parametrar som beskrivning (kortfattad textbeskrivning av EA), deklarera konstanter, inkludera ytterligare filer eller importfunktioner . När ett uttalande börjar med en symbol kallas det ett preprocessor-direktiv och slutar inte med en semikolon. Ett annat exempel på preprocessor-direktiv innehåller: Definitionsdirektivet används för konstantdeklaration. Det är skrivet i formuläret definiera identifierande tokenstring. Vad detta betyder ersätter varje förekomst av identifierare i din kod med värdet tokenstring. definiera ABC 100 definiera COMPANYNAME MetaQuotes Software Corp. Det kommer att ersätta alla förekomster av COMPANYNAME med strängen MetaQuotes Software Corp. eller det kommer att ersätta alla förekomster av ABC med karaktären (eller heltalet) 100 i din kod. Du kan läsa mer om förbehandlingsdirektiven i MQL5 Manual. Låt oss fortsätta med vår diskussion. Den andra delen av rubriken för vår kod är avsnittet för inmatningsparametrar: Vi anger alla parametrar som kommer att användas i vår EA i det här avsnittet. Dessa inkluderar alla variabler som kommer att användas av alla funktioner vi ska skriva i vår EA. Variabler som deklareras på denna nivå kallas globala variabler eftersom de är tillgängliga för alla funktioner i vårt EA som kan behöva dem. Ingångsparametrarna är parametrar som endast kan ändras utanför vår EA. Vi kan också deklarera andra variabler som vi kommer att manipulera under vårt EA men kommer inte att vara tillgängliga utanför vårt EA i detta avsnitt. Nästa är EA-initialiseringsfunktionen. Det här är den första funktionen som kallas när EA lanseras eller kopplas till ett diagram och det kallas endast en gång. Det här avsnittet är det bästa stället att göra några viktiga kontroller för att se till att vår EA fungerar väldigt bra. Vi kan bestämma om diagrammet har tillräckligt många barer för att vår EA ska fungera etc. Det är också det bästa stället att få handtag som vi ska använda för våra indikatorer (ADX och Moving Average indicators). För vår EA kommer vi att släppa handtagen som skapats för våra indikatorer under initialiseringen i det här avsnittet. Den här funktionen behandlar NewTick-händelsen. som genereras när en ny offert tas emot för en symbol. Observera att den expertrådgivaren inte kan utföra handelstransaktioner om användningen av expertrådgivare i klientterminalen inte är tillåten (Button Auto Trading). Figur 6. Autotrading är aktiverat De flesta av våra koder som implementerar vår handelsstrategi, som tidigare utvecklats, kommer att skrivas inom detta avsnitt. Nu när vi har tittat på de olika delarna av koden för vår EA, låt oss börja lägga kött till skelettet. 2.2 INPUT PARAMETERS SECTION Som du kan se har vi lagt till fler parametrar. Innan vi fortsätter att diskutera de nya parametrarna, låt oss diskutera något du kan se nu. De två framåt snedstreckarna gör att vi kan lägga kommentarer i våra koder. Med kommentarer kan vi veta vad våra variabler står för, eller vad vi gör vid den tidpunkten i vår kod. Det ger också en bättre förståelse av vår kod. Det finns två grundläggande sätt att skriva kommentarer: Detta är en enradig kommentar Detta är en flervals kommentar Detta är en flervals kommentar. Multi-line kommentarer börjar med symbolet och slutar med den. Kompilatören ignorerar alla kommentarer när du sammanställer din kod. Genom att använda enstaka kommentarer för ingångsparametrarna är ett bra sätt att göra våra EA-användare förstår vad de här parametrarna står för. På EA Input-egenskaperna ser våra användare inte själva parametern, men istället ser de kommentarerna som visas nedan: Figur 7. Expert Advisor-inmatningsparametrar Nu tillbaka till vår kod Vi har bestämt oss för att lägga till ytterligare parametrar för vår EA. EAMagic är det magiska numret för alla beställningar från vår EA. Det minsta ADX-värdet (AdxMin) anges som en dubbel datatyp. En dubbel används för att lagra flytpunktkonstanter, som innehåller en heltal, en decimal och en fraktionsdel. dubbel mysum 123.5678 dubbel b7 0.09876 Lotten att handla (Lot) representerar volymen av det finansiella instrumentet vi vill handla. Då förklarade vi andra parametrar som vi ska använda: AdxHandle ska användas för att lagra ADX-indikatorhandtaget, medan maHandle lagrar handtaget för Moving Average-indikatorn. PlsDI, minDI, adxVal är dynamiska arrayer som håller värdena för DI, - DI och huvud ADX (av ADX-indikatorn) för varje stapel i diagrammet. MaVal är en dynamisk array som håller värdena för den rörliga genomsnittliga indikatorn för varje stapel i diagrammet. Förresten, vad är dynamiska arrays En dynamisk array är en array som deklareras utan en dimension. Med andra ord anges inget värde i paret av hakparenteser. En statisk matris har å andra sidan sina dimensioner definierade vid deklarationspunkten. double allbars 20 detta kommer att ta 20 element pclose är en variabel som vi kommer att använda för att lagra Stäng priset för den stapel vi ska övervaka för att kontrollera våra BuySell-affärer. STP och TKP kommer att användas för att lagra stoppförlusterna och värdena för vinst i vår EA. 2,3. EA INTELLISATION AVSNITT Här får vi handtag på vår indikator med respektive indikatorfunktioner. ADX-indikatorhandtaget erhålls med hjälp av iADX-funktionen. Det tar diagramsymbolen (NULL betyder också den aktuella symbolen på det aktuella diagrammet), diagramperiodtimeframet (0 betyder också den aktuella tidsramen på det aktuella diagrammet), ADX-medelvärdet för beräkning av indexet (som vi definierade tidigare under inmatningsparametrar avsnitt) som parametrar eller argument. int iADX (strängsymbol, symbolnamn ENUMTIMEFRAMES period, period int adxperiodens genomsnittstid) Moving Average-indikatorhandtaget erhålls med hjälp av iMA-funktionen. Den har följande argument: diagramsymbolen (som kan erhållas med symbolen symbol () eller NULL för den aktuella symbolen på det aktuella diagrammet), diagramperiodtimeframe (som kan erhållas med period. Period () eller 0 för den aktuella tidsramen på det aktuella diagrammet), den genomsnittliga genomsnittliga genomsnittliga rörelseperioden (som vi definierade tidigare under avsnittet ingångsparametrar), indikatorförskjutningen i förhållande till prisdiagrammet (skift här är 0), den flytande genomsnittliga utjämningstypen (kan vara någon av följande medelvärden: Enkel medelvärde-MODESMA, Exponentiell medelvärde-MODEEMA, Smoothed Averaging-MODESMMA eller Linear-Weighted Averaging-MODELWMA) och det pris som används för medelvärdet (här använder vi nära pris). int iMA (strängsymbol. symbolnamn ENUMTIMEFRAMES period. period int maperiod. genomsnittlig period int mashift. horisontellt skift ENUMMAMETHOD mamethod. utjämning typ ENUMAPPLIEDPRICE appliedprice typ av pris eller handtag) Läs MQL5 manualen för att få mer information om dessa indikatorfunktioner. Det ger dig en bättre förståelse för hur du använder varje indikator. Vi försöker igen att kontrollera om ett fel skulle uppstå om funktionen inte lyckades returnera handtaget, så kommer vi att få ett INVALIDHANDLE-fel. Vi använder alarmfunktionen för att visa felet med hjälp av GetlastError-funktionen. Vi bestämmer oss för att lagra stoppförlusterna och värdena för vinst i variablerna STP och TKP som vi förklarade tidigare. Varför gör vi det här, eftersom de värden som lagras i INPUT-parametrarna är skrivskyddade, kan de inte ändras. Så här vill vi se till att vår EA fungerar väldigt bra med alla mäklare. Siffror eller siffror () r anger antalet decimaler som bestämmer prissamheten för den aktuella diagramsymbolen. För ett 5-siffrigt eller 3-siffrig prisdiagram multiplicerar vi både stoppförlusten och vinsten med 10. 2.4. EA DEINTIALIZATION SECTION Eftersom denna funktion kallas när EA är avaktiverad eller borttagen från ett diagram kommer vi att släppa alla indikatorhandtag som skapades under initialiseringsprocessen här. Vi skapade två handtag, en för ADX-indikator och ett annat handtag för indikator för rörlig medelvärde. Vi använder funktionen IndicatorRelease () för att uppnå detta. Det tar bara ett argument (indikatorhanteraren) bool IndikatorRelease (int indikatorhandtag indikatorhandtag) Funktionen tar bort ett indikeringshandtag och släpper in indikatorens beräkningsblock, om det inte används. 2.5 EA ONTICK SECTION Det första vi måste göra här är att kolla om vi har tillräckligt med staplar på det här diagrammet. Vi kan få de totala staplarna i historiken för ett diagram med hjälp av Bars-funktionen. Det tar två parametrar, symbolen (kan erhållas med symbol eller symbol (). Dessa två returnerar nuvarande symbol för det aktuella diagrammet där vår EA är bifogad) och perioden eller tidsramen för det aktuella diagrammet (kan erhållas med Period eller Period (). Dessa två kommer att returnera tidsramen för det aktuella diagrammet på vilket EA är anslutet). Om de totala tillgängliga staplarna är mindre än 60 vill vi att vår EA slappna av tills vi har tillräckligt med barer på diagrammet. Alert-funktionen visar ett meddelande i ett separat fönster. Det tar några värden separerade med kommatecken som parameterargument. I det här fallet har vi bara ett strängvärde. Avkastningen lämnar initialiseringen av vår EA. Expertrådgivaren kommer att utföra handelsverksamhet i början av en ny stapel, så det är nödvändigt att lösa problemet med den nya streckidentifieringen. I ordspråk vill vi vara säkra på att vår EA inte söker efter LongShort-inställningar på varje ficka. Vi vill bara att vår EA ska kontrollera LongShort-positioner när det finns en ny stapel. Vi börjar med att deklarera en statisk datetime variabel OldTime. som lagrar Bar-tiden. Vi förklarade det som statiskt eftersom vi vill att värdet ska behållas i minnet tills nästa uppringning av OnTick-funktionen. Då kommer vi att kunna jämföra sitt värde med NewTime-variabeln (även datetime datatyp), som är en uppsättning av ett element för att hålla den nya (aktuella) barstiden. Vi förklarade också en bool datatyp variabel IsNewBar och sätter dess värde till false. Detta beror på att vi vill att dess värde bara är SANT när vi har en ny stapel. Vi använder funktionen CopyTime för att få tiden för den aktuella fältet. Det kopierar bartiden till matrisen NewTime med ett element om det lyckas, vi jämför tiden för en ny stapel med föregående barstid. Om tiderna är lika, betyder det att vi har en ny stapel, och vi ställer in variabeln IsNewBar för att TRUE och spara värdet för den aktuella barstiden till variabeln OldTime. IsNewBar-variabeln indikerar att vi har en ny stapel. Om det är felaktigt, avslutar vi utförandet av OnTick-funktionen. Ta en titt på koden som den kontrollerar för genomförandet av felsökningsläget, det kommer att skriva ut meddelandet om stapeltiderna när felsökningsläget, vi kommer att överväga det vidare. Nästa sak vi vill göra här är att kontrollera om vi har tillräckligt med barer att arbeta med. Varför upprepa det Vi vill bara vara säkra på att vår EA fungerar korrekt. Det bör noteras att medan OnInit-funktionen endast kallas en gång när EA är kopplad till ett diagram kallas OnTick-funktionen varje gång det finns ett nytt fält (prisnotering). Du observerar att vi har gjort det igen annorlunda här. Vi bestämmer oss för att lagra de totala staplarna i historien som vi fått från uttrycket i en ny variabel, Mybars. deklareras inom Onit-funktionen. Denna typ av variabel är en lokal variabel, till skillnad från variabeln som vi deklarerade i avsnittet INPUT PARAMETERS i vår kod. Även om variablerna, som deklareras i Input Parameters-sektionen i vår kod, är tillgängliga för alla funktioner, är de variabler som deklarerats inom en enda funktion begränsad och tillgänglig för den funktionen i vår kod som kan behöva dem. Det kan inte användas utanför den funktionen. Därefter förklarade vi några variabler av MQL5 strukturtyper som kommer att användas i denna del av vårt EA. MQL5 har ett stort antal inbyggda strukturer som gör det ganska enkelt för EA-utvecklare. Låt oss ta strukturerna efter varandra. Detta är en struktur som används för att lagra de senaste symbolernas priser. struct MqlTick datetime tid Tid för senaste priser uppdatera dubbelbud Aktuellt Budpris dubbel fråga Aktuellt Fråga pris dubbla sista Pris på den senaste avtalen (Senaste) ulong volym Volym för nuvarande Senaste pris Varje variabel som deklareras vara av typen MqlTick kan enkelt vara brukade få aktuella värden för Fråga, Bud, Senaste och Volym när du ringde funktionen SymbolInfoTick (). Så vi förklarade senaste pris som en MqlTick-typ så att vi kunde använda den för att få priserna Ask and Bid Denna struktur används för att utföra alla handelsförfrågningar för en handelsoperation. Den innehåller, i sin struktur, alla fält som behövs för att utföra ett handelsavtal. struct MqlTradeRequest ENUMTRADEREQUESTACTIONS action Handelsoperation typ ulong magic Expert Advisor ID (magiskt nummer) ulong order Beställ biljettsträngsymbol Handelssymbol dubbelvolym Begärd volym för en affär i mycket dubbelt pris Pris dubbelstopplimit StopLimit nivå av ordern dubbel sl Stopp Förlustnivå beställa dubbel tp Ta bort vinstnivå i ordningen ulong avvikelse Maximal möjlig avvikelse från det begärda priset ENUMORDERTYPE-typ Beställningstyp ENUMORDERTYPEFILLING typefilling Typ av beställning exekvering ENUMORDERTYPETIME typtid Orderutförande tid datetime utlöpning Order utgångstid (för order av ORDERTIMESPECIFIED typ) strängkommentation Orderkommentar Alla variabel som deklareras vara av typen MqlTradeRequest kan användas för att skicka order till vår handel. Här förklarade vi mrequest som en MqlTradeRequest typ. Resultatet av någon handelstransaktion returneras som en speciell fördefinierad struktur av typen MqlTradeResult. En variabel som deklareras vara av typen MqlTradeResult kommer att kunna få tillgång till handelsförfrågan. struct MqlTradeResult uint retcode Drift returkod ulong deal Deal biljett, om det görs ulong order Beställ biljett, om det är placerat dubbelt volym Deal volym, bekräftad av mäklare dubbel pris Deal pris, bekräftad av mäklare dubbel bud Aktuellt Bud pris dubbel fråga Aktuellt fråga prissträngskommentar Mäklare kommentar till operationen (som standard fylls den av driftsbeskrivningen) Priset (Öppna, Stäng, Hög, Låg), Tid, Volymerna på varje stapel och Spridningen för en symbol lagras i denna struktur. Vilken array som deklareras vara av typen MqlRates kan användas för att lagra pris, volymer och spridningshistorik för en symbol. struct MqlRates datetime tid Period starttid dubbel öppen Öppet pris dubbelt högt Högsta priset för perioden dubbelt låg Lägsta pris för perioden dubbel stäng Stäng pris lång tickvolume Tick volym int spridning Sprid lång realvolume Handelsvolym Här har vi deklarerat en matris som kommer att användas för att lagra denna information. Därefter bestämmer vi oss för att ställa in alla arrays som vi ska använda för att lagra barerinformation som serie. Det här är att se till att värdena som kopieras till arraysna ska indexeras som tidsserierna, det vill säga 0, 1, 2, 3 (för att motsvara barindexet. Så vi använder funktionen ArraySetAsSeries (). Bool ArraySetAsSeries (void array. Array med referensbool set true betecknar omvänd ordning för indexering) Det bör noteras att detta också kan göras en gång i initialiseringsdelen av vår kod. Men jag har bestämt mig för att visa det för tillfället av vår förklaring. Vi använder nu SymbolInfoTick-funktionen för att få det senaste prissättningen. Den här funktionen innehåller två argument diagramsymboler och MqlTick-strukturvariabeln (senaste prissättning). Om det finns fel rapporterade vi det. de senaste tre staplarna i vår Mqlrates-typmatris med funktionen Copy Rates. Funktionen Copy Rates används för att få historikdata för MqlRates-strukturen för en angiven symbolperiod i specificerad mängd i en MqlRates-typmatris. olname. symbolnamn ENUMTIMEFRAMES tidsram. period int startpos. startposition int räkning. dataräknare för att kopiera MqlRates ratesarray target array för att kopiera) Symbolnamnet erhålls genom att använda symbolen. Nuvarande periodtimeframe erhålls med användning av period. För startpositionen börjar vi från den aktuella fältet Bar 0 och vi räknar bara med tre barer, staplar 0, 1 och 2. Resultatet kommer att lagras i vår array, mrate. Mrate-arrayen innehåller nu all pris, tid, volymer och spridningsinformation för staplarna 0. 1 och 2. Därför kommer vi att få följande information om varje stapel för att få detaljerna i varje stapel: : mrate1.time Bar 1 Starttid mrate1.open Bar 1 Öppet pris mrate0.high Bar 0 (nuvarande bar) högt pris, etc. Nästa, kopierade vi alla indikatorvärden till de dynamiska arrangemang som vi har deklarerat med hjälp av CopyBuffer-funktionen. int CopyBuffer (int indikatorhand, indikatorhandtag int buffernum, indikator buffertnummer int startpos, startposition int räkning, belopp att kopiera dubbelbuffert målgrupp för att kopiera) Indikatorhandtaget är det handtag vi skapade i avsnittet OnInit. När det gäller buffertal har ADX-indikatorn tre (3) buffertar: Den rörliga genomsnittliga indikatorn har bara en buffert (1): Vi kopierar från nuvarande stapel (0) till de två senaste staplarna. Så många poster som ska kopieras är 3 (staplar 0, 1 och 2). Bufferten är de måldynamiska arrays som vi tidigare förklarat adxVal, plsDI, minDI och maVal. Som du kan se här igen försöker vi fånga eventuella fel som kan uppstå i kopieringsprocessen. Om det finns fel, behöver du inte gå vidare. Det är viktigt att notera att funktionen CopyBuffer () och funktionen CopyRates () returnerar det totala antalet poster som kopierats efter framgång medan det returneras -1 inkommande fel. Det är därför vi söker efter ett värde mindre än 0 (noll) i felkontrollfunktionerna här. Vid denna tidpunkt vill vi kolla om vi redan har en Köp eller Sälj-position öppnad, i ord ord, vi vill se till att vi endast har en Sälj eller Köp handel öppnad åt gången. Vi vill inte öppna en ny Köp om vi redan har en, och vi vill inte öppna en ny Sälj om vi redan har en öppnad. För att uppnå ska vi först och främst deklarera två bool datatypvariabler (Buyopened och Sellopened) som kommer att hålla ett TRUE värde om vi redan har en position öppnad för antingen Köp eller Sälj. Vi använder handelsfunktionen PositionSelect för att veta om vi har en öppen position. Den här funktionen returnerar SANT om vi har en position öppnad redan och FALSK om vi har ingen. Det kräver, som huvudargumentparametern, symbolen (valutaparet) vi vill kolla. Här använder vi symbol eftersom vi kontrollerar den aktuella symbolen (valutapar). Om detta uttryck returnerar TRUE, vill vi kolla om öppnat läge är en Köp eller Sälj. Vi använder funktionen PositionGetInteger för detta. Det ger oss den typ av position som öppnas när vi använder den med POSITIONTYPE-modifieraren. Den returnerar positionstypidentifieraren som antingen kan vara POSITIONTYPEBUY eller POSITIONTYPESELL I vårt fall använde vi den för att bestämma vilken av positionen vi redan har öppnat. Om det är en Sälj, lagrar vi ett SANT värde i Sellopened och om det är en Köp, lagrar vi ett SANT värde i Buyopened. Vi kommer att kunna använda dessa två variabler senare när vi söker efter Sälj eller Köpvillkor senare i vår kod. Det är dags att lagra det snabba priset för den bar som vi ska använda för vår BuySell-inställning. Kom ihåg att vi förklarade en variabel för det tidigare. Efter att ha gjort det kommer vi nu att gå vidare till nästa steg. Det är dags att börja kolla på ett köpmöjlighet. Låt oss analysera uttrycket ovan eftersom det representerar den strategi vi designade tidigare. Vi förklarar en bool typ variabel för alla våra villkor som måste uppfyllas innan en beställning kan placeras. En bool-typvariabel kan bara innehålla SANT eller FALK. Så, vår Köpstrategi har delats upp i fyra villkor. Om något av villkoren är uppfyllt eller uppfyllt, lagras ett värde av TRUE i vår bool-typvariabel, annars kommer ett värde av FALSE att lagras. Låt oss titta på dem en efter en. Här tittar vi på MA-8-värdena på staplarna 0, 1 och 2. Om värdet på MA-8 på den aktuella streckmenyn är större än dess värde på föregående streck 1 och också är MA-8-värdet på streck 1 större än dess värde på streck 2. det betyder att MA-8 ökar uppåt. Detta uppfyller en av våra villkor för en Köp-inställning. Detta uttryck kontrollerar för att se om Bar 1 Stängt pris är högre än värdet av MA-8 under samma period (Bar 1-perioden). Om priset är högre är vårt andra villkor också uppfyllt, då kan vi leta efter andra villkor. Om emellertid de båda villkoren som vi just funderat inte uppfylldes, är det inte nödvändigt att kontrollera andra villkor. Därför bestämmer vi oss för att inkludera de följande uttrycken inom dessa två initiala villkor (uttryck). Nu vill vi kontrollera om det nuvarande värdet av ADX (ADX-värde i bar 0) är större än det minsta ADX-värdet som anges i ingångsparametrarna. Om det här uttrycket är sant, det vill säga det nuvarande värdet av ADX är större än det lägsta värdet som krävs, vill vi också vara säker på att plusDI-värdet är större än minusDI-värdet. Detta är vad vi uppnådde i nästa uttryck Om alla dessa villkor är uppfyllda, är det, om de återkommer sanna, vill vi vara säkra på att vi inte öppnar en ny Köpposition om vi redan har en. Nu är det dags att kolla värdet på Buyopened-variabeln som vi deklarerade tidigare i vår kod. Om Buyopened är sant vill vi inte öppna ett annat köpposition, så vi visar en varning för att informera oss och återvända så att vår EA nu väntar på nästa Tick. Men om Buyopened är FALSK, bereder vi våra poster med hjälp av variabeln MqlTradeRequest (mrequest) som vi förklarade tidigare för att skicka vår order. Åtgärden här, som är handelstransaktionstypen, är TRADEACTIONDEAL eftersom vi placerar en handelsorder för omedelbar utförande. Om vi ​​ändrar en order, så använder vi TRADEACTIONMODIFY. För att radera en beställning använder vi TRADEACTIONREMOVE. Vi använde vårt senaste pris för MqlTick-typ för att få det senaste Ask-priset. Order Stop-loss-priset erhålls genom att subtrahera vår StopLoss i poäng från Ask-priset medan orderpriset erhålls genom att lägga till vår TakeProfit i poäng till Ask-priset. Du kommer också att observera att vi använde NormalizeDouble-funktionen för Ask-priset, StopLoss och TakeProfit-värdena, det är bra att alltid normalisera dessa priser till antalet siffror i valutapar innan de skickas till handelsservern. Symbolen är den nuvarande symbolen (Symbol eller Symbol ()). Ordertypen är vilken typ av order vi placerar, här lägger vi en orderorder ORDERTYPEBUY. För en Säljorder kommer det att bli ORDERTYPESELL. Ordningsskrivning är orderkörningstypen ORDERFILLINGFOK innebär att avtalet kan exekveras exklusivt med en angiven volym till lika med eller bättre pris än det angivna orderpriset. Om det inte finns tillräckligt med volymer av erbjudanden på ordersymbolen, kommer ordern inte att utföras. Funktionen OrderSend () tar två argument, variabeln MqlTradeRequest typ och variabeln MqlTradeResult. Som du kan se använde vi vår typvariabel MqlTradeRequest och variabeln MqlTradeResult i att placera vår order med OrderSend. Efter att ha skickat vår order, använder vi nu variabeln MqlTradeResult för att kontrollera resultatet av vår order. Om vår order körs framgångsrikt vill vi bli informerade, och om inte vill vi också veta det. Med MqlTradeResult-typvariabeln mresult kan vi få åtkomst till driftavkastningskoden och även ordernummeret om ordern är placerad. Returkoden 10009 visar att OrderSend-förfrågan slutfördes, medan 10008 visar att vår order har placerats. Det är därför vi har kontrollerat någon av dessa två returkoder. Om vi ​​har någon av dem, är vi säkra på att vår order har slutförts eller den har placerats. För att söka efter en Säljmöjlighet, kontrollerar vi motsatsen till vad vi gjorde för köpmöjlighet med undantag för vår ADX som måste vara större än det angivna lägsta värdet. Precis som vi gjorde i köpavsnittet förklarar vi en bool-typvariabel för alla våra villkor som måste uppfyllas innan en beställning kan placeras. En bool-typvariabel kan bara innehålla SANT eller FALK. Så, vår säljstrategi har delats upp i fyra villkor. Om något av villkoren är uppfyllt eller uppfyllt, lagras ett värde av TRUE i vår bool-typvariabel, annars kommer ett värde av FALSE att lagras. Låt oss titta på dem en efter en som vi gjorde för Köp-avsnittet Här tittar vi på MA-8-värdena på staplarna 0, 1 och 2. Om värdet på MA-8 på den aktuella fältet är mindre än dess värde på föregående bar 1 och också är MA-8-värdet på Fält 1 mindre än dess värde på Fält 2. det betyder att MA-8 minskar nedåt. Detta uppfyller en av våra villkor för en Sälj-inställning. This expression is checking to see if Bar 1 Close price is lower than the value of MA-8 at the same period (Bar 1 period). If the price is lower, then our second condition has also been satisfied, then we can check for other conditions. However, if the two conditions we have just considered were not met, then there will be no need to check other conditions. That is why we decide to include the next expressions within these two initial conditions (expressions). Now we want to check if the current value of ADX (ADX value on Bar 0) is greater than the Minimum ADX value declared in the input parameters. If this expression is true, that is, the current value of ADX is greater than the Minimum required value we also want to be sure that the MinusDI value is greater than the plusDI value. This is what we achieved in the next expression If these conditions are met, that is, if they return true, then we want to be sure that we do not open a new Buy position if we already have one. It is now time to check the value of the Buyopened variable we declared earlier in our code. If Sellopened is true, we do not want to open another Sell position, so, we display an alert to inform us and then return so that our EA will now wait for the next Tick. However, if Sellopened is FALSE, then we setup our Sell trade request as we did for Buying order. The major difference here is the way we calculated our stop loss price and take profit price. Also since we are selling, we sell at the Bid price that is why we used our MqlTick type variable latestprice to get the latest bid price. The other type here, as explained earlier, is ORDERTYPESELL. Also here, we used the NormalizeDouble function for the Bid price, the StopLoss and TakeProfit values, it is good practice to always normalize these prices to the number of digits of currency pair before sending it to the trade server. Just as we did for our Buy order, we must also check if our Sell order is successful or not. So we used the same expression as in our Buy order. 3. Debugging and Testing our Expert Advisor At this point, we need to test our EA to know it our strategy works or not. Also, it is possible that there are one or two errors in our EA code. This will be discovered in the next step. Debugging our code helps us to see how our code performs line by line (if we set breakpoints) and there and then we can notice any error or bug in our code and quickly make the necessary corrections before using our code in real trade. Here, we are going to go through the step by step process of debugging our Expert Advisor, first of all, by setting breakpoints and secondly, without breakpoints. To do this, Make sure you have not closed the Editor. First of all, let us select the chart we want to use to test our EA. On the Editor Menu bar, click on Tools and click on Options as shown below: Figure 8. Setting Debugging options Once the Options window appears, select the currency pair, and the periodtimeframe to use and click the OK button: Before we start the debugger, let us set breakpoints. Breakpoints allow us to monitor the behaviorperformance of our code at certain selected locations or lines. Rather than running through all the code at once, the debugger will stop whenever it see a breakpoint, waiting for your net action. By this we will be able to analyze our code and monitor its behavior as it reaches every set break-points. We will also be able to evaluate the values of some of our variables to see if things are actually the way we envisaged. To insert a breakpoint, go to the line in your code where you want to set the breakpoint. By the left hand side, on the gray field near the border of the code line, double-click and you will see a small round blue button with a white square inside it. Or on the alternative, place the cursor of your mouse anywhere on the code line where you want the breakpoint to appear and press F9 . To remove the breakpoint, press F9 again or double-click on it. Figure 10. Setting a breakpoint For our code, we are going to set breakpoint on five different lines. I will also label them form 1 to 5 for the sake of explanation. To continue, set breakpoint at the seven code lines as shown in the figure below. Breakpoint 1 is the one we have created above. Figure 11. Setting additional breakpoints Once we have finished setting our breakpoints, we are now set to start debugging our code. To start the debugger, press F5 or click the green button on the Toolbar of the MetaEditor: Figure 12. Starting the Debugger The first thing the editor does is to compile the code, if there is any error at the point, it will display it and if no error, it will let you know that the code compiled successfully. Figure 13. Compilation Report Please note that the fact that the code compiled successfully does not mean there may not be errors in your code. Depending on how your code is written, there may be runtime errors. For example, if any of our expressions does not evaluate correctly due to any little oversight, the code will compile correctly but may not run correctly. Too much of the talk, lets see it in action Once the debugger has finished compiling the code, it takes you to the trading terminal, and attach the EA to the chart you have specified on the MetaEditor Options settings. At the same time, it shows you the Input parameters section of the EA. Since we are not adjusting anything yet, just click the OK button. Figure 14. Expert Advisor Input Parameters for Debugging You will now see the EA clearly on the top-right hand corner of the chart. Once it starts the OnTick() . it will stop as soon as it gets to our breakpoint 1. Figure 15. Debugger stops at the first breakpoint You will notice a green arrow at that code line. That tells you that previous code line had been executed we are now ready to execute the present line. Let me make some explanations before we proceed. If you look at the Editors Tool Bar, you will observe that the three buttons with curved arrows which were earlier grayed out are now activated. This is because we are now running the debugger. These buttonscommands are used to step through our code (Step into, Step over or Step out) Figure 16. Step into command The Step Into is used to go from one step of the program execution into the next step, entering into any called functions within that code line. Click on the button or press F11 to invoke the command. (We will use this command in our Step-by-Step debugging of our code.) Figure 17. Step over command The Step over . on the other hand does not enter into any called function within that code line. Click on the button or press F10 to invoke the command Figure 18. Step out command To execute a program step that is one level higher, you click this button or press ShiftF11 . Also, at the lower part of the Editor, you will see the Toolbox window . The Debug tab in this window has the following headings: File : This displays the name of the file been called Function : This displays the present function from the file been called Line : This displays the number of the code line in the file from which the function is called. Expression : This is where you can type the name of any expressionvariable you are interested in monitoring from our code. Value : This will display the value of the expressionvariable we typed at the Expression area. Type : This will display the data type of the expressionvariable been monitored. Back to our debugging process The next thing we want to do is now to type in the variablesexpressions from our code that we are interested in monitoring. Make sure you only monitor the variablesexpressions that really matters in your code. For our example, we will monitor the following: OldTime (old bar time) NewTime0 (current bar time) IsNewBar (flag that indicates the new bar) Mybars (Total bars in History) Our EA depends on it You can add other ones like the ADX values, the MA-8 values, etc. To add the expressionvariable, double-click under the Expressions area or right-click under the Expressions area and select Add as shown in the figure above. Type the expressionvariable to monitor or watch. Figure 19. The expressions watching window Type all the necessary variablesexpressions Figure 20. Adding expressions or variables to watch If the variable hasnt been declared yet, its type is Unknown identifier (except the static variables). Now, lets move on Figure 21. Step into command in action Click the Step into button or press F11 and observe what happens. Keep on pressing this button or F11 until you get to breakpoint no 2 . continue until you get to breakpoint no 4 as shown below and observe the expressions watching window. Figure 22. Watching the expressions or variables Figure 23. Watching the expressions or variables Figure 24. Watching the expressions or variables Once there is a new tick, it will return to the fist code line of the OnTick() function. And all the values of our variablesexpression will now be reset because this is a new tick except if any of them is declared as a static variable. In our case we have one static variable OldTime. Figure 25. Values of variables on NewTick event To go over the process again, continue pressing the F11 key and keep monitoring the variables at the expressions watching window. You can stop the debugger and then remove all the breakpoints. As we see, in Debug mode it prints the message We have new bar here. . Figure 26. Expert Advisor prints the message in Debug mode Start the debugging process again but this time without breakpoints. Keep watching at every tick and if any of our BuySell condition is met, it will place a trade and since we have written our code to tell us if an order is placed successful or otherwise, we will see an alert. Figure 27. Expert Advisor places trade during debugging I think you can leave the EA to work for a few more minutes while you take a coffee. Once you are back and you have made some money ( just kidding ), then click the STOP (Red) button on the MetaEditor to stop debugging. Figure 28. Stopping the debugger What we have actually done here is to see that our EA only checks for a trade at the opening of a new Bar and that our EA actually works. There is still a lot of room for adjustments to our EA code. Let me make it clear, at this point that, the Trading terminal must be connected to the internet, otherwise, debugging will not work because the terminal will not be able to trade. 3.2 TESTING OUR EA STRATEGY At this point we now want to test our EA using the Strategy Tester built into the Trading Terminal. To start the Strategy Tester, press CONTROLR or click the View menu on the Terminal Menu Bar and click on Strategy Tester as shown below Figure 26. Starting the Strategy Testing The Tester (Strategy Tester) is shown at the lower part of the terminal. For you to see all the Testers settings, you need to expandresize it. To do this, move your mouse pointer to the point shown by the red arrow (as shown below) Figure 27. The Strategy Tester window The mouse pointer changes to a double-end arrow, hold down the mouse and drag the line upwards. Stop when you discover that you can see everything on the settings tab. Figure 28. The Strategy Tester Settings Tab Select the EA you want to test Select the Currency pair to use for the test Select the PeriodTimeframe to use for the test Select Custom Period and set the dates in 5 Set the dates for the custom period to be used for the test Execution is Normal Select the deposit amount in USD to be used for the test Set Optimization to Disable (We are not optimizing now, we just want to test) Click this button when you are ready to start test. Before we click the Start button, lets look at the other tabs on the Tester The processor used by the Tester for the Test. Depending on your Computers processor type. Mine is only one (1) core processor. Figure 29. The Strategy Tester Agents tab Once the agent, you will see something similar to the figure below Figure 30. The Strategy Tester Agents tab during a test This is where all the events going on during the test period is displayed Figure 31. The Strategy Tester Journal tab showing trade activities This is where you can specify the input parameters for the EA. Figure 32. The Strategy Tester Inputs tab If we are optimizing our EA, then we will need to set the values in the circled area. The Start is the values you want the Tester to begin with. The Step is the increment rate for the value you selected, and The Stop is the value at which the Tester will stop incrementing the value for that parameter. However, in our case we are not optimizing our EA, so we will not need to touch that for now. Once everything is set, we now go back to the Settings tab and click the Start button. Then the tester begins its work. All you need to do now is to go and take another cup of coffee if you like, or, if you are like me, you may want to monitor every event, then turn to the Journal tab. Once you begin to see messages about orders been sent on the Journal Tab, you may then wish to turn to a NEW tab named Graph which has just been created. Once you switch to the Graph tab, you will see the graph keep on increasing or decreasing as the case may be depending on the outcome of your trades. Figure 33. The graph result for the Expert Advisor Test Once the test is completed, you will see another tab called Results . Switch to the Results tab and you will see the summary of the test we have just carried out. Figure 34. The Strategy Tester Results tab showing test results summary You can see the total Gross Profit, Net Profit, total trades total loss trades and many more. Its really interesting to see that we have about USD 1,450.0 within the period we selected for our test. At least we have some profit. Let me make something very clear to you here. You will discover that the settings for the EA parameters that you see in the Strategy tester is different from the initial settings in the Input parameters of the EA. I have just demonstrated to you that you can change any of those input parameters to get the best out of your EA. Instead of using a period of 8 each for the Moving Average and ADX, I changed it to 10 for Moving Average and 14 for ADX. I also change the Stop Loss from 30 to 35. Last but not the least, I decided to use 2 Hour timeframe. Remember, this is the Strategy Tester. If you want to view a complete report of the test, then right-click on anywhere in the Results tab, you will see a menu. From this menu, Select Save as Report . Figure 35. Saving the result of the test The save dialog window will appear, type a name for your report (if you want, otherwise leave the default name) and click the save button. The whole report will be saved in HTML format for you. To view the chart for the test that was carried out, click Open Chart and you will see the chart displayed Figure 36. The chart showing the test Thats it, we have successfully written and tested our EA and we now have a result to work with. You can now go back to the strategy tester Settings tab and make the test for other TimeframesPeriod. I want you to carry out the test using different currency pairs, different timeframes, different Stop Loss, different Take profit and see how the EA performs. You can even try new Moving Average and ADX values. As I said earlier, that is the essence of the Strategy tester. I will also like you to share your results with me. Conclusion In this step by step guide, we have been able to look at the basic steps required in writing a simple Expert Advisor based on a developed trading strategy. We have also looked at how we check our EA for errors using the debugger. We also discussed how to test the performance of our EA using the Strategy Tester. With this, we have been able to see the power and robustness of the new MQL5 language. Our EA is not yet perfect or complete as many more adjustments must still be made in order to used it for real trading. There is still more to learn and I want you to read the article over again together with the MQL5 manual, and try everything you have learn in this article, I can assure you that you will be a great EA developer in no distant future. Forex Expert Advisor Inexperienced beginners are always interested in finding a trade robot that does all the work, so that the trader does not have to lift a finger. Denna idé har drivits av alla handlare av datoråldern. Byrån för ansvar för beslutsfattande, som släpper ut en handlare nerver, faller nu helt och hållet på handelsexpertrådgivarna. Vad är en Forex Expert Advisor Den Forex Expert Advisor är ett program som kan utföra i terminalen någon åtgärd enligt instruktionerna från en näringsidkare, utan hans direkta engagemang. Alla uppgifter utförs automatiskt eller mekaniskt, varför rådgivarna kallas experter eller mekaniska handelssystem (MTS). Enkelt sagt, det här är ett program som skickar ansökningar till en mäklare utan något ingripande från näringsidkarens sida. Du installerar en vinstexpertexpertrådgivare till den befintliga Forex online trading plattformen, som är ansluten till serverns mäklare, justerar alla inställningar och rådgivaren kommer att börja handla enligt en förinställd strategi. Fördelar med Forex Expert Advisors Från en psykologisk synpunkt är Forex expertrådgivaren oersättlig. En näringsidkare minskar ansvaret för beslutsfattandet och branschen blir mindre stressande. Näringsidkaren behöver inte ha en fördjupad kunskap om teknisk och fundamental analys, eftersom alla beräkningar redan ingår i programmet. Dessutom kan rådgivaren hantera handelssignaler även när näringsidkaren är frånvarande från arbetsplatsen. Skriva en Forex Expert Advisor Forex Expert Advisors för MetaTrader4 är skrivna i MQL4 programmeringsspråk. Detta språk utvecklades av tillverkaren av handelsterminalen speciellt för att skriva expertrådgivare. Det gör det möjligt för näringsidkaren att programmera handelssystemet utan svårigheter, vilket kommer att handla i online-läge dag och natt. Programmerare som är bekanta med det här språket har ingen svårighet att göra jobbet. För vanliga användare blir det en svårare uppgift. Forex Expert Advisors Indicators You can create your own technical indicators for more effective work by the advisors. De kommer att vara ett utmärkt komplement till de befintliga indikatorerna i MetaTrader4-terminalen. Syftet med att använda rådgivare indikatorer är att genomföra analytiska funktioner och generera handelssignaler. Inbyggda och egna Forex Expert Advisors MetaTrader4 trading terminal har flera inbyggda expertrådgivare. De har funktionen av ett oberoende handelssystem och dubbar handelssignalerna. De är mycket populära bland nybörjare och skapades speciellt för att visa förmåga att programmera MetaTrader 4 Client Terminal. Möjligheterna att skapa din egen rådgivare är helt enkelt bländande. Du kan ställa in olika order efter pris och tid, öppna automatiskt beställningsorder etc. Dessa program kan ersätta näringsidkaren på deras arbetsplats. Testa Forex Expert Advisors Handels Terminalen kan inte bara skriva rådgivare, men också kontrollera dem på historiska data innan de används, vilket är en annan unik egenskap att använda rådgivarna. Testning är mycket användbar, eftersom det bidrar till att mäta förmågan och effektiviteten hos ett mekaniskt handelssystem på historiska data, uppskatta chanserna för framtida intäkter och fel. Om du har testat rådgivaren och vet hur den kommer att verka under olika marknadsförhållanden, kan du börja handla utan att behöva ingripa. För detta ändamål har terminalen ett speciellt fönster där du också kan optimera ingångsparametrarna för rådgivare. Skilja ord för nybörjare Nybörjare kan tro att handel med rådgivare är mycket komplicerat. Det är inte så. Efter ungefär en månad kan varje näringsidkare börja programmera sitt eget automatiserade handelssystem. Även om du är tveksam om att lita på dina pengar till ett datorprogram, kan du konfigurera rådgivaren till fem ljudvarningar, vilket kommer att underlätta ditt arbete så att du spenderar mindre tid på grafisk analys som förväntar dig en signal att öppna och stänga positioner. Du kan hitta massor av rådgivare på Internet, men det är mycket svårt att få en lönsam, och att använda varje enskild är utmattande och kan leda till att din insättning sänks. Det är därför du rekommenderas att köpa den första rådgivaren du stöter på. Många rådgivare visar bra resultat när de testas på ett valutapar, men utför dåligt på andra. Det är bättre att använda rådgivaren för de instrument du har testat på. quotVIP clientquot program Få exceptionella privilegier genom att gå med i vårt VIP-program. Skapa din egen handelsrobot på 5 minuter även om du donutsquot har programmeringsförmåga stock. roboforex Direkt tillgång från 100 USD till den reala börsen. quotRebates (Cashback) quotprogram Handel och motta månatliga rabatter till ditt konto Upp till 10 på kontosaldo Få ytterligare vinst för volymen du gör. Riskvarning Det är en stor risk när det handlar om handel med leveranser som ForexCFD. Du bör inte riskera mer än du har råd att förlora, det är möjligt att du kan förlora hela beloppet på ditt kontobalans. Du bör inte handla eller investera om du inte förstår den verkliga omfattningen av din exponering för risken för förlust. När du handlar eller investerar måste du alltid ta hänsyn till din erfarenhetsnivå. Kopieringstjänster innebär ytterligare risker för din investering på grund av sådana produkters karaktär. If the risks involved seem unclear to you, please apply to an outside specialist for an independent advice. Advanced Guide To MetaTrader 4 - Expert Advisors Expert Advisor Creation Expert Advisors are programs that allow automation of the analytical and trading processes in the MT4 platform. To create an Expert Advisor (or Expert), the expert editing program - MetaEditor - has to be opened from within the MT4 platform. To open the editor (see Figure 1):13 In the Navigator window, right-click on Expert Advisors and select Create or In the Main Menu gt Tools gt MetaQuotes Language Editor or Click on the MetaEditor icon in the Standard Toolbar: or Press F4 on the computer keyboard. 13 13 Figure 1 - There are several ways to open the MetaEditor. 13Any of these actions will open the Expert Creation Wizard. The Wizard can be used to create Expert Advisors, Custom Indicators, Scripts and DLLs. To create an Expert Advisor, select Expert Advisor and click Next to continue, as shown in Figure 2. 13 Figure 2 - MT4s Expert Advisor Wizard is used to create Expert Advisors, Custom Indicators, Scripts and Libraries (DLLs). 13The General Properties of the Expert Advisor window appears. Here, traders must specify the: Name - A user-created name for the Expert. Developer - The developers name. Link - To the developers website, if applicable. Inputs - the list of Expert inputs 13 13To add a new parameter to the Inputs field, press the Add button. For each Parameter, the trader must specify the Name, Type and Initial Value, as shown in Figure 3. To delete a parameter, highlight the parameter and press Delete. These become the Input Variables within the Expert. Once all the inputs have been listed, click Finish to continue.13 Figure 3 - Create the input variables by identifying Name, Type and Initial Value. 13A new window appears in the programming environment. The Experts name appears at the top of the window, and the previously entered input parameters are listed near the top of the code, as shown in Figure 4. 13 Figure 4 - The Expert name and inputs appear in the code window. 13From here, the Expert code can be entered into the window using the MQL4 programming language and syntax (see Figure 5). Note . Specifics regarding programming are outside the scope of this tutorial understanding programming logic and learning a specific language require significant effort. Handlare kan lära sig mer om programmering i MQL4-miljön genom att läsa MT4 Hjälpguider och delta i det aktiva MQL4-communityforumet. MQL4, like other proprietary languages, has a list of Reserved Words and Standard Constants that are used during programming. Examples of constants for trade operations, along with their descriptions, include:13 OPBUY - Buying position OPSELL - Selling position OPBUYLIMIT - Buy limit pending position OPSELLLIMIT - Sell limit pending position OPBUYSTOP - Buy stop pending position OPSELLSTOP - Sell stop pending position 13 13 Figure 5 - part of the code for an Expert Advisor. Certain words have predefined uses here, OPSELL instructs the computer to sell if other criteria are met ( if statements). Traders can find a MQL4 Reference in the Help tab of the Toolbox in the MetaEditor window. This Reference includes information that is helpful to beginner and experienced programmers including: Expert Advisor Compiling After the Expert development has been completed, it must be compiled in order to ensure that the code has been written in the proper format needed to run the Expert. To compile the Expert: Select File gt Compile (see Figure 6) or Click the Compile button on the toolbar or Press F5 on the computer keyboard. 13 13Once compiling has been initiated, an update appears in the Toolbox beneath the code in the MetaEditor window, as shown in Figure 6. An errors or warnings will be listed.13 Figure 6 - Successful compiling with zero errors and zero warnings. 13After successful compilation, the new Expert will appear in the Navigator - Expert Advisors window, as shown in Figure 7. If the Expert did not compile successfully, it will still appear but its icon will be gray and the Expert cannot be used. 13 Figure 7 - The new Expert now appears in the Navigator-Expert Advisors window. Expert Advisor Setup Before the Expert can be used, its parameters must be defined in the Terminal Settings window. To open the window:13 In the Main Menu gt Tools gt Options or Pressing CTRL O on the computer keyboard. Either action will open the Options window. Select the Expert Advisors tab, as shown in Figure 8. 13 Figure 8 - Select the Expert Advisors tab in the Options window to define an Experts parameters. 13 13The following settings are available in the Expert Advisors tab: Enable Expert Advisors - this option allows the user to enable (check) or disable (uncheck) the use of all Experts. Disable experts when the account has been changed - this option disables the Expert if the account has been changes, such as from a demo to a live account. Disable experts when the profile has been changed - this option prevents Experts from launching if the profile has changed. Allow live trading - to enable Experts in real-time mode (rather than testing an Expert on historical data). Ask manual confirmation - to send trade confirmation prior to submitting the order. Allow DLL imports - to use DLLs to enhance Expert functionality. Confirm DLL function calls - to allow control over the execution of each called function. Allow external experts imports - to allow the Expert to access functions from other Experts or MQL4 libraries. 13 13Once the selections have been made, click OK to close the window. Expert Advisor Launch 13 After the Expert has been created and setup, it is ready to be launched. To launch an Expert: 13 Right-click on the Expert in the Navigator - Expert Advisors window and select Attach to a chart or13 Double-click on the Expert in the Navigator - Expert Advisors window or13 Drag-and-drop the Expert to the desired chart.13 13A window appears with Common and Inputs tabs, as shown in Figure 9. Review the settings in each tab and make any necessary changes, and then click OK to attach the Expert to the active price chart.13 Figure 9 - Make any changes to the Common and Inputs tabs before attaching the Expert to the active price chart. 13The Expert will now be attached to the price chart. Its name will appear in the upper right-hand corner of the chart. The Experts name will be followed by a smiley face, as shown in Figure 10, if live trading is enabled. Otherwise, the Experts name will appear with a frowny face, a dagger after the name indicates that all experts are disabled. 13 Figure 10 - An Expert with a smiley face indicates that live trading has been enabled. 13The Expert is now ready to begin analytical and trading functions. Expert Advisor Shutdown To shut down an Expert, it has to be removed from the chart. To remove an Expert, right-click on the active price chart, select Expert Advisors and then Remove, as shown in Figure 11. 13 Figure 11 - To remove an Expert, right-click the active price chart, select Expert Advisors from the drop-down menu, and then select Remove. Notes About Expert Advisors All Experts are shutdown if the Terminal is closed. If a chart is closed, the Expert attached to the chart will shut down as well. Adding another Expert to a chart will remove the previous one (a confirmation appears). Deleting the Expert from the Navigator window does not shut down an Expert of the same name on an active price chart. 13 13SEE: Trading Systems CodingWriting a Forex Expert Advisor Forex Expert Advisors for MetaTrader4 are written in the MQL4 software design language. This linguistic was industrialized by the constructor of the trading fatal definitely for writing forex ea . It permits the trader to plug-in the trading structure without any struggle, which will trade in online style day and night. Computer operator familiar with this linguistic will not have any trouble in doing the job. For normal users this will be an extra trying job. Forex Expert Generator is an instrument with which you can produce your own forex expert advisor for your strategy. You need to have at least MQL4 software design knowledge to use this tool. MQL4 is the software designing language that is rummage-sale to write forex expert advisors . If you are a single designer and would comparable to view the MQL4 code also for the forex ea you made, you must to purchase expert edition single certificate which is 139. If you purchase the normal edition you cannot interpretation the program. I accepted the expert version single certificate and after emerging my forex expert advisor I usually copy the code and paste it in the MQL 4 publishing superior and save it with some name, collect it and back trial it. This is a very easy tool as you dont actually essential to write the code but use the lumps on the left hand side and make your forex expert advisor . Once you collect it if there any mistakes you can see those mistakes below the Compilation tab at the lowest. If there are no mistakes you can vision the code below the tab Source Code . MT4 Expert Advisor Programmering Om du är en Forex-handlare och har behov av en erfaren programmerare för att konvertera din handelsstrategi till en expertrådgivare (EA), har du kommit till rätt plats. Vi skulle gärna överväga din idé och ha erfarenhet och kunskap för att få det att hända. Kontakta oss när som helst.

No comments:

Post a Comment