Home Systeemhandel Bericht

2 MA Crossing - Een Expert voor MetaTrader 4

Bijlage
34176.zip (2.06 KB, Downloaden 3 keer)

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

    Reactie (0)