Erro na data de expiração

 

Olá amigos

estou encontrando um problema no meu codigo quando rodo ele na conta real(na conta Demo esta ok e no backtest tambem)

Quando tento realizar uma compra ou venda o código retorna um erro: TRADE_RETCODE_INVALID_EXPIRATION que significa algum erro na Data de Expiração

Ja alterei o codigo diversas vezes mas o erro persiste. 

ativo:WDOM19

corretora: Modal

Codigo:

ZeroMemory(request);
        ZeroMemory(result);
        
        request.action = TRADE_ACTION_PENDING;
        request.symbol = pSymbol;
        request.type = ORDER_TYPE_BUY_STOP;
        request.sl = pStop;
        request.tp = pProfit;
        request.comment = pComment;
        request.price = pPrice;
        request.volume = pVolume;
        request.stoplimit = pStopLimit;
        request.deviation = deviation;
        request.type_filling = ORDER_FILLING_FOK;//fillType;
        request.magic = magicNumber;
        
        
        
        if(pExpiration > 0)
        {
                request.expiration = pExpiration;
                request.type_time =ORDER_TIME_SPECIFIED;
                
        }
        else request.type_time = ORDER_TIME_GTC;

        
        // Order loop
        int retryCount = 0;
        int checkCode = 0;
        
        do 
        {
                bool sent = OrderSend(request,result);
                
                checkCode = CheckReturnCode(result.retcode);
.......

Muito obrigado

 
CaioVitullo:

Olá amigos

estou encontrando um problema no meu codigo quando rodo ele na conta real(na conta Demo esta ok e no backtest tambem)

Quando tento realizar uma compra ou venda o código retorna um erro: TRADE_RETCODE_INVALID_EXPIRATION que significa algum erro na Data de Expiração

Ja alterei o codigo diversas vezes mas o erro persiste. 

ativo:WDOM19

corretora: Modal

Codigo:

Muito obrigado

Como você preencheu a variável "pExpiration"?

Sugiro também alterar o tipo de preenchimento de ordens de "FOK" para "RETURN" e efetuar um teste.

[ ]´s

 

Olá CaioVitullo

Note que apesar de funcionar em ambiente emulado, como você refere, no mundo real e servidor MT5 real, essa programação poderá depender de outros sistemas, como as regras de negócio do servidor OMS e gerais da corretora.

Como o problema está na data de expiração da ordem inválida na solicitação, recomendo você verificar melhor o código abaixo, principalmente o valor da variável pExpiration quando > 0. 

if(pExpiration > 0)
        {
                request.expiration = pExpiration;
                request.type_time =ORDER_TIME_SPECIFIED;
                
        }
        else request.type_time = ORDER_TIME_GTC;

Em https://www.mql5.com/pt/docs/constants/tradingconstants/orderproperties você encontra mais detalhes sobre esse ajuste (procure por ENUM_ORDER_TYPE_TIME), caso já não tenha conhecimento.

Sds.,
Rogério Figurelli

Documentação sobre MQL5: Constantes, Enumeradores e Estruturas / Constantes de Negociação / Propriedades de uma Ordem
Documentação sobre MQL5: Constantes, Enumeradores e Estruturas / Constantes de Negociação / Propriedades de uma Ordem
  • www.mql5.com
As solicitações para executar operações de negociação são formalizadas como ordens. Cada ordem tem uma variedade de propriedades para leitura. As informações sobre elas podem ser obtidas usando as funções Identificador de posição que é definido para uma ordem tão logo ela é executada. Cada ordem executada resulta em uma operação que...
 
Joscelino Celso de Oliveira:

Como você preencheu a variável "pExpiration"?

Sugiro também alterar o tipo de preenchimento de ordens de "FOK" para "RETURN" e efetuar um teste.

[ ]´s

Olá Joscelino Celso de Oliveira, respondemos exatamente no mesmo momento, mas você foi mais rápido (apenas um segundo de diferença) e acredito que (o mais relevante) mais preciso, pois eu também suspeitaria da política de preenchimento como causa do problema (no caso ENUM_ORDER_TYPE_FILLING no documento que passei).
Sds.,
Rogério Figurelli

 
Rogerio Figurelli:

Olá CaioVitullo

Note que apesar de funcionar em ambiente emulado, como você refere, no mundo real e servidor MT5 real, essa programação poderá depender de outros sistemas, como as regras de negócio do servidor OMS e gerais da corretora.

Como o problema está na data de expiração da ordem inválida na solicitação, recomendo você verificar melhor o código abaixo, principalmente o valor da variável pExpiration quando > 0. 

Em https://www.mql5.com/pt/docs/constants/tradingconstants/orderproperties você encontra mais detalhes sobre esse ajuste (procure por ENUM_ORDER_TYPE_TIME), caso já não tenha conhecimento.

Sds.,
Rogério Figurelli

Olá CaioVitullo

Apenas como recomendação complementar de segurança, sugiro também teres bastante cuidado com esse loop abaixo, uma vez que sequer é feita uma verificação da ordem e os riscos são altos de o robô realmente entrar em loop enviando ordens:

// Order loop
        int retryCount = 0;
        int checkCode = 0;
        
        do 
        {
                bool sent = OrderSend(request,result);
                
                checkCode = CheckReturnCode(result.retcode);

Nesse sentido, recomendo você remover esse loop e utilizar a função OrderCheck antes da OrderSend, o que irá facilitar também a identificação de problemas antes do envio da ordem, o que é fundamental no mundo real.

Por fim, como você já está partindo para uso desse código e operação em conta real, sugiro, antes disso, ler o tópico em https://www.mql5.com/pt/forum/23409 com outros cuidados similares.

Sds.,
Rogério Figurelli

Um checklist dos riscos dos robôs antes de operar em conta real
Um checklist dos riscos dos robôs antes de operar em conta real
  • 2014.04.23
  • www.mql5.com
A maior parte dos traders que operam com robôs, tanto no mercado Forex, como no mercado BM&FBovespa, geralmente focam apenas no lado bom, que é o p...
 
Rogerio Figurelli:

Olá Joscelino Celso de Oliveira, respondemos exatamente no mesmo momento, mas você foi mais rápido (apenas um segundo de diferença) e acredito que (o mais relevante) mais preciso, pois eu também suspeitaria da política de preenchimento como causa do problema (no caso ENUM_ORDER_TYPE_FILLING no documento que passei).
Sds.,
Rogério Figurelli

Grande @Rogerio Figurelli,


Grato pelas colocações.

Minha recomendação em relação ao preenchimento de ordens vem de experiencia própria.

Espero ter contribuído ao colega.

[ ]'s

 
Joscelino Celso de Oliveira:

Grande @Rogerio Figurelli,


Grato pelas colocações.

Minha recomendação em relação ao preenchimento de ordens vem de experiencia própria.

Espero ter contribuído ao colega.

[ ]'s

Perfeito Joscelino Celso de Oliveira, eu que agradeço e espero que o CaioVitullo encontre a real causa do problema, dentro do que já foi passado aqui.
Quanto ao preenchimento, na verdade prefiro usar o tipo FOK desde o tempo que se usava protocolo FIX diretamente para rotear ordens no Brasil, mas quando o MT5 começou aqui, só se praticava o tipo RETURN e na época solicitei para a equipe técnica da corretora a possibilidade do tudo ou nada (FOK) por considerar de menor risco, tendo ajudado a homologar esse preenchimento, que considero o mais seguro, por evitar a execução parcial.
O problema que vejo da execução parcial está na latência de sincronismo do servidor MT5 com o mercado.
Pelos seus comentários no fórum, percebo que você endereça bem essa questão, mas imagino que novos desenvolvedores podem ser surpreendidos se utilizarem o tipo RETURN com códigos muito simples de double check, baseados unicamente em exemplos do Forex, que não é centralizado e portanto com bem menor risco de latência e falhas, principalmente de sinalização de posições da carteira.
Sds.,
Rogério Figurelli


Razão: