![MQL5 - Linguaggio delle strategie di trading integrato nel client terminal MetaTrader 5](https://c.mql5.com/i/registerlandings/logo-2.png)
Ti stai perdendo delle opportunità di trading:
- App di trading gratuite
- Oltre 8.000 segnali per il copy trading
- Notizie economiche per esplorare i mercati finanziari
Registrazione
Accedi
Accetti la politica del sito e le condizioni d’uso
Se non hai un account, registrati
Ciao codificatori MT4,
Mi chiedo se qualcuno può aiutarmi. Sto cercando di implementare l'indicatore "Hull moving average 2 strict nmc" in un EA.
Il problema che sto affrontando è che l'indicatore viene caricato più e più volte in MT4 secondo il report log, inoltre l'EA non apre un trade. Per quanto ne so, un problema con la chiamata dell'indicatore iCustom potrebbe essere la causa principale.
Questo è quello che cerco di fare:
L'EA dovrebbe andare LONG quando la media mobile Hull 2 strict nmc è verde e short quando la media mobile Hull 2 strict nmc è rossa.
extern int HMAPeriod = 35;
extern int HMAPrice = 0; // PRICE_CLOSE
extern double HMASpeed = 2;
[/CODE]
[CODE]
// Forex TSD Hull Moving Average
double hma0 = iCustom(Symbol(), 0, "Hull moving average 2 strict nmc", HMAPeriod, HMAPrice, HMASpeed, 0, 2, 0);
double hma1 = iCustom(Symbol(), 0, "Hull moving average 2 strict nmc", HMAPeriod, HMAPrice, HMASpeed, 0, 2, 1);
double hma2 = iCustom(Symbol(), 0, "Hull moving average 2 strict nmc", HMAPeriod, HMAPrice, HMASpeed, 0, 2, 2);
Buy = (hma0 > hma1 && hma1 > hma2);
Sell = (hma0 < hma1 && hma1 < hma2);
Grazie in anticipo per il vostro aiuto.
Ciao codificatori MT4,
Mi chiedo se qualcuno può aiutarmi. Sto cercando di implementare l'indicatore "Hull moving average 2 strict nmc" in un EA.
Il problema che sto affrontando è che l'indicatore viene caricato più e più volte in MT4 secondo il report log, inoltre l'EA non apre un trade. Per quanto ne so, un problema con la chiamata dell'indicatore iCustom potrebbe essere la causa principale.
Questo è quello che cerco di fare:
L'EA dovrebbe andare LONG quando la media mobile Hull 2 strict nmc è verde e short quando la media mobile Hull 2 strict nmc è rossa.
extern int HMAPeriod = 35;
extern int HMAPrice = 0; // PRICE_CLOSE
extern double HMASpeed = 2;
[/CODE]
[CODE]
// Forex TSD Hull Moving Average
double hma0 = iCustom(Symbol(), 0, "Hull moving average 2 strict nmc", HMAPeriod, HMAPrice, HMASpeed, 0, 2, 0);
double hma1 = iCustom(Symbol(), 0, "Hull moving average 2 strict nmc", HMAPeriod, HMAPrice, HMASpeed, 0, 2, 1);
double hma2 = iCustom(Symbol(), 0, "Hull moving average 2 strict nmc", HMAPeriod, HMAPrice, HMASpeed, 0, 2, 2);
Buy = (hma0 > hma1 && hma1 > hma2);
Sell = (hma0 < hma1 && hma1 < hma2);
tfi_mercati
Ti manca un parametro (il primo, il parametro TimeFrame). Cambia la chiamata iCustom() in questa:
iCustom(Symbol(),0, "Hull moving average 2 strict nmc", "", HMAPeriod, HMAPrice,HMASpeed,0,2,0);
e funzionerà bene
Ciao Mladen
grazie mille per il tuo aiuto!
Ho implementato il tuo suggerimento, l'errore è sparito, il che è molto buono. Ma l'EA purtroppo non apre ancora un trade. Ti sarei grato se potessi rivedere la logica dell'ordine, forse sto facendo qualcosa di sbagliato qui?
int Extra_Pips=1;
extern int HMA_Period=21;
extern int HMA_Price=PRICE_CLOSE; //0
extern double HMA_Speed= 2;
//+------------------------------------------------------------------+
//| ORDER Logic / Indicators |
//+------------------------------------------------------------------+
if(openedOrders<=0)
{
// Forex TSD Hull Moving Average
double hma0 = iCustom(Symbol(),0,"Hull moving average 2 strict nmc", "", HMA_Period, HMA_Price, HMA_Speed,0,2,0);
double hma1 = iCustom(Symbol(),0,"Hull moving average 2 strict nmc", "", HMA_Period, HMA_Price, HMA_Speed,0,2,1);
double hma2 = iCustom(Symbol(),0,"Hull moving average 2 strict nmc", "", HMA_Period, HMA_Price, HMA_Speed,0,2,2);
//+------------------------------------------------------------------+
//| BUY |
//+------------------------------------------------------------------+
if(hma0>hma1 && hma1>hma2)
{
// Wait some pips
double pipsExtra1=Extra_Pips*Point; // Get distance from cross signal
OpenBuy();
return(0);
}
//+------------------------------------------------------------------+
//| SELL |
//+------------------------------------------------------------------+
if(hma0<hma1 && hma1<hma2)
{
// Wait some pips
double pipsExtra2=Extra_Pips*Point; // Get distance from cross signal
OpenSell();
return(0);
}
}
Qualcuno potrebbe aiutarmi con il codice per calcolare la dimensione del lotto per diverse coppie in modo che ogni profitto pip sia di 10 unità di valuta? Per esempio se "ProfitPerPip = 10" allora il lotto per EURUSD sarebbe 1.00
Grazie.
Ciao Mladen,
grazie mille per il tuo aiuto!
Ho implementato il tuo suggerimento, l'errore è sparito, il che è molto buono. Ma l'EA purtroppo non apre ancora un trade. Ti sarei grato se potessi rivedere la logica dell'ordine, forse sto facendo qualcosa di sbagliato qui?
int Extra_Pips=1;
extern int HMA_Period=21;
extern int HMA_Price=PRICE_CLOSE; //0
extern double HMA_Speed= 2;
//+------------------------------------------------------------------+
//| ORDER Logic / Indicators |
//+------------------------------------------------------------------+
if(openedOrders<=0)
{
// Forex TSD Hull Moving Average
double hma0 = iCustom(Symbol(),0,"Hull moving average 2 strict nmc", "", HMA_Period, HMA_Price,HMA_Speed,0,2,0);
double hma1 = iCustom(Symbol(),0,"Hull moving average 2 strict nmc", "", HMA_Period, HMA_Price, HMA_Speed,0,2,1);
double hma2 = iCustom(Symbol(),0,"Hull moving average 2 strict nmc", "", HMA_Period, HMA_Price, HMA_Speed,0,2,2);
//+------------------------------------------------------------------+
//| BUY |
//+------------------------------------------------------------------+
if(hma0>hma1 && hma1>hma2)
{
// Wait some pips
double pipsExtra1=Extra_Pips*Point; // Get distance from cross signal
OpenBuy();
return(0);
}
//+------------------------------------------------------------------+
//| SELL |
//+------------------------------------------------------------------+
if(hma0<hma1 && hma1<hma2)
{
// Wait some pips
double pipsExtra2=Extra_Pips*Point; // Get distance from cross signal
OpenSell();
return(0);
}
}
tfi_mercati
Il modo più semplice è controllare il trend buffer (buffer 3)
Qualcosa del genere:
double trendp = iCustom(Symbol(),0,"Hull moving average 2 strict nmc", "", HMA_Period, HMA_Price, HMA_Speed,0,3,2);
if (trendc!=trendp)
{
if (trendc == 1) // code for buy
if (trendc == -1) // code for sell
}
tfi_mercati
Il modo più semplice è controllare il buffer di tendenza (buffer 3)
Qualcosa del genere:
double trendp = iCustom(Symbol(),0,"Hull moving average 2 strict nmc", "", HMA_Period, HMA_Price, HMA_Speed,0,3,2);
if (trendc!=trendp)
{
if (trendc == 1) // code for buy
if (trendc == -1) // code for sell
}
Ciao Mladen,
scusa se ti disturbo di nuovo, ti ringrazio molto per i tuoi suggerimenti fino ad ora
L'ho implementato come segue, ma purtroppo sembra non catturare correttamente il cambiamento di tendenza,
e si scatena nell'apertura degli ordini di acquisto, vedi lo screenshot allegato.![](https://c.mql5.com/forextsd/smiles/embaressed_smile.png)
Codice per gli ordini di apertura:
if(openedOrders<=0)
{
// Forex TSD Hull Moving Average
double trendc = iCustom(Symbol(),0,"Hull moving average 2 strict nmc", "", HMA_Period, HMA_Price, HMA_Speed,0,3,1);
double trendp = iCustom(Symbol(),0,"Hull moving average 2 strict nmc", "", HMA_Period, HMA_Price, HMA_Speed,0,3,2);
if(trendc!=trendp)
{
if(trendc==1) // code for buy
OpenBuy();
return(0);
}
if(trendc==-1) // code for sell
{
OpenSell();
return(0);
}
}
//+------------------------------------------------------------------+
//| Open Buy |
//+------------------------------------------------------------------+
void OpenBuy()
{
double lbStop = 0; if(lStopLoss>0) lbStop = NormalizeDouble(MarketInfo(s_symbol,MODE_ASK)-lStopLoss *pPoint*pipMultiplier,digit);
double lbTake = 0; if(lTakeProfit>0) lbTake = NormalizeDouble(MarketInfo(s_symbol,MODE_ASK)+lTakeProfit*pPoint*pipMultiplier,digit);
if(AccountFreeMargin()<(100*Lots)) { Print("We have no money. Free Margin = ",AccountFreeMargin()); return; }
//
//
//
if(!EcnBroker)
dummyResult=OrderSend(s_symbol,OP_BUY,LotsOptimized(),MarketInfo(s_symbol,MODE_ASK),Slippage*pipMultiplier,lbStop,lbTake,ExpertName,MAGIC,0,clOpenBuy);
else
{
int buyTicket= OrderSend(s_symbol,OP_BUY,LotsOptimized(),MarketInfo(s_symbol,MODE_ASK),Slippage*pipMultiplier,0,0,ExpertName,MAGIC,0,clOpenBuy);
if(buyTicket>= 0)
bool buyOrderMod=OrderModify(buyTicket,OrderOpenPrice(),lbStop,lbTake,0,CLR_NONE);
if(buyOrderMod==false)
{
int ErrorCode = GetLastError();
string ErrDesc = ErrorDescription(ErrorCode);
string ErrAlert=StringConcatenate("Modify Buy Order - Error ",ErrorCode,": ",ErrDesc);
if(ShowAlerts==true) Alert(ErrAlert);
string ErrLog=StringConcatenate("Ask: ",MarketInfo(s_symbol,MODE_ASK)," Bid: ",MarketInfo(s_symbol,MODE_BID)," Ticket: ",buyTicket," Stop: ",lbStop," Profit: ",lbTake);
Print(ErrLog);
}
}
}
//+------------------------------------------------------------------+
//| Open Sell |
//+------------------------------------------------------------------+
void OpenSell()
{
double lsStop = 0; if(sStopLoss>0) lsStop = NormalizeDouble(MarketInfo(s_symbol,MODE_BID)+sStopLoss *pPoint*pipMultiplier,digit);
double lsTake = 0; if(sTakeProfit>0) lsTake = NormalizeDouble(MarketInfo(s_symbol,MODE_BID)-sTakeProfit*pPoint*pipMultiplier,digit);
if(AccountFreeMargin()<(100*Lots)) { Print("We have no money. Free Margin = ",AccountFreeMargin()); return; }
//+------------------------------------------------------------------+
//| ECN Broker |
//+------------------------------------------------------------------+
if(!EcnBroker)
dummyResult=OrderSend(s_symbol,OP_SELL,LotsOptimized(),MarketInfo(s_symbol,MODE_BID),Slippage*pipMultiplier,lsStop,lsTake,ExpertName,MAGIC,0,clOpenSell);
else
{
int sellTicket = OrderSend(s_symbol,OP_SELL,LotsOptimized(),MarketInfo(s_symbol,MODE_BID),Slippage*pipMultiplier,0,0,ExpertName,MAGIC,0,clOpenSell);
if(sellTicket >= 0)
bool sellOrderMod=OrderModify(sellTicket,OrderOpenPrice(),lsStop,lsTake,0,CLR_NONE);
if(sellOrderMod==false)
{
int ErrorCode = GetLastError();
string ErrDesc = ErrorDescription(ErrorCode);
string ErrAlert=StringConcatenate("Modify Sell Order - Error ",ErrorCode,": ",ErrDesc);
if(ShowAlerts==true) Alert(ErrAlert);
string ErrLog=StringConcatenate("Ask: ",MarketInfo(s_symbol,MODE_ASK)," Bid: ",MarketInfo(s_symbol,MODE_BID)," Ticket: ",sellTicket," Stop: ",lsStop," Profit: ",lsTake);
Print(ErrLog);
}
}
}
[/CODE]
Code for closing orders:
[CODE]
void CheckForClose()
{
RefreshRates();
double trendc_c = iCustom(Symbol(),0,"Hull moving average 2 strict nmc", "", HMA_Period, HMA_Price, HMA_Speed,0,3,1);
double trendp_c = iCustom(Symbol(),0,"Hull moving average 2 strict nmc", "", HMA_Period, HMA_Price, HMA_Speed,0,3,2);
for(int i=0;i<OrdersTotal(); i++)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break;
if(OrderMagicNumber()!= MAGIC) continue;
if(OrderSymbol() != s_symbol) continue;
if(trendc_c!=trendp_c) // Check Trend
{
if(OrderType()==OP_BUY)
{
if(trendc_c==1) //is BUY?
{
bool buyClose=OrderClose(OrderTicket(),OrderLots(),MarketInfo(s_symbol,MODE_BID),Slippage*pipMultiplier,clCloseBuy);
if(buyClose==false)
{
int ErrorCode = GetLastError();
string ErrDesc = ErrorDescription(ErrorCode);
string ErrAlert= StringConcatenate("Close Buy Order - Error ",ErrorCode,": ",ErrDesc);
if(ShowAlerts == true) Alert(ErrAlert);
string ErrLog=StringConcatenate("Bid: ",MarketInfo(s_symbol,MODE_BID)," Lots: ",OrderLots()," Ticket: ",OrderTicket());
Print(ErrLog);
}
}
break;
}
}
if(trendc_c!=trendp_c) // Check trend
{
if(OrderType()==OP_SELL)
{
if(trendc_c==-1) // is SELL?
{
bool sellClose= OrderClose(OrderTicket(),OrderLots(),MarketInfo(s_symbol,MODE_ASK),Slippage*pipMultiplier,clCloseSell);
if(sellClose == false)
{
ErrorCode = GetLastError();
ErrDesc = ErrorDescription(ErrorCode);
ErrAlert=StringConcatenate("Close Sell Order - Error ",ErrorCode,": ",ErrDesc);
if(ShowAlerts==true) Alert(ErrAlert);
ErrLog=StringConcatenate("Ask: ",MarketInfo(s_symbol,MODE_ASK)," Lots: ",OrderLots()," Ticket: ",OrderTicket());
Print(ErrLog);
}
}
break;
}
}
}
}
Grazie in anticipo!
Ciao Mladen,
mi dispiace dovervi disturbare di nuovo, grazie mille per i vostri suggerimenti fino ad ora
L'ho implementato come segue, ma purtroppo sembra che non catturi correttamente il cambio di tendenza,
e sta correndo all'impazzata nell'aprire gli ordini di acquisto, si prega di vedere lo screenshot allegato.![](https://c.mql5.com/forextsd/smiles/embaressed_smile.png)
Codice per gli ordini di apertura:
if(openedOrders<=0)
{
// Forex TSD Hull Moving Average
double trendc = iCustom(Symbol(),0,"Hull moving average 2 strict nmc", "", HMA_Period, HMA_Price, HMA_Speed,0,3,1);
double trendp = iCustom(Symbol(),0,"Hull moving average 2 strict nmc", "", HMA_Period, HMA_Price, HMA_Speed,0,3,2);
if(trendc!=trendp)
{
if(trendc==1) // code for buy
OpenBuy();
return(0);
}
if(trendc==-1) // code for sell
{
OpenSell();
return(0);
}
}
//+------------------------------------------------------------------+
//| Open Buy |
//+------------------------------------------------------------------+
void OpenBuy()
{
double lbStop = 0; if(lStopLoss>0) lbStop = NormalizeDouble(MarketInfo(s_symbol,MODE_ASK)-lStopLoss *pPoint*pipMultiplier,digit);
double lbTake = 0; if(lTakeProfit>0) lbTake = NormalizeDouble(MarketInfo(s_symbol,MODE_ASK)+lTakeProfit*pPoint*pipMultiplier,digit);
if(AccountFreeMargin()<(100*Lots)) { Print("We have no money. Free Margin = ",AccountFreeMargin()); return; }
//
//
//
if(!EcnBroker)
dummyResult=OrderSend(s_symbol,OP_BUY,LotsOptimized(),MarketInfo(s_symbol,MODE_ASK),Slippage*pipMultiplier,lbStop,lbTake,ExpertName,MAGIC,0,clOpenBuy);
else
{
int buyTicket= OrderSend(s_symbol,OP_BUY,LotsOptimized(),MarketInfo(s_symbol,MODE_ASK),Slippage*pipMultiplier,0,0,ExpertName,MAGIC,0,clOpenBuy);
if(buyTicket>= 0)
bool buyOrderMod=OrderModify(buyTicket,OrderOpenPrice(),lbStop,lbTake,0,CLR_NONE);
if(buyOrderMod==false)
{
int ErrorCode = GetLastError();
string ErrDesc = ErrorDescription(ErrorCode);
string ErrAlert=StringConcatenate("Modify Buy Order - Error ",ErrorCode,": ",ErrDesc);
if(ShowAlerts==true) Alert(ErrAlert);
string ErrLog=StringConcatenate("Ask: ",MarketInfo(s_symbol,MODE_ASK)," Bid: ",MarketInfo(s_symbol,MODE_BID)," Ticket: ",buyTicket," Stop: ",lbStop," Profit: ",lbTake);
Print(ErrLog);
}
}
}
//+------------------------------------------------------------------+
//| Open Sell |
//+------------------------------------------------------------------+
void OpenSell()
{
double lsStop = 0; if(sStopLoss>0) lsStop = NormalizeDouble(MarketInfo(s_symbol,MODE_BID)+sStopLoss *pPoint*pipMultiplier,digit);
double lsTake = 0; if(sTakeProfit>0) lsTake = NormalizeDouble(MarketInfo(s_symbol,MODE_BID)-sTakeProfit*pPoint*pipMultiplier,digit);
if(AccountFreeMargin()<(100*Lots)) { Print("We have no money. Free Margin = ",AccountFreeMargin()); return; }
//+------------------------------------------------------------------+
//| ECN Broker |
//+------------------------------------------------------------------+
if(!EcnBroker)
dummyResult=OrderSend(s_symbol,OP_SELL,LotsOptimized(),MarketInfo(s_symbol,MODE_BID),Slippage*pipMultiplier,lsStop,lsTake,ExpertName,MAGIC,0,clOpenSell);
else
{
int sellTicket = OrderSend(s_symbol,OP_SELL,LotsOptimized(),MarketInfo(s_symbol,MODE_BID),Slippage*pipMultiplier,0,0,ExpertName,MAGIC,0,clOpenSell);
if(sellTicket >= 0)
bool sellOrderMod=OrderModify(sellTicket,OrderOpenPrice(),lsStop,lsTake,0,CLR_NONE);
if(sellOrderMod==false)
{
int ErrorCode = GetLastError();
string ErrDesc = ErrorDescription(ErrorCode);
string ErrAlert=StringConcatenate("Modify Sell Order - Error ",ErrorCode,": ",ErrDesc);
if(ShowAlerts==true) Alert(ErrAlert);
string ErrLog=StringConcatenate("Ask: ",MarketInfo(s_symbol,MODE_ASK)," Bid: ",MarketInfo(s_symbol,MODE_BID)," Ticket: ",sellTicket," Stop: ",lsStop," Profit: ",lsTake);
Print(ErrLog);
}
}
}
[/CODE]
Code for closing orders:
[CODE]
void CheckForClose()
{
RefreshRates();
double trendc_c = iCustom(Symbol(),0,"Hull moving average 2 strict nmc", "", HMA_Period, HMA_Price, HMA_Speed,0,3,1);
double trendp_c = iCustom(Symbol(),0,"Hull moving average 2 strict nmc", "", HMA_Period, HMA_Price, HMA_Speed,0,3,2);
for(int i=0;i<OrdersTotal(); i++)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break;
if(OrderMagicNumber()!= MAGIC) continue;
if(OrderSymbol() != s_symbol) continue;
if(trendc_c!=trendp_c) // Check Trend
{
if(OrderType()==OP_BUY)
{
if(trendc_c==1) //is BUY?
{
bool buyClose=OrderClose(OrderTicket(),OrderLots(),MarketInfo(s_symbol,MODE_BID),Slippage*pipMultiplier,clCloseBuy);
if(buyClose==false)
{
int ErrorCode = GetLastError();
string ErrDesc = ErrorDescription(ErrorCode);
string ErrAlert= StringConcatenate("Close Buy Order - Error ",ErrorCode,": ",ErrDesc);
if(ShowAlerts == true) Alert(ErrAlert);
string ErrLog=StringConcatenate("Bid: ",MarketInfo(s_symbol,MODE_BID)," Lots: ",OrderLots()," Ticket: ",OrderTicket());
Print(ErrLog);
}
}
break;
}
}
if(trendc_c!=trendp_c) // Check trend
{
if(OrderType()==OP_SELL)
{
if(trendc_c==-1) // is SELL?
{
bool sellClose= OrderClose(OrderTicket(),OrderLots(),MarketInfo(s_symbol,MODE_ASK),Slippage*pipMultiplier,clCloseSell);
if(sellClose == false)
{
ErrorCode = GetLastError();
ErrDesc = ErrorDescription(ErrorCode);
ErrAlert=StringConcatenate("Close Sell Order - Error ",ErrorCode,": ",ErrDesc);
if(ShowAlerts==true) Alert(ErrAlert);
ErrLog=StringConcatenate("Ask: ",MarketInfo(s_symbol,MODE_ASK)," Lots: ",OrderLots()," Ticket: ",OrderTicket());
Print(ErrLog);
}
}
break;
}
}
}
}
Grazie in anticipo!
Una domanda: perché chiudi gli ordini di acquisto quando arriva il segnale di acquisto e gli ordini di vendita quando arriva il segnale di vendita? Non dovrebbe essere invertito? E penso che questo impedirà che alcune cose accadano ora
Semplice domanda su Mql5, come possiamo nascondere i valori/etichette dell'indicatore in cima alla sottofinestra? In mql4, so che è con "SetIndexLabel(0,NULL);", ma non riesco a trovarlo per mt5. Grazie mille.
Semplice domanda su Mql5, come possiamo nascondere i valori/etichette dell'indicatore in cima alla sottofinestra? In mql4, so che è con "SetIndexLabel(0,NULL);", ma non riesco a trovarlo per mt5. Grazie mille.
airquest
Usa : PlotIndexSetInteger(0,PLOT_SHOW_DATA,false); per questo
Ciao Mladen. Ho allegato un esperto che usavo prima dell'ultimo numero di Metatrader. Ora non funziona.
C'è qualche possibilità che tu possa tessere la tua bacchetta magica su di esso, e farlo funzionare di nuovo. Se puoi, sono felice che chiunque lo usi .... è un buon esperto (o lo era!)