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
- Dematus: Il Sistema di Trading per MetaTrader 5
- Utilità Market Watch Panel: il tuo alleato in MetaTrader 4
- X-liquidex: Il Miglior EA per Trading di Volatilità e Breakout su MetaTrader 4
- Expert Advisor Basato sulla Teoria della Probabilità per Forex su MetaTrader 5
- MQL5 Wizard: Creare Trading Signals con Morning/Evening Stars e MFI per MetaTrader 5