Erro ao Mover Stop - MQL4

 

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()"


 
herfranpi:

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.

Trade Server Return Codes - Codes of Errors and Warnings - Constants, Enumerations and Structures - MQL4 Reference
Trade Server Return Codes - Codes of Errors and Warnings - Constants, Enumerations and Structures - MQL4 Reference
  • docs.mql4.com
Trade Server Return Codes - Codes of Errors and Warnings - Constants, Enumerations and Structures - MQL4 Reference
 
Ricardo Rodrigues Lucca #:

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!

 
herfranpi #:

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!


Apenas complementando...

Estou usando MQL4

 
herfranpi #:

Apenas complementando...

Estou usando MQL4

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.

Normalize Price?
Normalize Price?
  • 2020.02.26
  • Demosfen
  • www.mql5.com
Hey guys, can someone explain me the idea behind this code? Can it not be simply replaced with this? Help very much appreciated...
Razão: