Ajuda na codificação - página 390

 

Olá codificadores MT4,

Será que alguém poderia me ajudar? Estou tentando implementar o indicador "Hull moving average 2 strict nmc" em um EA.

O problema que estou enfrentando é que o Indicador é carregado repetidamente no MT4 de acordo com o registro do relatório, além disso, o EA não está abrindo um comércio. Até onde sei, um problema com a chamada do indicador iCustom pode ser a causa principal.

Isto é o que eu tento fazer:

O EA deve ficar LONGO quando o Hull move em média 2 nmc rigoroso é verde e curto quando o Hull move em média 2 nmc rigoroso é vermelho.

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);

Obrigado antecipadamente por sua ajuda.

 
tfi_markets:
Olá codificadores MT4,

Será que alguém poderia me ajudar? Estou tentando implementar o indicador "Hull moving average 2 strict nmc" em um EA.

O problema que estou enfrentando é que o Indicador é carregado repetidamente no MT4 de acordo com o registro do relatório, além disso, o EA não está abrindo um comércio. Até onde sei, um problema com a chamada do indicador iCustom pode ser a causa principal.

Isto é o que eu tento fazer:

O EA deve ficar LONGO quando o Hull move em média 2 nmc rigoroso é verde e curto quando o Hull move em média 2 nmc rigoroso é vermelho.

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);

Obrigado antecipadamente por sua ajuda.

tfi_mercados

Falta-lhe um parâmetro (o primeiro, o parâmetro TimeFrame). Mude a chamada iCustom() para este :

iCustom(Symbol(),0, "Hull moving average 2 strict nmc", "", HMAPeriod, HMAPrice,HMASpeed,0,2,0);

e funcionará bem

 

Olá, Mladen,

muito obrigado por sua ajuda!

Eu implementei sua sugestão, o erro desapareceu, o que é muito bom. Mas a EA, infelizmente, ainda não abriu um negócio. Gostaria que você pudesse rever a lógica da ordem, talvez eu esteja fazendo algo errado aqui?

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);

}

}

 

Alguém poderia me ajudar com o código para calcular o tamanho do lote para diferentes pares, de modo que cada pip lucre 10 unidades de moeda? Por exemplo, se "ProfitPerPip = 10" então o lote para EURUSD seria 1,00

Obrigado.

 
tfi_markets:
Olá, Mladen,

muito obrigado por sua ajuda!

Eu implementei sua sugestão, o erro desapareceu, o que é muito bom. Mas a EA, infelizmente, ainda não abriu um negócio. Gostaria que você pudesse rever a lógica da ordem, talvez eu esteja fazendo algo errado aqui?

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_markets

A maneira mais simples é verificar o buffer de tendências (buffer 3)

Algo parecido com isto :

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

if (trendc == -1) // code for sell

}

 
mladen:
tfi_markets

A maneira mais simples é verificar o buffer de tendências (buffer 3)

Algo parecido com isto :

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

if (trendc == -1) // code for sell

}

Olá, Mladen,

desculpe-me por ter que incomodá-lo novamente, muito obrigado por suas sugestões até agora

Eu a implementei da seguinte forma, mas infelizmente parece não captar corretamente a mudança de tendência,

e está correndo mal na abertura de pedidos de compra, por favor veja a captura de tela em anexo.

Código de abertura de ordens:

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;

}

}

}

}

Obrigado de antemão!

Arquivos anexados:
hma-error.jpg  108 kb
 
tfi_markets:
Olá, Mladen,

desculpe-me por ter que incomodá-lo novamente, muito obrigado por suas sugestões até agora

Eu a implementei da seguinte forma, mas infelizmente parece não captar corretamente a mudança de tendência,

e está correndo mal na abertura de pedidos de compra, por favor veja a captura de tela em anexo.

Código de abertura de ordens:

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;

}

}

}

}

Obrigado de antemão!

Uma pergunta: por que você está fechando ordens de compra quando o sinal de compra chega e ordens de venda quando o sinal de venda chega? Isso não deveria ser invertido? E eu acho que isso evitará que algumas coisas aconteçam agora

 

Pergunta simples sobre Mql5, como podemos ocultar os valores/rótulos indicadores no topo da sub janela ? Em mql4, eu sei que é com "SetIndexLabel(0,NULL)"; mas não consigo encontrá-lo para mt5. Muito obrigado.

 
airquest:
Pergunta simples sobre Mql5, como podemos ocultar os valores/rótulos indicadores no topo da sub janela ? Em mql4, eu sei que é com "SetIndexLabel(0,NULL)"; mas não consigo encontrá-lo para mt5. Muito obrigado.

airquest

Utilização : PlotIndexSetInteger(0,PLOT_SHOW_DATA,false); para isso

 

Olá, Mladen. Anexei um especialista que costumava usar antes da última edição da Metatrader. Agora não funciona.

Qualquer chance de você poder tecer sua varinha mágica sobre ela, e colocá-la funcionando novamente. Se você puder, fico feliz por qualquer um usá-la.... é uma boa idéia (Ou era!)

Arquivos anexados: