MetaTrader4
EA 2 MA Crossing per MetaTrader 4: Guida alla Creazione
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
2021.03.30