MetaTrader4
2 MA Crossing - Een Expert voor MetaTrader 4
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
2021.03.30