Problema com Data de Expiração da Ordem

 

Olá a todos!

Estou enfrentando um problema ao tentar abrir ordens com data de expiração. Quando eu rodo meu EA no backtest para abri-las eu recebo o seguinte erro:

SellStop() method failed. Return code=10022. Code description: invalid expiration

CTrade::OrderOpen: Invalid expiration type


a função que estou trabalhando para abrir esse tipo de operação é a seguinte:

void buyStop(string pair,double price,int Lot,int TakeProfit_,int StopLoss_)
  {
   if(Lot<1) Lot=1;
   double volume=Lot;
   string symbol=pair;    // specify the symbol, at which the order is placed
   int    digits=(int)SymbolInfoInteger(symbol,SYMBOL_DIGITS); // number of decimal places
   double point=SymbolInfoDouble(symbol,SYMBOL_POINT);         // point
   double SL=0;
   double TP=0;
   if(StopLoss_>0)
      SL=NormalizeDouble(price-StopLoss_*point,digits);         //--- calculate and normalize SL and TP levels
   else
      SL=0;
   if(TakeProfit_>0)
      TP=NormalizeDouble(price+TakeProfit_*point,digits);         //--- calculate and normalize SL and TP levels
   else
      TP=0;
   datetime expiration=TimeTradeServer()+PeriodSeconds(orderexpiration);
   string comment=StringFormat("Buy Stop %s %G lots at %s, SL=%s TP=%s",
                               symbol,volume,
                               DoubleToString(price,digits),
                               DoubleToString(SL,digits),
                               DoubleToString(TP,digits));
//--- everything is ready, sending a Buy Limit pending order to the server
   if(!trade.BuyStop(volume,price,symbol,0,TP,ORDER_TIME_SPECIFIED,expiration,comment))
     {
      //--- failure message
      Print("BuyStop() method failed. Return code=",trade.ResultRetcode(),
            ". Code description: ",trade.ResultRetcodeDescription());
     }
   else
     {
      Print("BuyStop() method executed successfully. Return code=",trade.ResultRetcode(),
            " (",trade.ResultRetcodeDescription(),")");
     }
//--- 
  }


a variável orderexpiration foi definida da seguinte forma:

input ENUM_TIMEFRAMES orderexpiration=PERIOD_M5;

Eu já mudei para períodos de tempo maiores e o resultado foi o mesmo =/


Alguém por gentileza teria ideia onde eu estou errando ou alguma sugestão?


Abraço,

Romeu.

 
c4b3l3r4:

Olá a todos!

Estou enfrentando um problema ao tentar abrir ordens com data de expiração. Quando eu rodo meu EA no backtest para abri-las eu recebo o seguinte erro:

SellStop() method failed. Return code=10022. Code description: invalid expiration

CTrade::OrderOpen: Invalid expiration type


Olá Romeu,

você saberia me dizer qual o tipo de preenchimento da ordem que você está usando?

Abraços,
Malacarne 

 

Boa tarde Malacarne!

salvou meu dia!! HAHAHA

eu estava utilizando ORDER_FILLING_RETURN...

com ORDER_FILLING_FOK e ORDER_FILLING_IOC funciona tranquilo.

Muito obrigado pela ajuda!

Abraço,

Romeu.

 
c4b3l3r4:

Boa tarde Malacarne!

salvou meu dia!! HAHAHA

eu estava utilizando ORDER_FILLING_RETURN...

com ORDER_FILLING_FOK e ORDER_FILLING_IOC funciona tranquilo.

Muito obrigado pela ajuda!

Abraço,

Romeu.

Era a minha suspeita!

Abraços,
Malacarne

 

Caros, bom dia!

Também tenho uma dúvida sobre o erro "Invalid Expiration". Eu explico:

Programei um robô que usa Pending Orders. Quando fiz backtestes dele na PETR4 ele funcionou sem problemas, mas quando o coloquei na série histórica do dólar, usando o WDO@, aparece no Log um erro de Invalid Expiration.

Usei o request.type_time=ORDER_TIME_GTC e o request.type_filling=ORDER_FILLING_FOK. Ou seja, aparentemente não vejo em que eu estaria errando. 

Alguém teria alguma idéia? Muito obrigado! 

P.S.: Segue o código da função BuyStop:

 

request.action=TRADE_ACTION_PENDING;

request.type=ORDER_TYPE_BUY_STOP;

request.volume=volume;

request.sl=stop;

request.tp=takeprofit;

request.price=preco;

request.stoplimit=0;

request.type_filling=ORDER_FILLING_FOK;

request.type_time=ORDER_TIME_GTC;

OrderSend(request,result); 

 
hegelgb, estou com o mesmo problema, você conseguiu resolver? Estou usando o Expert para o mini índice do IBOV
 
rbsmsg:
hegelgb, estou com o mesmo problema, você conseguiu resolver? Estou usando o Expert para o mini índice do IBOV

A diferença é que a PETR4 (se olharem nas especificações do papel, clicando com botão direito no ativo na janela de Market Watch e clicando em "Especificação") aceita expiração de ordens do tipo: GTC, Today e Specified day, já o WING15 aceita somente Today excluindo SL/TP que podem ficar pro próximo dia. Então, para resovler esse problema das ordens pendentes a solução é setar o atributo type_time do request como ORDER_TIME_DAY.

Testem aí e digam se era isso mesmo por favor. Também já encarrei esse problema e isso resolveu pra mim 

 
glac:

A diferença é que a PETR4 (se olharem nas especificações do papel, clicando com botão direito no ativo na janela de Market Watch e clicando em "Especificação") aceita expiração de ordens do tipo: GTC, Today e Specified day, já o WING15 aceita somente Today excluindo SL/TP que podem ficar pro próximo dia. Então, para resovler esse problema das ordens pendentes a solução é setar o atributo type_time do request como ORDER_TIME_DAY.

Testem aí e digam se era isso mesmo por favor. Também já encarrei esse problema e isso resolveu pra mim 

Muito bom, bem observado.
 

Olá amigos!

Estou com problema semelhante porém programando através do eabuilder.com

Sempre que coloco ordem pendente ao invés de a mercado, no backtest apresenta esse tipo de erro: "OrderSend error: Invalid expiration", tanto mini dólar quanto mini indice.

Eu entendo muito pouco de linguagem de programação.

Alguém poderia me dar uma força?


Desde já agradeço a todos!

 
glac:

A diferença é que a PETR4 (se olharem nas especificações do papel, clicando com botão direito no ativo na janela de Market Watch e clicando em "Especificação") aceita expiração de ordens do tipo: GTC, Today e Specified day, já o WING15 aceita somente Today excluindo SL/TP que podem ficar pro próximo dia. Então, para resovler esse problema das ordens pendentes a solução é setar o atributo type_time do request como ORDER_TIME_DAY.

Testem aí e digam se era isso mesmo por favor. Também já encarrei esse problema e isso resolveu pra mim 

Cara!!! essa dica do watch market foi espetacular. mto obrigado.

 

Só uma duvida, conforme você falou  o indice futuro somente aceita ordens do tipo ORDER_TIME_DAY. Mas ainda assim você sabe informar se há como cadastrar uma hora de validade para a ordem? por exemplo 5 minutos?