Home Trading Sistematico Post

EA 2 MA Crossing per MetaTrader 4: Guida alla Creazione

Allegato
34176.zip (2.06 KB, Scarica 2 volte)

In questo articolo, vedremo come creare un Expert Advisor (EA) utilizzando la strategia delle medie mobili (MA) incrociate. Iniziamo definendo le variabili di input.

//--- parametri di input
input    int      periodo_ma_veloce = 8  //Periodo della MA Veloce
input    int      periodo_ma_lenta = 20; //Periodo della MA Lenta

input    double   takeProfit  = 20.0;  //Take Profit (pips)
input    double   stopLoss    = 20.0  //Stop Loss (pips)

input    double   dimensioneLotto     = 0.10;  //Dimensione Lotto
input    double   equityMinima   = 100.0;//Equity Minima ($)

input    int slippage = 3       //Slippage
input    int numeroMagico = 889  //Numero Magico


Successivamente, definiamo le variabili globali. Le variabili con questo ambito globale saranno accessibili a tutte le funzioni.

//Variabili Globali
double   mioPunto    = 0.0;
int      mySlippage = 0;
int      TicketAcquisto   = 0;
int      TicketVendita  = 0;


Quando l'EA viene eseguito, la prima funzione che viene chiamata è OnInit(). È importante utilizzare questa funzione per convalidare e inizializzare le variabili globali che utilizzeremo.

int OnInit()
{
   //validazione input, è sempre consigliato validare l'inizializzazione dei dati di input
   if (periodo_ma_veloce >= periodo_ma_lenta || takeProfit < 0.0 || stopLoss < 0.0 || dimensioneLotto < 0.01 || equityMinima < 10) {
      Alert("ATTENZIONE - I dati di input non sono validi");
      return (INIT_PARAMETERS_INCORRECT);
   }
   
   double volume_minimo=SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_MIN);
   if(dimensioneLotto<volume_minimo) {
      string messaggio =StringFormat("Il volume è inferiore al limite consentito di %.2f",volume_minimo);
      Alert (messaggio);
      return(INIT_PARAMETERS_INCORRECT);
   }
   
   mioPunto = GetPipPoint(Symbol());
   mySlippage = GetSlippage(Symbol(),slippage);

   return(INIT_SUCCEEDED);
}


Quando il prezzo di mercato si muove (tick), la funzione OnTick() verrà chiamata ed eseguirà tutte le istruzioni/funzioni contenute nel blocco di questa funzione.

All'interno della funzione OnTick() verranno chiamate varie altre funzioni.

Iniziamo chiamando la funzione checkMinEquity() per controllare la sufficienza dell'equity. Se i fondi di equity sono sufficienti (superando l'equity minima), seguirà una dichiarazione della variabile segnale e verrà chiamata la funzione NewCandle() che informa quando si forma una nuova candela.

La funzione getSignal() leggerà i valori sui due indicatori delle medie mobili e restituirà informazioni sul segnale se si verifica un incrocio verso l'alto o verso il basso come segnale per un acquisto/vendita.

In base a queste informazioni di segnale, verrà inoltrato alla funzione transaction() per impostare le posizioni di acquisto o vendita aperte.

E continuerà con la chiamata alla funzione setTPSL(), che ha il compito di impostare i prezzi del take profit e dello stop loss.

Se l'equity non soddisfa i requisiti minimi, verrà visualizzato un avviso e questo EA verrà terminato.

void OnTick()
{
   if (cekMinEquity()) {
      
      int segnale = -1;
      bool nuovaCandela = NewCandle(Period(), Symbol());
      
      segnale = getSignal(nuovaCandela);
      transaction(nuovaCandela, segnale);
      setTPSL();
      
      
   }else {
      //Stop trading, perché l'equity non è sufficiente
      Print("L'EA verrà fermata perché l'equity non è sufficiente");
   }
}


Funzione setTPSL()

void setTPSL() {
   int   tOrdine = 0;
   string   strMN = "", coppia = "";
   double sl = 0.0, tp = 0.0;
   
   coppia = Symbol();
   
   tOrdine = OrdersTotal();
   for (int i=tOrdine-1; i>=0; i--) {
      bool hrsSelect = OrderSelect(i, SELECT_BY_POS, MODE_TRADES);
      strMN = IntegerToString(OrderMagicNumber());
      if (StringFind(strMN, IntegerToString(numeroMagico), 0) == 0 && StringFind(OrderSymbol(), coppia, 0) == 0) {
         if (OrderType() == OP_BUY && (OrderTakeProfit() == 0 || OrderStopLoss() == 0)) {
            if (takeProfit > 0) {
               tp = OrderOpenPrice() + (takeProfit * mioPunto);
            }else {
               tp = OrderOpenPrice();
            }
            if (stopLoss > 0) {
               sl = OrderOpenPrice() - (stopLoss * mioPunto);
            }else {
               sl = OrderStopLoss();
            }
            if (OrderTakeProfit() != tp || OrderStopLoss() != sl) {
               if(OrderModify(OrderTicket(), OrderOpenPrice(), sl, tp, 0, clrBlue)) {
                  Print ("Modifica Ordine Riuscita");
               }
            }
         }
         if (OrderType() == OP_SELL && (OrderTakeProfit() == 0 || OrderStopLoss() == 0)) {
            if (takeProfit > 0) {
               tp = OrderOpenPrice() - (takeProfit * mioPunto);
            }else {
               tp = OrderOpenPrice();
            }
            if (stopLoss > 0) {
               sl = OrderOpenPrice() + (stopLoss * mioPunto);
            }else {
               sl = OrderStopLoss();
            }
            if (OrderTakeProfit() != tp || OrderStopLoss() != sl) {
               if (OrderModify(OrderTicket(), OrderOpenPrice(), sl, tp, 0, clrRed)) {
                  Print ("Modifica Ordine Riuscita");
               }
            }
         }
         
       }//fine if numero magico && coppia
      
   }//fine for
}


Per ulteriori informazioni e condivisione, vi invitiamo a unirvi al nostro gruppo Telegram t.me/codeMQL


Se stai cercando un'app per supportare il tuo trading, puoi scaricare la nostra app SignalForex nel Play Store

https://play.google.com/store/apps/details?id=com.autobotfx.signalforex





    Post correlati

    Commento (0)