MetaTrader 4 - Un esempio di Forex Expert Advisor con MACD. 

I principi dello sviluppo di programmi di trading sono mostrati con un esempio di creazione di un semplice sistema Forex Expert Advisor basato sull'indicatore MACD standard. In questo Forex Expert Advisor, vedremo anche esempi di implementazione di funzioni come l'impostazione dei livelli di profitto con il supporto del trailing stop e il maggior numero di mezzi per garantire un lavoro sicuro. Nel nostro esempio, il trading avviene attraverso l'apertura e la gestione di una singola posizione. Un esempio semplice. Le regole di trading ed il codice dell'Expert. 

Cos'è e come si usa l'indicatore MACD?

Il MACD è l'indicatore del momentum e del trend, quindi puoi utilizzare i diversi segnali forniti da MACD per prevedere l'andamento del mercato. Comprendiamo i diversi segnali generati dall'indicatore MACD.

Gancio MACD

L'hook MACD si verifica quando la linea del segnale tenta di penetrare o penetrare nella linea MACD e gira agli ultimi movimenti. In parole semplici, quando la linea del segnale e la linea MACD si toccano ma non si incrociano, si verifica l'hook.

Il gancio identifica le mosse controcorrente all'interno della tendenza di mercato. Acquistare sul pullback in un trend rialzista e vendere pullback in un trend MACD ribassista diventerà utile per i trader. Hook aiuta gli operatori a identificare le potenziali configurazioni commerciali. Quindi può essere utile conformarsi alle impostazioni.

Per aprire una posizione, attendere che si verifichi l'hook per la conferma che si è effettivamente verificato un cambiamento di tendenza.

 

Forex Expert Advisor MACD

Regole di trading:

 

  • Inserimento lungo (ACQUISTA) - L'indicatore MACD è inferiore a zero, va verso l'alto ed è attraversato dalla linea del segnale che scende.
    Expert Advisor MACD compro.

  • Immissione breve (VENDITA) - L'indicatore MACD è sopra lo zero, va verso il basso ed è attraversato dalla linea del segnale che sale.
    Expert advisor su MACD, vendita.

  • Uscita lunga : eseguendo il limite di take profit, eseguendo il trailing stop o quando MACD attraversa la sua Signal Line (MACD è sopra lo zero, scende verso il basso ed è attraversata dalla Signal Line che sale).

  • Uscita breve : eseguendo il limite di take profit, eseguendo il trailing stop o quando MACD attraversa la sua Signal Line (MACD è inferiore a zero, sale verso l'alto e viene attraversata dalla Signal Line che scende).

 Per poter escludere piccole modifiche senza significato dell'indicatore MACD (piccole oscillazioni sul grafico), introduciamo una misura aggiuntiva di controllo della dimensione delle oscillazioni tracciata come segue: la dimensione dell'indicatore dovrebbe essere almeno 5 unità del prezzo minimo (5 * punti, che per USD / CHF = 0.0005 e per USD / JPY = 0,05).

----------------------------------------------------------------- Codice

// + ----------------------------------------------- ------------------- + 
// | MACD Sample.mq4 | 
// | Copyright © 2005, MetaQuotes Software Corp. | 
// | https://www.metaquotes.net/ | 
// + ----------------------------------------------- ------------------- +
 TakeProfit doppio esterno  = 50 ;
extern double Lots = 0.1 ;
doppio esterno TrailingStop = 30 ;
doppio esterno MACDOpenLevel = 3 ;
doppio esterno MACDCloseLevel =    2 ;
doppio esterno  MATrendPeriod = 26 ;

// + ----------------------------------------------- ------------------- + 
// | | 
// + ----------------------------------------------- ------------------- + 
int start ()
  {
   doppio MacdCurrent, MacdPrevious, SignalCurrent;
   doppio SignalPrevious, MaCurrent, MaPrevious;
   int cnt, ticket, total;
// controlli iniziali dei dati 
// è importante assicurarsi che l'esperto lavori con un normale 
// grafico e l'utente non abbia commesso errori nell'impostare 
// variabili 
esterne (Lotti, StopLoss, TakeProfit, // TrailingStop) nel nostro caso , controlliamo TakeProfit 
// su un grafico inferiore a 100 bar 
   se ( Bar < 100 )
     {
      Stampa ( "barre inferiori a 100" );
      ritorno ( 0 );  
     }
   if (TakeProfit < 10 )
     {
      Stampa ( "TakeProfit meno di 10" );
      ritorno ( 0 );  // controlla TakeProfit
     }
// per semplificare la codifica e accelerare l'accesso 
// i dati vengono inseriti in variabili interne 
   MacdCurrent = iMACD ( NULL , 0 , 12 , 26 , 9 , PRICE_CLOSE , MODE_MAIN, 0 );
   MacdPrevious = iMACD ( NULL , 0 , 12 , 26 , 9 , PRICE_CLOSE , MODE_MAIN, 1 );
   SignalCurrent = iMACD ( NULL , 0 , 12 , 26 , 9 , PRICE_CLOSE , MODE_SIGNAL, 0 );
   SignalPrevious = iMACD ( NULL , 0 , 12 , 26 , 9 , PRICE_CLOSE , MODE_SIGNAL, 1 );
   MaCurrent = iMA ( NULL , 0 , MATrendPeriod, 0 , MODE_EMA , PRICE_CLOSE , 0 );
   MaPrevious = iMA ( NULL , 0 , MATrendPeriod, 0 , MODE_EMA , PRICE_CLOSE , 1 );
   total = OrdersTotal ();
   if (totale < 1 )
     {
      // nessun ordine aperto identificato 
      se (AccountFreeMargin () <( 1000 * Lotti))
        {
         Stampa ( "Non abbiamo soldi. Margine libero =" , AccountFreeMargin ());
         ritorno ( 0 );  
        }
      // verifica la possibilità di posizione lunga (ACQUISTA) 
      se (MacdCurrent < 0 && MacdCurrent> SignalCurrent && MacdPrevious <SignalPrevious &&
          MathAbs (MacdCurrent)> (MACDOpenLevel * Point ) && MaCurrent> MaPrevious)
        {
         ticket = OrderSend ( Symbol (), OP_BUY, Lots, Ask, 3 , 0 , Ask + TakeProfit * Point , "macd sample" , 16384 , 0 , Green);
         if (ticket> 0 )
           {
            if ( OrderSelect (ticket, SELECT_BY_TICKET, MODE_TRADES)) Stampa ( "ACQUISTA ordine aperto:" , OrderOpenPrice ());
           }
         else  Print ( "Errore durante l'apertura dell'ordine BUY:" , GetLastError ()); 
         ritorno ( 0 );
        }
      // controlla la possibilità di posizione corta (VENDITA) 
      se (MacdCurrent> 0 && MacdCurrent <SignalCurrent && MacdPrevious> SignalPrevious &&
         MacdCurrent> (MACDOpenLevel * Point ) && MaCurrent <MaPrevious)
        {
         ticket = OrderSend ( Symbol (), OP_SELL, Lots, Bid, 3 , 0 , Bid-TakeProfit * Point , "macd sample" , 16384 , 0 , Red);
         if (ticket> 0 )
           {
            if ( OrderSelect (ticket, SELECT_BY_TICKET, MODE_TRADES)) Stampa ( "Ordine SELL aperto:" , OrderOpenPrice ());
           }
         else  Print ( "Errore nell'apertura dell'ordine SELL:" , GetLastError ()); 
         ritorno ( 0 );
        }
      ritorno ( 0 );
     }
   // è importante entrare nel mercato correttamente, 
   // ma è più importante uscire correttamente ...    
   per (cnt = 0 ; cnt <totale; cnt ++)
     {
      OrderSelect (cnt, SELECT_BY_POS, MODE_TRADES);
      if (OrderType () <= OP_SELL &&    // controlla la posizione aperta 
         OrderSymbol () == Symbol ())   // controlla il simbolo
        {
         se (OrderType () == OP_BUY)    // la posizione lunga è aperta
           {
            // dovrebbe essere chiuso? 
            if (MacdCurrent> 0 && MacdCurrent <SignalCurrent && MacdPrevious> SignalPrevious &&
               MacdCurrent> (MACDCloseLevel * Point ))
                {
                 OrderClose (OrderTicket (), OrderLots (), Bid, 3 , Violet); // chiudi 
                 ritorno posizione ( 0 ); // Uscita
                }
            // verifica la fine del trailing 
            se (TrailingStop> 0 )  
              {                 
               if (Bid-OrderOpenPrice ()> Point * TrailingStop)
                 {
                  if (OrderStopLoss () <Bid- Point * TrailingStop)
                    {
                     OrderModify (OrderTicket (), OrderOpenPrice (), Bid- Point * TrailingStop, OrderTakeProfit (), 0 , Verde);
                     ritorno ( 0 );
                    }
                 }
              }
           }
         else  // vai in posizione corta
           {
            // dovrebbe essere chiuso? 
            if (MacdCurrent < 0 && MacdCurrent> SignalCurrent &&
               MacdPrevious <SignalPrevious && MathAbs (MacdCurrent)> (MACDCloseLevel * Point ))
              {
               OrderClose (OrderTicket (), OrderLots (), Ask, 3 , Violet); // chiudi 
               ritorno posizione ( 0 ); // Uscita
              }
            // verifica la fine del trailing 
            se (TrailingStop> 0 )  
              {                 
               if ((OrderOpenPrice () - Ask)> ( Point * TrailingStop))
                 {
                  if ((OrderStopLoss ()> (Ask + Point * TrailingStop)) || (OrderStopLoss () == 0 ))
                    {
                     OrderModify (OrderTicket (), OrderOpenPrice (), Ask + Point * TrailingStop, OrderTakeProfit (), 0 , Rosso);
                     ritorno ( 0 );
                    }
                 }
              }
           }
        }
     }
   ritorno ( 0 );
  }
// la fine.

---------------------------------------------------------------------------------------