Envio de Ordem com data de expiração BMF

 

Amigos, 

Estou a um bom tempo tentando colocar uma ordem pendente com tempo de expiração, porém sem sucesso. Testei várias configurações, fiz alguns debugs e parece que essa função não existem

Segue um exemplo :

        m_request.action      =TRADE_ACTION_PENDING;
          m_request.type_filling= ORDER_FILLING_FOK;
          m_request.symbol      =_Symbol;
          m_request.magic       =06;
          m_request.volume      =v_contratos;
          m_request.type        =ORDER_TYPE_BUY_STOP;
          m_request.stoplimit   =last_tick.bid+30;
          m_request.price       =last_tick.bid+30;
          m_request.sl          =(last_tick.bid-30-v_pontos_loss);
          m_request.tp          =(last_tick.bid+30+v_pontos_gain);
          //m_request.type_time   =ORDER_TIME_DAY;
          //m_request.type_time   =ORDER_TIME_SPECIFIED
          m_request.type_time   =ORDER_TIME_GTC;
          m_request.expiration  =TimeCurrent()+5;
          m_request.comment="COMPRA";

             
          OrderSend(m_request,m_result);

Apresenta erro de [Invalid expiration]

Se eu uso a Ctrade conforme abaixo, executa sem erro, porém a ordem não expira nunca.

trade.BuyStop(v_contratos,last_tick.bid+30,_Symbol,(last_tick.bid-30-v_pontos_loss),(last_tick.bid+30+v_pontos_gain),ORDER_TIME_SPECIFIED,(TimeCurrent()+5),"COMPRA"); 

Gostaria de saber se essa função realmente funciona para os futuros, pois caso contrário irei fazer um controle por tempo e exluir a ordem.


Obrigado !

 
Carlos Martins:

Amigos, 


Calor Martins,

o Modo GTC e o termino da validade depende do instrumento, portanto veja nas especificações o que a corretora permitiu para o instrumento.

Na imagem coloquei INDQ20, onde se Lê:    No MODO GTC:  Válida para o dia   TERMINO DE VALIDADE: Hoje e não pode ser alterado.



 

Olá Rogério,


Eu tentei com o ORDER_TIME_SPECIFIED e também não funciona. Usei todos os tipos.


Att,

 
Carlos Martins:

Olá Rogério,


Eu tentei com o ORDER_TIME_SPECIFIED e também não funciona. Usei todos os tipos.


Att,

Carlos, 

Eu controlo de outra forma mas o resultado final creio que é o mesmo que você deseja. 

Em vez de colocar a "expiração" na ordem eu coloquei o controle no OnTimer().  Em xx em xx segundos ele checa se existem Ordens Pendentes que não viraram Posição. Se existir, ele exclui as Ordens.

 
Ruy Christian Hoffmann:

Carlos, 

Eu controlo de outra forma mas o resultado final creio que é o mesmo que você deseja. 

Em vez de colocar a "expiração" na ordem eu coloquei o controle no OnTimer().  Em xx em xx segundos ele checa se existem Ordens Pendentes que não viraram Posição. Se existir, ele exclui as Ordens.

Boa Ruy,


Isso resolve meu problema.


Obrigado !

 
Carlos Martins:

Olá Rogério,


Eu tentei com o ORDER_TIME_SPECIFIED e também não funciona. Usei todos os tipos.


Att,

Acho que não fui claro,

você não pode alterar o MODO_GTC e TERMINO DE VALIDADE para WIN/IND DOL/WDO e outros futuros , veja:   A especificação não permite.

A especificação só permite, válida para o dia e termino de validade 0(zero == hoje);

 

Ola a todos..

Eu tambem não consigo fazer funcionar. Se a estrutura do comando tem um espaço para colocar a validade da ordem, porque não funciona. Eu estou tentando utilizar da maneira abaixo, porem o validade é ignorada pelo testador de estratégia.

#include <Trade/Trade.mqh>

CTrade trade;

Expiracao = TimeCurrent()+15*60;

trade.BuyStop(lote,PrecoMaximo[1]+10,_Symbol,PrecoMaximo[1] + 10 - stopLoss,PrecoMaximo[1] + 10 + takeProfit,ORDER_TIME_SPECIFIED,Expiracao,"Compra");


Se alguem tiver uma explicação do porque não funciona, acho que ajudaria muita gente, inclusive eu...


Muito Obrigado

 
rnovaes1973:

Ola a todos.

Se alguem tiver uma explicação do porque não funciona, acho que ajudaria muita gente, inclusive eu...

Muito Obrigado

Ola Novaes

ja está respondido aqui nesse post, o que que você não entendeu?

 
Ruy Christian Hoffmann:

Carlos, 

Eu controlo de outra forma mas o resultado final creio que é o mesmo que você deseja. 

Em vez de colocar a "expiração" na ordem eu coloquei o controle no OnTimer().  Em xx em xx segundos ele checa se existem Ordens Pendentes que não viraram Posição. Se existir, ele exclui as Ordens.

Também estou com o mesmo problema.

O amigo poderia postar aqui um exemplo de bloco de código usando o OnTimer() ?

 
Joao Raimundo Alexandre Neto:

Também estou com o mesmo problema.

O amigo poderia postar aqui um exemplo de bloco de código usando o OnTimer() ?

EventSetTimer(30);

void OnTimer()
{
   if(!SemOrdem())
      PendingOrderDelete();
}

void PendingOrderDelete()
{
   int o_total=OrdersTotal();
   if(o_total==0)
      return;
   else
   {
      for(int j=o_total-1; j>=0; j--)
      {
         ulong o_ticket = OrderGetTicket(j);
         if(o_ticket != 0)
            negocio.OrderDelete(o_ticket);
      }
   }
}

bool SemOrdem()
{
   if(OrdersTotal()>0)
      return false;
   else
      return true;
}

... e entenda que estou usando o CTrade. Então onde você lê "negocio" é apenas porque estou utilizando uma Instância baseada na Biblioteca do CTrade.

 
Ruy Christian Hoffmann:

... e entenda que estou usando o CTrade. Então onde você lê "negocio" é apenas porque estou utilizando uma Instância baseada na Biblioteca do CTrade.

Ruy, obrigado por colaborar...

Vou acrescentar meus 0,02 centavos a essa discussão.

É bom validar o numero magico e moeda a qual esta olhando para as ordens, pois OrdesTotal(), olha no âmbito geral....logo ele agrega todas as ordens da plataforma.


   int totalOrderBySymbol=0;
   int total=OrdersTotal();
   if(total>0)
     {
      for(int i=total-1; i>=0; i--)
        {
         OrderSelect(OrderGetTicket(i));
         if(OrderGetString(ORDER_SYMBOL)!=Symbol())
            continue;
         if(OrderGetInteger(ORDER_MAGIC)!=InpMagicEA)
            continue;

         totalOrderBySymbol += 1;
           
        }
     }
Razão: