Prezados, boa tarde!
Por gentileza, poderiam me auxiliar com uma dificuldade que estou tendo para fazer meu EA mover o Stop (StopMóvel)?
Quando o EA tenta realizar a mudança da ordem para "mover" o Stop para outra posição, está retornando o seguinte erro:
2024.04.11 12:36:01.009 HFP XAUUSD,M1: Erro ao Tentar Modificar a Ordem 89557440. Código do Erro: 130
Segue o código que executa esta rotina:
//+-----------------------------------------------------------+
//| Função para verificar e ajustar o stop móvel |
//+-----------------------------------------------------------+
void ChecarStopMovel() {
//Dígitos para o Par de Moedas Atual
int digits = MarketInfo(Symbol(), MODE_DIGITS);
//Ajusta o Momento em que O StopMóvel começará a se mover
//O StopMovel tem tamanho padrão de 1 Canal, então se o usuário escolher nCanaisStopMovel = 2
//o StopMovel terá o tamanho de 2 Canais.
StopMovel = NormalizeDouble(StopMovel * nCanaisStopMovel,digits); //Defini o Tamanho do StopMóvel
//Variável para Controle de Modificação de StopMóvel da Ordem
bool modificaOrdem = false;
// Verifica se há posições abertas
for(int i = OrdersTotal() - 1; i >= 0; i--) {
if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES) && OrderSymbol() == Symbol() && OrderMagicNumber() == 0) {
// Para ordens de compra
if(OrderType() == OP_BUY) {
// Se o preço andou (fechou) em uma distância >= à variável StopMovel (Tamanho de 1 Canal ou n Canais)
if ( (Close[1] - OrderOpenPrice() >= StopMovel * Point) && liberaStopMovel == false ) {
novoStopLoss = NormalizeDouble(OrderOpenPrice() + 5, digits); // Move o stop para a posição de abertura da ordem + 5 pips (0x0)
liberaStopMovel=true; //A partir daqui, o Stop fica móvel a cada novo canal vencido
} else {
if( (Close[1] - OrderOpenPrice() >= StopMovel * Point) && liberaStopMovel == true )
{
novoStopLoss = NormalizeDouble(OrderStopLoss() + (StopMovel -5), digits); // Move o stop à favor do trade para a posição atual dele + o valor da variável StopMovel -5 pips
}
}
// Verifica se o novo stop loss é maior que o stop loss atual
if(novoStopLoss > OrderStopLoss()) {
// Ajusta o stop loss para a nova posição
modificaOrdem = OrderModify(OrderTicket(), OrderOpenPrice(), novoStopLoss, OrderTakeProfit(), 0, clrRed);
if(modificaOrdem)
{
Print("Ordem " + OrderTicket() + " Modificada com Sucesso!");
} else {
int codigoErro = GetLastError();
Print("Erro ao Tentar Modificar a Ordem " + OrderTicket() + ". Código do Erro: " + codigoErro);
}
}
}
// Para ordens de venda
else if(OrderType() == OP_SELL) {
// Se o preço andou (fechou) em uma distância >= à variável StopMovel (Tamanho de 1 Canal ou n Canais)
if ( (OrderOpenPrice() - Close[1] >= StopMovel * Point) && liberaStopMovel == false ) {
novoStopLoss = NormalizeDouble(OrderOpenPrice() - 5, digits); // Move o stop para a posição de abertura da ordem - 5 pips
liberaStopMovel=true; //A partir daqui, o Stop fica móvel a cada novo canal vencido
} else {
if(liberaStopMovel == true)
{
novoStopLoss = NormalizeDouble(OrderStopLoss() - (StopMovel + 5), digits); // Move o stop à favor do trade para a posição atual dele - o valor da variável StopMovel
}
}
// Verifica se o novo stop loss é menor que o stop loss atual
if(novoStopLoss < OrderStopLoss()) {
// Ajusta o stop loss para a nova posição
modificaOrdem = OrderModify(OrderTicket(), OrderOpenPrice(), novoStopLoss, OrderTakeProfit(), 0, clrRed);
if(modificaOrdem)
{
Print("Ordem " + OrderTicket() + " Modificada com Sucesso!");
} else {
int codigoErro = GetLastError();
Print("Erro ao Tentar Modificar a Ordem " + OrderTicket() + ". Código do Erro: " + codigoErro);
}
}
}
}
}
// Se não há ordens abertas, atualiza a variável OrdemAberta para 0 e liberaStopMovel para False
if(OrdersTotal() == 0) {
OrdemAberta = 0;
liberaStopMovel=false;
}
} // Fim da Função "ChecarStopMovel()"
Olhando no manual Trade Server Return Codes - Codes of Errors and Warnings - Constants, Enumerations and Structures - MQL4 Reference . O erro é stop inválido, voce esta alinhando o stop de maneira errada. NormalizeDouble não é a normalização correta, voce precisa normalizar o valor referente ao tamanho do tick do ativo.
- docs.mql4.com
Olhando no manual Trade Server Return Codes - Codes of Errors and Warnings - Constants, Enumerations and Structures - MQL4 Reference . O erro é stop inválido, voce esta alinhando o stop de maneira errada. NormalizeDouble não é a normalização correta, voce precisa normalizar o valor referente ao tamanho do tick do ativo.
Olá Ricardo, bom dia! Muito obrigado pela explicação...
Por favor, você teria algum exemplo sobre como fazer a correção com a normalização correta que você sugeriu?
Desde já, muito obrigado!
Normalize Price? - Symbols - Expert Advisors and Automated Trading - MQL5 programming forum
O codigo é o mesmo praticamente do mt5, já que não mudou a semantica nem nada relacionado.
- 2020.02.26
- Demosfen
- www.mql5.com
- Aplicativos de negociação gratuitos
- 8 000+ sinais para cópia
- Notícias econômicas para análise dos mercados financeiros
Você concorda com a política do site e com os termos de uso
Prezados, boa tarde!
Por gentileza, poderiam me auxiliar com uma dificuldade que estou tendo para fazer meu EA mover o Stop (StopMóvel)?
Quando o EA tenta realizar a mudança da ordem para "mover" o Stop para outra posição, está retornando o seguinte erro:
2024.04.11 12:36:01.009 HFP XAUUSD,M1: Erro ao Tentar Modificar a Ordem 89557440. Código do Erro: 130
Segue o código que executa esta rotina:
//+-----------------------------------------------------------+
//| Função para verificar e ajustar o stop móvel |
//+-----------------------------------------------------------+
void ChecarStopMovel() {
//Dígitos para o Par de Moedas Atual
int digits = MarketInfo(Symbol(), MODE_DIGITS);
//Ajusta o Momento em que O StopMóvel começará a se mover
//O StopMovel tem tamanho padrão de 1 Canal, então se o usuário escolher nCanaisStopMovel = 2
//o StopMovel terá o tamanho de 2 Canais.
StopMovel = NormalizeDouble(StopMovel * nCanaisStopMovel,digits); //Defini o Tamanho do StopMóvel
//Variável para Controle de Modificação de StopMóvel da Ordem
bool modificaOrdem = false;
// Verifica se há posições abertas
for(int i = OrdersTotal() - 1; i >= 0; i--) {
if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES) && OrderSymbol() == Symbol() && OrderMagicNumber() == 0) {
// Para ordens de compra
if(OrderType() == OP_BUY) {
// Se o preço andou (fechou) em uma distância >= à variável StopMovel (Tamanho de 1 Canal ou n Canais)
if ( (Close[1] - OrderOpenPrice() >= StopMovel * Point) && liberaStopMovel == false ) {
novoStopLoss = NormalizeDouble(OrderOpenPrice() + 5, digits); // Move o stop para a posição de abertura da ordem + 5 pips (0x0)
liberaStopMovel=true; //A partir daqui, o Stop fica móvel a cada novo canal vencido
} else {
if( (Close[1] - OrderOpenPrice() >= StopMovel * Point) && liberaStopMovel == true )
{
novoStopLoss = NormalizeDouble(OrderStopLoss() + (StopMovel -5), digits); // Move o stop à favor do trade para a posição atual dele + o valor da variável StopMovel -5 pips
}
}
// Verifica se o novo stop loss é maior que o stop loss atual
if(novoStopLoss > OrderStopLoss()) {
// Ajusta o stop loss para a nova posição
modificaOrdem = OrderModify(OrderTicket(), OrderOpenPrice(), novoStopLoss, OrderTakeProfit(), 0, clrRed);
if(modificaOrdem)
{
Print("Ordem " + OrderTicket() + " Modificada com Sucesso!");
} else {
int codigoErro = GetLastError();
Print("Erro ao Tentar Modificar a Ordem " + OrderTicket() + ". Código do Erro: " + codigoErro);
}
}
}
// Para ordens de venda
else if(OrderType() == OP_SELL) {
// Se o preço andou (fechou) em uma distância >= à variável StopMovel (Tamanho de 1 Canal ou n Canais)
if ( (OrderOpenPrice() - Close[1] >= StopMovel * Point) && liberaStopMovel == false ) {
novoStopLoss = NormalizeDouble(OrderOpenPrice() - 5, digits); // Move o stop para a posição de abertura da ordem - 5 pips
liberaStopMovel=true; //A partir daqui, o Stop fica móvel a cada novo canal vencido
} else {
if(liberaStopMovel == true)
{
novoStopLoss = NormalizeDouble(OrderStopLoss() - (StopMovel + 5), digits); // Move o stop à favor do trade para a posição atual dele - o valor da variável StopMovel
}
}
// Verifica se o novo stop loss é menor que o stop loss atual
if(novoStopLoss < OrderStopLoss()) {
// Ajusta o stop loss para a nova posição
modificaOrdem = OrderModify(OrderTicket(), OrderOpenPrice(), novoStopLoss, OrderTakeProfit(), 0, clrRed);
if(modificaOrdem)
{
Print("Ordem " + OrderTicket() + " Modificada com Sucesso!");
} else {
int codigoErro = GetLastError();
Print("Erro ao Tentar Modificar a Ordem " + OrderTicket() + ". Código do Erro: " + codigoErro);
}
}
}
}
}
// Se não há ordens abertas, atualiza a variável OrdemAberta para 0 e liberaStopMovel para False
if(OrdersTotal() == 0) {
OrdemAberta = 0;
liberaStopMovel=false;
}
} // Fim da Função "ChecarStopMovel()"