Maak een Algorithm Trading Robot de basis voor het schrijven van een expert-adviseur in MQL4

De financiële markten ter wereld bieden u een enorm potentieel voor winst en verlies. Er is altijd een potentieel voor winst in de markt omdat u transacties in beide richtingen kunt plaatsen. Of je houding nu bullish of bearish is, het vermogen van de handelaar om geld te verdienen is altijd aanwezig - net als het vermogen om verlies te maken.

Veel te vaak staan ​​emoties, psychologische valkuilen en mentale discipline in de weg van winst en zijn de belangrijkste redenen 95% (of meer) van alle nieuwe handelaren verliezen al hun investeringskapitaal in de eerste maand. 

Het gebruik van een algoritme voor algoritmes voor expertadvies in Meta Trader, geschreven in de MQL4-taal, is een manier om toegang te krijgen tot de markt via code, waardoor de emoties uit het beeld verdwijnen en alleen de cijfers en uw programmalogica werken.. 

Emoties uit de vergelijking halen is één maat, maar dit betekent niet dat robots niet kunnen verliezen. Sterker nog, zelfs de grote investeringsbanken moesten de stekker uit hun tradingrobots halen voordat het verlies fataal werd. In 2013 had Goldman Sachs ernstige tekortkomingen in hun handelsalgoritmen die $ 100 miljoen kostten.

U moet op de hoogte zijn voordat u doorgaat met deze gids en zelfs overweegt om uw gids te gebruiken echt, zuurverdiende contanten, die je kunt verliezen allemaal uw storting in uw brokerage-account van uw code (en misschien in het ergste geval meer bij sommige makelaars als er extra kosten van toepassing zijn)

U bent uiteindelijk verantwoordelijk voor de transacties, zelfs als de programmacode ze voor u plaatst. Hoewel verlies een mogelijkheid is, kunt u het account ook vermenigvuldigen en exponentieel laten groeien terwijl u slaapt. 

Als je volledig wilt draaien op automatische piloot, kan dit zonder enige interactie worden bereikt. Je zou letterlijk passief geld kunnen verdienen terwijl je doorgaat met je dagelijkse leven. 

Deze strategie van volledig hands-free trading is niet degene die ik promoot - en dat is het ook niet dat ik ooit heb gebruikt en ik heb het helemaal winstgevend gevonden. Het monitoren van een actieve robot en de huidige transacties, in combinatie met het in de gaten houden van de economische kalender en gebeurtenissen, verschilt heel erg van het loslaten en hopen op het beste. De overwinningen zijn misschien episch, maar de onbewaakte verliezen zijn veel groter.

MQL4 installeren

Download MT4 van hun website en installeer het op uw computer.

  • Windows-gebruikers
  • macOS-gebruikers
  • Linux-gebruikers

Zodra MT4 wordt uitgevoerd, hebt u een account nodig bij een broker die MT4 ondersteunt. Zij kunnen u dan uw MT4-inloggegevens verstrekken. 

Alle makelaars bieden een demo-account aan, en u wordt aangemoedigd om altijd het demo-account te gebruiken voor het schrijven en testen van uw software.

Nadat u MT4 op uw desktop hebt geconfigureerd, kunnen we doorgaan met het creëren van onze eigen algoritme tradingrobot voor expertadvies.

Hoe een robot te schrijven

Er zijn vele talen die geschikt zouden zijn om een ​​algoritme trading robot vanaf nul te schrijven, maar de complicaties die je tegenkomt zijn in feite met de API om markttoegang te richten die je effectenmakelaar zal bieden - dat is hoe je jezelf daadwerkelijk in staat zult stellen om plaats de handelsorders op de financiële markten. 

Verwerking van marktgegevens kan worden bereikt in een overvloed aan talen, en waarschijnlijk in een snellere mate dan de MT4 MQL4 tests kan terugdraaien (backtests zijn een manier om uw algoritme-robot te testen, hierover later meer). Om redenen van gemak van functionaliteit en algemene ondersteuning voor financiële software, raad ik aan om MQL4 (MetaQuotes Language 4), de moedertaal van MetaTrader 4, te gebruiken om uw algoritme tradingrobot te schrijven.

Syntaxis van MQL4

MQL4 is vergelijkbaar in zijn vorm met PHP, C, C ++ of VBScript. Hieronder ziet u een voorbeeld van een functie die bij elke tik met marktgegevens wordt aangeroepen:

void OnTick () if (Bars<100 || IsTradeAllowed()==false) return; if(CalculateCurrentOrders(Symbol())==0) CheckForOpen();  else  CheckForClose();  

Hier controleren we of er voldoende marktgegevens zijn geladen bars < 100. MQL4 stelt vooraf gedefinieerde variabelen in zoals Bars (die het aantal in de grafiek geladen staven bevat). 

Daarnaast controleren we met een of || voorwaardelijk voor IsTradeAllowed (). Dit is een controlefunctie om te controleren of de handelscontext momenteel niet bezet is.

Elementen van MQL4 zoals deze vooraf gedefinieerde variabelen en diagrambewerkingsfuncties zoals Symbol () maken het schrijven van je strategie een wandeling in het park en daarom is het voor mij de beste om algoritme tradingrobots in MQL4 te coderen in vergelijking met andere talen.

Ik raad u aan de MQL4 Reference eens door te nemen wanneer u tijd heeft om meer vertrouwen te krijgen in het gebruik van MQL4 om aan uw behoeften te voldoen.

MQL4-code bewerken in de MetaEditor

Ik raad aan om de ingebouwde MetaEditor IDE te gebruiken die bij het MT4-handelsplatform wordt geleverd. Om de editor in te voeren, klikt u met de rechtermuisknop op een bestaande expert-adviseur in het linker navigatievenster en selecteert u wijzigen van het menu.

De MetaEditor van MT4 wordt dan geopend en u kunt een nieuw bestand maken. Dit biedt de gebruiker syntax highlighting en debugging output. 

Belangrijk: Je zult je mq4-bestanden moeten compileren in ex4-expertadviseurs met behulp van de MetaEditor als je aan het bewerken bent in een externe editor. Dus vertrouwd raken met de MetaEditor is een must.

Ons algoritme

Voor onze strategie zullen we beginnen met het gebruiken van een basis van steun en weerstand van de SMA (Smoothed Moving EENverage) indicator. De SMA kan een bullish of bearish entry / exit-signaal voorspellen. Het afgevlakte voortschrijdend gemiddelde helpt ons om het lawaai van de markt weg te nemen, waardoor we een duidelijker beeld krijgen van de richting van de prijsactie.

In een opwaartse of neerwaartse trend kan de SMA zich gedragen als een ondersteuning of weerstand, afhankelijk van de richting. Wanneer de prijs stijgt, gedraagt ​​de SMA zich als een steunpunt, en wanneer de prijs daalt, vice versa als een weerstand / plafond.

Basis voor binnenkomst

Wanneer we twee SMA's van verschillende perioden plotten, één van een periode van 40 en één van een periode van 100, kunnen we zien hoe ze overgaan en een basis voor binnenkomst creëren. Zoals we eerder vermeldden, beschouwen we het als een basis voor wanneer de SMA onder de prijs ligt (minder dan de slotprijs) ondersteuning, en wanneer de SMA boven de prijs (groter dan de slotkoers) ligt, beschouwen we dit als een regel weerstand

Dus, in code, doen we eerst het volgende om een ​​methode te creëren voor het controleren van de cross-over van inputs om later onze basis voor invoer te bepalen:

// + ----------------------------------------------- ------------------- + // | Controleer op overschakeling van de ingangen | // + ----------------------------------------------- ------------------- + int CheckForCross (dubbele invoer1, dubbele invoer2) static int previous_direction = 0; static int current_dirction = 0; // Opwaartse richting = 1 if (invoer1> invoer2) current_direction = 1;  // Down Direction = 2 if (input1 < input2) current_direction = 2;  // Detect a direction change if(current_direction != previous_direction) previous_direction = current_dirction; return (previous_direction);  else  return (0);   

Nu kunnen we onze SMA berekenen met behulp van de iMA technische indicatormethode die wordt aangeboden door MQL4 en die door ons uitvoeren CheckForCross functie om te zien of er een kruis is zoals zo:

shortSma = iMA (NULL, 0, Periodone, 0, MODE_SMMA, PRICE_CLOSE, 0); longSma = iMA (NULL, 0, PeriodTwo, 0, MODE_SMMA, PRICE_CLOSE, 0); // Controleer of er een kruisje is op deze teek van de twee SMA's int isCrossed = CheckForCross (shortSma, longSma); 

Hier gebruiken we de MODE_SMMA om ons het Smoothed Moving EENverage van de ima technische indicatormethode voor onze gekozen afvlakkingsmethode. 

Als u een andere verzachtingsmethode wilt gebruiken, zijn er verschillende keuzes, zoals Eenvoudig, Exponentieel en Lineair gewogen.

Zoals met alle steun en weerstand, werkt de standaard handelsmethodologie hier: koop ondersteuning en verkoop weerstand

Dus voor ons algoritme gaan we precies dat doen. Wanneer er een kruis in beide richtingen is, gaan we de juiste richting van handel toepassen en de markt betreden.

f (isCrossed == 1) ticket = OrderSend (Symbol (), OP_BUY, LotsOptimized (), Ask, 3,0,0, "Double SMA Crossover", MAGICNUM, 0, Blue); if (ticket> 0) if (OrderSelect (ticket, SELECT_BY_TICKET, MODE_TRADES)) Afdrukken ("BUY Order Opened:", OrderOpenPrice ());  else Print ("Error Opening BUY Order:", GetLastError ()); return (0);  if (isCrossed == 2) ticket = OrderSend (Symbol (), OP_SELL, LotsOptimized (), Ask, 3,0,0, "Double SMA Crossover", MAGICNUM, 0, Blue); if (ticket> 0) if (OrderSelect (ticket, SELECT_BY_TICKET, MODE_TRADES)) Afdrukken ("SELL Order geopend:", OrderOpenPrice ());  else Print ("Error Opening SELL Order:", GetLastError ()); return (0); 

Hier controleren we op de terugkeer van de CheckForCross functie die we eerder hebben gedefinieerd, na het laden met onze twee SMA's gedefinieerd door de ima technische indicator.

We gebruiken OrderSend, die wordt aangeboden door MQL4, om de transactie te openen. Als een beste werkwijze wordt het resultaat opgeslagen in de ticket variabele en later gecontroleerd op een positieve rendementswaarde om elke fout te behandelen die mogelijk aan de zijde van de broker is gemeld.

Basis voor vertrek

Net als de basis voor toegang (behalve in het omgekeerde geval), wanneer de SMA een overlijdenskruis creëert, kunnen we dit signaal gebruiken voor de sluiting van onze handel, als er transacties plaatsvinden. De logica hiervoor zou als volgt worden geschreven:

// Verkrijg het huidige totale aantal orders = OrdersTotal (); // Beheer open orders voor exit-criteria voor (cnt = 0; cnt < total; cnt++) OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES); if(OrderType() <= OP_SELL && OrderSymbol() == Symbol()) // Look for long positions if(OrderType()==OP_BUY) // Check for Exit criteria on buy - change of direction if(isCrossed == 2) OrderClose(OrderTicket(), OrderLots(), Bid, 3, Violet); // Close the position return(0);   else //Look for short positions - inverse of prior conditions  // Check for Exit criteria on sell - change of direction if(isCrossed == 1) OrderClose(OrderTicket(), OrderLots(), Ask, 3, Violet); // Close the position return(0);    

Hier voeren we een voor lus om alle openstaande orders te herhalen, hoewel we momenteel slechts één transactie per keer inruilen - dit stelt ons in staat om in de toekomst uit te breiden en meerdere open transacties te hebben als we denken dat we het nodig hebben.

Dit maakt ook het gebruik van de OrderSelect-methode eenvoudiger, omdat we de cnt veranderlijk van onze voor lus. 

Eenmaal binnen de iteratie kijken we eenvoudig naar het huidige OrderType (controleren op een Kopen OP_BUY of Verkopen OP_SELL volgorde) en pas dan de voorwaardelijke logica toe vanaf de terugkeer van onze CheckForCross methode.

Geldbeheer toevoegen

Op dit moment is ons algoritme eenvoudig met een basis voor het betreden en verlaten van transacties, maar nog steeds behoorlijk gevaarlijk dom als het gaat om fondsbeheer. Om het risico enigszins onder controle te houden, plaatsen we slechts een vijfde van de verhandelbare aandelen in elke transactie, dus nu moeten we dat in ons algoritme opnemen.. 

lot = NormalizeDouble ((AccountFreeMargin () / 5) /1000.0,1); if (lot<0.1) lot=0.1; return(lot);

Dit betekent dat als je $ 10.000 in de account hebt, we alleen handelen met een vijfde per keer ($ 2000), dus het script zal alleen een trade plaatsen met een kleinere partij van 0.1 of 0.2, bijvoorbeeld op basis van deze vijfde berekening. 

We gebruiken AccountFreeMargin en NormalizeDouble om deze lotgrootte te genereren, en als deze wordt berekend onder de minimale partijgrootte van 0,1, stellen we deze in op 0,1.

Naarmate het account groeit (of krimpt!), Wordt de exposure alleen ingesteld op een vijfde van het accountvermogen. Dit betekent dat overmatige blootstelling van een vast bedrag (bijvoorbeeld het verhandelen van een specifieke vaste partij op elke grootteaccount) theoretisch niet kan gebeuren, met andere woorden het risico van margestorting door overmatige verhandeling wordt verwijderd of sterk verminderd. 

Margin call is een zeer reëel risico als de markt drastisch tegen je ingaat voordat je terugkeert als gevolg van een piek / fluctuatie terwijl je er niet bent om meer geld te storten.

In termen van leken wordt de partijgrootte van de transactie berekend dynamisch door ons script om te voldoen aan de aandelengrootte. Het potentieel voor grotere en grotere winsten is dus zeer reëel. 

Notitie: Een leuke functie zou kunnen zijn om een ​​parameter te bieden om de verhandelbare pool af te dekken. Als u bijvoorbeeld alleen ooit met $ 1.000 van uw account wilt handelen, ongeacht de beschikbare marge, kunt u de beschikbare verhandelbare waarde instellen op slechts $ 1.000 in plaats van uw volledige accountgrootte. 

Persoonlijk gebruik ik altijd dergelijke functies bij het live gaan met nieuwe scripts om mijn blootstelling aan risico's te verminderen, totdat ik echt zeker weet dat het script solide genoeg functioneert om meer geld te krijgen. 

Programmatisch vereist dit een parameter en een kleine wijziging in het codevoorbeeld hierboven om te controleren op die variabele in plaats van op de AccountFreeMargin () waarde.

Gelijkspel

Daarnaast zullen we proberen een aantal break-even-situaties uit te voeren, wat inhoudt dat als de markt tegen ons is gewijzigd om een ​​verlies te creëren dat substantieel is vanaf de opening, we ernaar streven om af te sluiten met minimaal verlies en op zijn minst te breken, zelfs om ons kapitaal te behouden.

Dit kan worden bereikt door het verlies van onze handel en de verhouding tot de open prijs te bewaken. Als de richting verandert en onze handel buiten het geld wordt gehouden, kunnen we proberen om de transactie zo dicht mogelijk bij de invoerprijs mogelijk te maken:

 bool BreakEven (int MN) int Ticket; for (int i = OrdersTotal () - 1; i> = 0; i--) OrderSelect (i, SELECT_BY_POS, MODE_TRADES); if (OrderSymbol () == Symbol () && OrderMagicNumber () == MN) Ticket = OrderModify (OrderTicket (), OrderOpenPrice (), OrderOpenPrice (), OrderTakeProfit (), 0, Green); if (Ticket < 0) Print("Error in Break Even : ", GetLastError()); break;   return(Ticket); 

Het bovenstaande gebruikt OrderModify om te proberen het stopverlies in te stellen voor de openstaande prijs van de bestelling. Dit is een ruwe maar eenvoudige methode om ervoor te zorgen dat we uitstappen als de prijs terugkomt op onze invoerprijs. Dit wordt alleen toegepast als de huidige niet-gerealiseerde winst verliesgevend is.

Een break-even marge toevoegen

Een marge voor break-even kan worden toegevoegd door simpelweg toe te voegen aan de OrderOpenPrice methode zoals zo:

Ticket = OrderModify (OrderTicket (), OrderOpenPrice (), OrderOpenPrice () + 10, OrderTakeProfit (), 0, Groen);

Voor dit voorbeeld laten we 10 punten verschil toe in onze ingang tot sluiting via stoplimiet.

Notitie: De handelsrichting moet op deze methode worden gecontroleerd, bijvoorbeeld of deze moet worden opgeteld bij of afgetrokken van de invoerprijs naargelang het een koop- of verkooppositie is.

Een andere manier om te zorgen dat onze winst niet verloren gaat, is door een trailing stop te gebruiken, die in detail in een andere gids zal worden besproken.

Het hele script

Hier is de volledige lijst voor onze deskundige adviseur. We hebben verschillende parameters tot onze beschikking zoals het take-profitniveau, stop-loss en de SMA-periodes. 

Aarzel niet om met de parameters te spelen om te zien wat het beste werkt voor uw handelssituatie en om uw algoritme aan te passen. 

Vergeet niet: prestaties uit het verleden zijn geen indicatie voor de toekomst.

// + ----------------------------------------------- ------------------- + // | Double Sma.mq4 | // | Copyright 2017, Tom Whitbread. | // | http://www.gript.co.uk | // + ----------------------------------------------- ------------------- + #eigendom copyright "2017, Tom Whitbread." #property link "http://www.gript.co.uk" #eigendom beschrijving "Smoothed Moving Average sample expert advisor" #define MAGICNUM 20131111 // Definieer onze parameters invoer dubbele Partijen = 0,1; input int PeriodOne = 40; // De periode voor de eerste SMA-invoer int PeriodTwo = 100; // De periode voor de tweede SMA-invoer int TakeProfit = 40; // Het take-profitniveau (0 uitschakelen) invoer int StopLoss = 0; // Het standaard stopverlies (0 uitschakelen) // + ------------------------------------- ----------------------------- + // | expert initialisatie functies | // + ----------------------------------------------- ------------------- + int init () return (0);  int deinit () return (0);  // + ---------------------------------------------- -------------------- + // | Controleer of SMA | over te steken is // + ----------------------------------------------- ------------------- + int CheckForCross (dubbele invoer1, dubbele invoer2) static int previous_direction = 0; static int current_direction = 0; // Opwaartse richting = 1 if (invoer1> invoer2) current_direction = 1;  // Down Direction = 2 if (input1 < input2) current_direction = 2;  // Detect a direction change if(current_direction != previous_direction) previous_direction = current_direction; return (previous_direction);  else  return (0);   //+------------------------------------------------------------------+ //| Calculate optimal lot size | //+------------------------------------------------------------------+ double LotsOptimized()  double lot = Lots; // Calculate Lot size as a fifth of available free equity. lot = NormalizeDouble((AccountFreeMargin()/5)/1000.0,1); if(lot<0.1) lot=0.1; //Ensure the minimal amount is 0.1 lots return(lot);  //+------------------------------------------------------------------+ //+ Break Even | //+------------------------------------------------------------------+ bool BreakEven(int MN) int Ticket; for(int i = OrdersTotal() - 1; i >= 0; i--) OrderSelect (i, SELECT_BY_POS, MODE_TRADES); if (OrderSymbol () == Symbol () && OrderMagicNumber () == MN) Ticket = OrderModify (OrderTicket (), OrderOpenPrice (), OrderOpenPrice (), OrderTakeProfit (), 0, Green); if (Ticket < 0) Print("Error in Break Even : ", GetLastError()); break;   return(Ticket);  //+------------------------------------------------------------------+ //+ Run the algorithm | //+------------------------------------------------------------------+ int start()  int cnt, ticket, total; double shortSma, longSma, ShortSL, ShortTP, LongSL, LongTP; // Parameter Sanity checking if(PeriodTwo < PeriodOne) Print("Please check settings, Period Two is lesser then the first period"); return(0);  if(Bars < PeriodTwo) Print("Please check settings, less then the second period bars available for the long SMA"); return(0);  // Calculate the SMAs from the iMA indicator in MODE_SMMA using the close price shortSma = iMA(NULL, 0, PeriodOne, 0, MODE_SMMA, PRICE_CLOSE, 0); longSma = iMA(NULL, 0, PeriodTwo, 0, MODE_SMMA, PRICE_CLOSE, 0); // Check if there has been a cross on this tick from the two SMAs int isCrossed = CheckForCross(shortSma, longSma); // Get the current total orders total = OrdersTotal(); // Calculate Stop Loss and Take profit if(StopLoss > 0) ShortSL = Bied + (StopLoss * Punt); LongSL = Ask- (StopLoss * Point);  if (TakeProfit> 0) ShortTP = Bid- (TakeProfit * Point); LongTP = Ask + (TakeProfit * Point);  // Open slechts één transactie tegelijk ... als (totaal < 1) // Buy - Long position if(isCrossed == 1) ticket = OrderSend(Symbol(), OP_BUY, LotsOptimized(),Ask,5, LongSL, LongTP, "Double SMA Crossover",MAGICNUM,0,Blue); if(ticket > 0) if (OrderSelect (ticket, SELECT_BY_TICKET, MODE_TRADES)) Afdrukken ("BUY Order geopend:", OrderOpenPrice (), "SL:", LongSL, "TP:", LongTP);  else Print ("Error Opening BUY Order:", GetLastError ()); return (0);  // Verkopen - Korte positie if (isCrossed == 2) ticket = OrderSend (symbool (), OP_SELL, LotenGeoptimaliseerd (), Bied, 5, ShortSL, ShortTP, "Dubbele SMA Crossover", MAGICNUM, 0, Rood); if (ticket> 0) if (OrderSelect (ticket, SELECT_BY_TICKET, MODE_TRADES)) Afdrukken ("SELL Order geopend:", OrderOpenPrice (), "SL:", ShortSL, "TP:", ShortTP);  else Print ("Error Opening SELL Order:", GetLastError ()); return (0);  // Beheer open orders voor exit-criteria voor (cnt = 0; cnt < total; cnt++) OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES); if(OrderType() <= OP_SELL && OrderSymbol() == Symbol()) // Look for long positions if(OrderType() == OP_BUY) // Check for Exit criteria on buy - change of direction if(isCrossed == 2) OrderClose(OrderTicket(), OrderLots(), Bid, 3, Violet); // Close the position return(0);   else //Look for short positions - inverse of prior conditions  // Check for Exit criteria on sell - change of direction if(isCrossed == 1) OrderClose(OrderTicket(), OrderLots(), Ask, 3, Violet); // Close the position return(0);   // If we are in a loss - Try to BreakEven Print("Current Unrealized Profit on Order: ", OrderProfit()); if(OrderProfit() < 0) BreakEven(MAGICNUM);    return(0); 

Het uittesten

We kunnen de vorige dagen, maanden of zelfs jaren van marktgegevens voor een financieel instrument eenvoudig testen in de MT4 (Meta Trader 4) -omgeving. Handelaren worden echter aangemoedigd om terug testen niet te vertrouwen alleen, maar om het te gebruiken als een leidraad om hun handelsstrategie te sturen en te zien hoe effectief een idee is. 

Met backtesten kunnen traders controleren of hun denken water vasthoudt, om zo te zeggen, voordat ze meer moeite doen en vooruit gaan - meer van hun algoritme in code schrijven.

Waar de expertbestanden plaatsen?

Als u een externe teksteditor heeft gebruikt om uw adviseur te schrijven, moet u uw expert-adviseur in het MT4-handelsplatform laden om het te compileren en de fout te controleren. Voeg eenvoudig het .mq4-bestand toe aan uw MetaTrader-installatie in de Expert-map, bijvoorbeeld. / MetaTrader4 / MQL4 / Experts.

De Expert Advisor is dan beschikbaar in uw MT4-software via het Navigator-menu aan de linkerkant onder het gedeelte Experts. 

Notitie: Zorg ervoor dat je aan het testen bent op een demo-account. Een echt account zal met echt geld handelen, en hoewel de winsten reëel zijn, zullen ook de verliezen reëel zijn.

Terug testen

Als u een strategie testte op het laatste kabeljaar (GBP / USD) en de winstratio hoger dan 1 vond (wat betekent dat u geld hebt verdiend), dan zou u op een goede zaak kunnen zijn. 

Of dit in de echte wereld zal lukken, is een hele andere vraag, en daarom is voorwaartse toetsing even belangrijk, net als Z-score testen. Dat is een veel geavanceerder onderwerp voor machine learning voor uw algoritme, dat hier niet zal worden besproken, maar in latere meer geavanceerde handleidingen.

Hoe een back-test te starten

Gebruik de snelkoppeling Besturing R om de Strategie-tester te openen of selecteer deze uit de Uitzicht menu. Het testvenster wordt geopend in de onderkant van uw venster.

Hier kunt u het algoritme selecteren dat moet worden uitgevoerd in het eerste vervolgkeuzemenu, dus kies de bestandsnaam van de expert-adviseur die u hier hebt gemaakt. Vervolgens kunt u het symbool kiezen (financieel instrument). Ik ga testen op het forex GBPUSD-symbool van het Britse pond naar Amerikaanse dollar.

We kunnen ook de tijdsperiode selecteren om op te starten (periode van 15 minuten, periode van 1 uur, periode van 1 dag, enzovoort). Ik zal de instelling van 30 minuten gebruiken.

Ten slotte hebben we een optie om te modelleren Elke tik, Controle punten, of Open prijzen enkel en alleen. Tijdens het schrijven van uw script, kunt u kiezen voor de Open prijzen alleen, omdat het snel uw test zal uitvoeren-hoewel de resultaten zal niet de moeite waard om echt geld te bankieren!

Als u op zoek bent naar een echte test voordat u verder gaat met testen, is het aan te raden om door te gaan Elke tik. Dit zal veel langer duren om te verwerken! (U kunt het online laten draaien in een MT4 VPN of natuurlijk 's nachts op uw lokale machine als u dat wenst.)

De parameters wijzigen

We hebben een aantal parameters ingesteld (PeriodOne en PeriodTwo) Voor onze expert-adviseur, zodat de tijdsperioden van de twee voortschrijdende gemiddelden kunnen worden gewijzigd. 

Deze zijn toegankelijk via de Strategietester door op te klikken Expert Eigenschappen knop en het bekijken van de invoer tab. 

Hier kan voor elke parameter een numerieke waarde worden gegeven-de standaardwaarden zijn PeriodOne = 40 en Periode Tww = 100.

Forward Testing

Als je eenmaal hebt getest op historische gegevens, kun je beginnen met testen met de live markt, zoals je al hebt gezien als je ideeën de storm van de backtest hebben doorstaan ​​- en (hopelijk) enig vertrouwen hebben gevonden in wat volgens jou een winnende strategie is!

In de live markt kan het zijn dat uw strategie plat op het gezicht valt vanwege elementen die u niet had meegenomen in uw eerdere tests achteraf. Herinner de markt heeft altijd gelijk. Uw code is nooit slimmer dan de markt en er bestaat niet zoiets als geluk hebben met handelen. 

Een voorwaartse test is echt de zuurtest om te zien of de strategie winstgevend is om echt geld op te zetten.

De forward-test wordt meestal het best uitgevoerd op een speciale VPN voor MT4 EA (Expert Advisors), die vaak gratis wordt aangeboden door de meeste FX-makelaars. Het script wordt 24/5 uitgevoerd terwijl de markt open is en u kunt de transacties live volgen door u vanaf een terminal bij het account aan te melden, aangezien het via de MT4-app of desktopcomputer op uw mobiele apparaat zal worden uitgevoerd via de MT4-software.

Hoge volatiliteit

Wat een echte moordenaar van onze scripts kan zijn, is de hoge volatiliteit in de markt, die kan optreden door vele externe factoren. 

Elke neerstorting of flitsongeval, oorlog, verkiezing, renteverhoging, obligatierendementen of een aanzienlijk economisch rapport zoals de CPI, het BBP of wijzigingen in het belastingstelsel zullen grote veranderingen veroorzaken in de wereldeconomie en de vele financiële markten. . Dus ook, indirect, kan uw handel in een valutapaar of beveiliging worden beïnvloed door gebeurtenissen in een ander land, die u in het begin misschien niet had verwacht.

Meest recent, Brexit en later Hillary Clinton's FBI-onderzoek tijdens de aanloop naar de Amerikaanse verkiezingen waren voorbeelden van hoge volatiliteit op de markt voor iedereen die geïnteresseerd is in een kijkje van dichterbij. 

Laten we de zaak van de Brexit nemen. Het Britse publiek leek in de meerderheid te geloven dat een Brexit-stem hoogst onwaarschijnlijk zou zijn. Ik was niet zo optimistisch en haalde al mijn pond eruit, waardoor ik veel van mijn aandelen in het VK bespaarde vanwege de sterk dalende wisselkoers. 

Wat anderen betreft, ben ik bang om te zeggen dat ze niet zoveel geluk hadden. Afdekking van een verblijfstemming - zoals sommige van de adviseurs van de grote banken hadden verklaard - zou natuurlijk geresulteerd hebben in het omgekeerde, en een verlies van ongeveer 15% voor degenen die in het pond zijn belegd, terwijl ze wachten tot het terugkeert.

Dit soort situaties zijn ideaal om uw tradingrobot uit te schakelen en alleen te handelen buiten de grote marktvolatiliteit. Codering voor dit soort uitkomsten zal heel moeilijk worden, automatisch aan de hand van leidende of achterblijvende indicatoren en kan beter na het evenement of handmatig worden verhandeld. De kansen op valse of tegenstrijdige signalen zijn altijd groter tijdens grote evenementen, en een handmatige fundamentele aanpak in plaats van een technische kan meer winstgevend zijn.

Er is niets mis met het pauzeren van je robot omdat je een crisis verwacht. Het kan je verlies besparen, aan de andere kant kan het ervoor zorgen dat je een enorme overwinning misloopt. In mijn ervaring zijn de kansen op winst veel kleiner, vanwege de enorme onzekerheid en de waarschijnlijkheid van margestorting of het raken van uw stopverlies voordat de transactie kan voortschrijden vanwege extreme tijdelijke spikes..

conclusies

We hebben enkele basisprincipes vastgelegd voor het schrijven van een handelsalgoritme en veel nieuwe ideeën geïntroduceerd. Van het doorlopen van de code, ik hoop dat je nu de interne werking van een algoritme in MQL4 kunt zien, en kunt zien hoe een technische indicator zoals het voortschrijdend gemiddelde wordt gebruikt voor het genereren van een in- en uitgangssignaal. 

Op het gebied van geldbeheer hebben we de mogelijkheid overwogen om break-even condities en dynamische loten te hanteren om een ​​vijfde van het beschikbare eigen vermogen te gebruiken. Voel je vrij om deze delen van de code aan te passen aan je risico's. We hebben de back-testing strategy tester van MT4 besproken en de deuren geopend voor het potentieel van forward testen en zelfs Z-score testen in de toekomst, die allemaal van vitaal belang zijn voordat ze live gaan.

Met meer afstemming en onderzoek, kunt u binnenkort een zeer winstgevende ervaring op de markten hebben. Nu u een goede fundamentele expert-adviseur hebt als basisscript, kunt u beginnen met het schrijven van uw eigen strategieën in de taal MQL4 - en testen of ze echt zo goed werken als u zou moeten, of zoals sommige handelsboeken en mentoren zinspelen op!

In de toekomst zul je zeker je algoritme willen testen voordat je er echt geld mee gaat doen. Als je er eenmaal voldoende vertrouwen in hebt dat je een goed werkend script hebt, wil je misschien ook lid worden van een community om je ideeën verder te brengen en te helpen brainstormen of andere algoritmen uit elkaar te halen om hun werking te zien en hoe je ze zou kunnen opnemen in je strategie. 

Het delen van deskundige adviseurs met andere handelaren is een geweldige manier om samen te werken en te zien hoe anderen hun algoritme schrijven voor de overvloed aan technische indicatoren die er zijn, zoals MACD, RSI, CCI, ADX, Bollinger Bands en Ichimoku ... de lijst gaat maar door.

Misschien dat je in de toekomst, als je zelfverzekerd genoeg bent, je script aan anderen wilt verkopen, in welk geval de MT4-marktplaats of op je eigen site ideale p