Robô abrindo muitas posições a cada tick - página 2

 
Sidnei Da Silva Santos Junior:
...

Se vc não definiu nada é false, observe o construtor da classe



 
Jonathan Pereira:

Se vc não definiu nada é false, observe o construtor da classe



Pelo que li aqui isso deve ser true para ele "dispensar" a resposta do servidor correto?
 

Opa,



Aqui nos meus rôbos eu costumo adicionar um limitar de tempo entre ordens pra evitar esse tipo de problema, é sempre bom adicionar uma função pra checar se já existe ordem aberta.

 

Eu costumo fazer uma verificação não somente da aceitação da ordem mas também da execução da mesma.

Não uso o CTrade mas o princípio é o mesmo. Você ao executar recebe um status, mas este status é o de recebimento da ordem pela corretora, em alguns casos existe um delay entre esta aceitação e de fato a execução para que o PositionsTotal receba uma informação.


Recomendo que faça a verificação da execução da ordem para ter certeza se algo de fato ocorreu.


Eu faço robôs para trade de ações no mercado a vista da B3, então pode ser que algumas características não sejam iguais dependendo do mercado que opera, mas eu somente permito que siga para demais processamentos dentro do meu código se eu recebi um sinal informando que algo foi rejeitado, cancelado ou executado com sucesso. Se você colocar ordem no book para execução e depender dessa informação de conclusão para novos processamentos, recomendo que coloque algum ponto de trava até que a sua posição seja tomada.


Vou colar abaixo o código do método que utilizo para buscar essa informação, você pode fazer as adaptações necessárias:


Para informação pTicketNumber é a propriedade order do resultado MqlTradeResult da sua execução. Faço esta verificação abaixo somente quando ocorre o retorno positivo da aceitação da ordem pela corretora.


   if(OrderSelect(pTicketNumber)) {
      pOrderState = OrderGetInteger(ORDER_STATE);
   } else {

      datetime iEnd = TimeCurrent();
      datetime iStart = iEnd - PeriodSeconds(PERIOD_D1);

      HistorySelect(iStart, iEnd);

      int iDeals = HistoryDealsTotal();

      double iVolume = 0;
      double iTotalValue = 0;
      double iPrice = 0;

      for(int i=0; i<iDeals; i++) {

         ulong iTicket = HistoryDealGetTicket(i);

         if(HistoryDealGetInteger(iTicket,DEAL_ORDER)==pTicketNumber) {

            iVolume += HistoryDealGetDouble(iTicket, DEAL_VOLUME);
            iTotalValue += (HistoryDealGetDouble(iTicket, DEAL_VOLUME)) *
                           (HistoryDealGetDouble(iTicket, DEAL_PRICE));

         }

      }

      if(iVolume > 0) {
         iPrice = NormalizeDouble(iTotalValue / iVolume, 5);
         HistoryOrderSelect(pTicketNumber);
         pOrderState = HistoryOrderGetInteger(pTicketNumber, ORDER_STATE);
         pVolume = iVolume;
         pPrice = iPrice;
      } else {
         return false;
      }
   }

   switch(pOrderState) {
   case ORDER_STATE_CANCELED :
      pText = "Cancelada";
      break;
   case ORDER_STATE_EXPIRED:
      pText = "Expirada";
      break;
   case ORDER_STATE_FILLED:
      pText = "Completamente preenchida";
      break;
   case ORDER_STATE_PARTIAL:
      pText = "Parcialmente preenchida";
      break;
   case ORDER_STATE_PLACED:
      pText = "Enviada";
      break;
   case ORDER_STATE_REJECTED:
      pText = "Rejeitada";
      break;
   case ORDER_STATE_REQUEST_ADD:
      pText = "Registrando operação";
      break;
   case ORDER_STATE_REQUEST_CANCEL:
      pText = "Cancelando operação";
      break;
   case ORDER_STATE_REQUEST_MODIFY:
      pText = "Modificando operação";
      break;
   case ORDER_STATE_STARTED:
      pText = "Verificada e aguardando aceite da corretora";
      break;
   default:
      pOrderState = -1;
      pText = "Status não identificado";
      pVolume = 0;
      pPrice = 0;
      break;
   }
 
Fernando Silva De Souza:

Eu costumo fazer uma verificação não somente da aceitação da ordem mas também da execução da mesma.

Não uso o CTrade mas o princípio é o mesmo. Você ao executar recebe um status, mas este status é o de recebimento da ordem pela corretora, em alguns casos existe um delay entre esta aceitação e de fato a execução para que o PositionsTotal receba uma informação.


Recomendo que faça a verificação da execução da ordem para ter certeza se algo de fato ocorreu.


Eu faço robôs para trade de ações no mercado a vista da B3, então pode ser que algumas características não sejam iguais dependendo do mercado que opera, mas eu somente permito que siga para demais processamentos dentro do meu código se eu recebi um sinal informando que algo foi rejeitado, cancelado ou executado com sucesso. Se você colocar ordem no book para execução e depender dessa informação de conclusão para novos processamentos, recomendo que coloque algum ponto de trava até que a sua posição seja tomada.


Vou colar abaixo o código do método que utilizo para buscar essa informação, você pode fazer as adaptações necessárias:


Para informação pTicketNumber é a propriedade order do resultado MqlTradeResult da sua execução. Faço esta verificação abaixo somente quando ocorre o retorno positivo da aceitação da ordem pela corretora.


Fernando, achei muito badana seu código. Já estou copiando aqui para minha biblioteca particular de códigos.

Obrigado pela contribuição :)

 

Pessoal, estive dando uma estudada aqui. Não seria o caso de usar a função CheckResultRetCode() para obter o sucesso ou fracasso do negócio? 


PS.: Código excelente Fernando estarei entendendo ele e aplicando no meu EA com toda certeza! Obrigado amigo.


EDIT: Acabei de ver a sugestão na do Jonathan usando exatamente a função que eu acabei de mencionar rs