Colocar tempo de expiração na ordem

 

Olá pessoal,

Pesquisei bastante e não encontrei.


Estou programando um robô e estou utilizar a função Buy da biblioteca Ctrade. Porém eu preciso utilizar a BuyStop para ficar idealmente no meu modelo.

Ao colocar isso, algumas ordens naturalmente não são preenchidas e mais nada é executado.

Eu estou tentando então a função BuyStop com ORDERTIMESPECIFIED, porém eu não encontrei como eu coloco o tempo de expiração.


No meu robô está assim: 

void LongOpened()
  {
// Verificar se existe posição aberta
// Se existir não enviar

   if(m_position.SelectByMagic(_Symbol,inpt_numero_magico))
      return;

   if(Sinaldecompra())
     {
      double stopdecompra = NormalizeDouble(rates[1].low-0.001,3);      
      double alvodecompra = NormalizeDouble(((rates[1].high-rates[1].low)*multiplicadoralvo)+rates[1].high,3);
      double posicaocompra = NormalizeDouble(rates[1].high+0.001,3);
      double saldo = (AccountInfoDouble(ACCOUNT_BALANCE));
      double riscoporoperacao = ((riscooperacao*saldo)/100);
      double diferenca = NormalizeDouble(posicaocompra-stopdecompra,3);
      double lote = NormalizeDouble(riscoporoperacao/diferenca*posicaocompra/100000,2);
              
      if//(m_trade.Buy(volumedaoperacao,_Symbol,rates[1].low+0.001,stopdecompra,alvodecompra,"Compra"))
         (m_trade.BuyStop(lote,posicaocompra,_Symbol,stopdecompra,alvodecompra,ORDER_TIME_SPECIFIED,300,"Compra"))


Retorna data de expiração inválida.


Obs.: ao utilizar a função ORDER_TIME_GTC, funciona normalmente.


Obrigado a todos.

 
Matheus:



Matheus, não é todo ativo que permite emitir ORDEM C/ DATA EXPIRAÇÃO, consulte as especificações do ativo. Abaixo WINQ22, só admite expiração no dia exceto os gatilhos de stop SL/TP.   Compare com PETR4.


 

Tendo já visto o que o @Rogerio Giannetti Torres mencionou, no lugar do parâmetro você pode utilizar a função TimeTradeServer()+OtempoEmSegundos;

int meuTempo = 60*60; //1 Hora

m_trade.BuyStop(volume,precoDeEntrada,_Symbol,stop,take,ORDER_TIME_SPECIFIED,TimeTradeServer()+meuTempo,comentario);
 

Olá Rogerio,

Obrigado pelo seu tempo.

Verificando as especificações do ativo que quero operar, acredito que ele apenas permite GTC:

Obs.: a caixa de texto não está permitindo colar imagem aqui, portanto anexei.

Estou correto?

Se estou correto, preciso utilizar outra maneira pra remover minha ordem não executada? Obs.: é intraday.

Abraços.

Arquivos anexados:
teste.png  29 kb
 
Adailton Silva #:

Tendo já visto o que o @Rogerio Giannetti Torres mencionou, no lugar do parâmetro você pode utilizar a função TimeTradeServer()+OtempoEmSegundos;

Muito obrigado, resolveu meu problema. Parece que a biblioteca Ctrade não aceita o número diretamente e sim apenas através de uma variável.

Ficou assim:

void LongOpened()
  {
// Verificar se existe posição aberta
// Se existir não enviar

   if(m_position.SelectByMagic(_Symbol,inpt_numero_magico))
      return;

   if(Sinaldecompra())
     {
      double stopdecompra = NormalizeDouble(rates[1].low-0.001,3);      
      double alvodecompra = NormalizeDouble(((rates[1].high-rates[1].low)*multiplicadoralvo)+rates[1].high,3);
      double posicaocompra = NormalizeDouble(rates[1].high+0.001,3);
      double saldo = (AccountInfoDouble(ACCOUNT_BALANCE));
      double riscoporoperacao = ((riscooperacao*saldo)/100);
      double diferenca = NormalizeDouble(posicaocompra-stopdecompra,3);
      double lote = NormalizeDouble(riscoporoperacao/diferenca*posicaocompra/100000,2);
      int meuTempo = 60*10; //10 minutos
              
      if//(m_trade.Buy(volumedaoperacao,_Symbol,rates[1].low+0.001,stopdecompra,alvodecompra,"Compra"))
         (m_trade.BuyStop(lote,posicaocompra,_Symbol,stopdecompra,alvodecompra,ORDER_TIME_SPECIFIED,TimeTradeServer()+meuTempo,"Compra"))


Muito obrigado pessoal.

 
Matheus #:

Muito obrigado, resolveu meu problema. Parece que a biblioteca Ctrade não aceita o número diretamente e sim apenas através de uma variável.

Ficou assim:


Muito obrigado pessoal.

Que bom, sucesso por aí.