In dit artikel gaan we aan de slag met het creëren van een Expert Advisor (EA) door eerst de invoerparameters te definiëren.
//--- invoerparameters input int period_ma_fast = 8; // Periode Snelle MA input int period_ma_slow = 20; // Periode Langzame MA input double takeProfit = 20.0; // Take Profit (pips) input double stopLoss = 20.0; // Stop Loss (pips) input double lotSize = 0.10; // Lotgrootte input double minEquity = 100.0; // Min. Eigenvermogen (€) input int Slippage = 3; // Slippage input int MagicNumber = 889; // Magic Number
Vervolgens definiëren we globale variabelen. Deze variabelen zijn toegankelijk voor alle functies.
// Globale variabelen double myPoint = 0.0; int mySlippage = 0; int BuyTicket = 0; int SellTicket = 0;
Wanneer de EA wordt uitgevoerd, is de eerste functie die wordt aangeroepen OnInit(). Deze functie gebruiken we vaak om globale variabelen te valideren en te initialiseren.
int OnInit() { // Validatie van invoer, altijd doen bij initialisatie van invoergegevens if (period_ma_fast >= period_ma_slow || takeProfit < 0.0 || stopLoss < 0.0 || lotSize < 0.01 || minEquity < 10) { Alert("WAARSCHUWING - Invoergegevens zijn ongeldig"); return (INIT_PARAMETERS_INCORRECT); } double min_volume=SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_MIN); if(lotSize<min_volume) { string message =StringFormat("Volume is kleiner dan de toegestane limiet van %.2f",min_volume); Alert (message); return(INIT_PARAMETERS_INCORRECT); } myPoint = GetPipPoint(Symbol()); mySlippage = GetSlippage(Symbol(),Slippage); return(INIT_SUCCEEDED); }
Wanneer de marktprijs beweegt (tick), wordt de functie OnTick() aangeroepen en worden alle instructies in deze functie uitgevoerd.
In de OnTick() functie worden verschillende andere functies aangeroepen.
We starten met het aanroepen van de functie checkMinEquity() om de toereikendheid van het handelsvermogen te controleren. Als het eigen vermogen voldoende is (boven het minimum), volgt de verklaring van de signaalvariabele en wordt de functie NewCandle() aangeroepen om aan te geven wanneer er een nieuwe candle is gevormd.
De functie getSignal() leest de waarden op beide voortschrijdende gemiddelden en retourneert signaalinformatie of er een opwaartse of neerwaartse kruising plaatsvindt als signaal voor een koop- of verkoopmoment.
Op basis van deze signaalinformatie wordt het doorgestuurd naar de functie transaction() om open koop- of verkoopposities in te stellen.
Daarna wordt de functie setTPSL() aangeroepen, die de take profit en stop loss-prijzen instelt.
Als het eigen vermogen niet voldoet aan de minimumvereiste, verschijnt er een waarschuwing en wordt deze EA beëindigd.
void OnTick() { if (cekMinEquity()) { int signal = -1; bool isNewCandle = NewCandle(Period(), Symbol()); signal = getSignal(isNewCandle); transaction(isNewCandle, signal); setTPSL(); }else { // Stop met handelen, omdat het eigen vermogen niet voldoende is Print("EA wordt stopgezet omdat het eigen vermogen niet voldoende is"); } }
De functie setTPSL() instellen:
void setTPSL() { int tOrder = 0; string strMN = "", pair = ""; double sl = 0.0, tp = 0.0; pair = Symbol(); tOrder = OrdersTotal(); for (int i=tOrder-1; i>=0; i--) { bool hrsSelect = OrderSelect(i, SELECT_BY_POS, MODE_TRADES); strMN = IntegerToString(OrderMagicNumber()); if (StringFind(strMN, IntegerToString(MagicNumber), 0) == 0 && StringFind(OrderSymbol(), pair, 0) == 0) { if (OrderType() == OP_BUY && (OrderTakeProfit() == 0 || OrderStopLoss() ==0)) { if (takeProfit > 0) { tp = OrderOpenPrice() + (takeProfit * myPoint); }else { tp = OrderOpenPrice(); } if (stopLoss > 0) { sl = OrderOpenPrice() - (stopLoss * myPoint); }else { sl = OrderStopLoss(); } if (OrderTakeProfit() != tp || OrderStopLoss() != sl) { if(OrderModify(OrderTicket(), OrderOpenPrice(), sl, tp, 0, clrBlue)) { Print ("Orderwijziging Succesvol"); } } } if (OrderType() == OP_SELL && (OrderTakeProfit() == 0 || OrderStopLoss() == 0)) { if (takeProfit > 0) { tp = OrderOpenPrice() - (takeProfit * myPoint); }else { tp = OrderOpenPrice(); } if (stopLoss > 0) { sl = OrderOpenPrice() + (stopLoss * myPoint); }else { sl = OrderStopLoss(); } if (OrderTakeProfit() != tp || OrderStopLoss() != sl) { if (OrderModify(OrderTicket(), OrderOpenPrice(), sl, tp, 0, clrRed)) { Print ("Orderwijziging Succesvol"); } } } } // einde van if magic number && paar } // einde van for }
Voor educatie en delen in het Nederlands, sluit je aan bij onze Telegramgroep t.me/codeMQL.
Als je op zoek bent naar een app ter ondersteuning van je trading, download dan onze SignalForex-app in de Play Store.
https://play.google.com/store/apps/details?id=com.autobotfx.signalforex
Gerelateerde berichten
- MQL5 Wizard: Creëer Handelsstrategieën met Bullish en Bearish Engulfing Candlestick Patronen en Stochastic
- MQL5 Wizard: Handelsignalen Geïnspireerd Door Morning/Evening Stars + MFI voor MetaTrader 5
- MQL5 Wizard: Handelsignalen Geïnspireerd door Morning/Evening Stars en RSI voor MetaTrader 5
- Efficiënt Trendvolgend Handelsysteem met Exp_X2MA_JFatl voor MetaTrader 5
- Close Cross MA: Efficiënt Orders Sluiten met MetaTrader 4