Ordem rejeitada - página 2

 
ROMEU MASSELAI #Perfil e saldo eu tenho, trade proibido não sei, perguntei se poderia operar no fracionário da b3 com ea, responderam que sim.

Bom dia!!


Algumas verificações antes de enviar a ordem (podem ser utilizadas no início de OnTick):

//--- Checks if is trade allowed (Trade Permission)
   if(!TerminalInfoInteger(TERMINAL_TRADE_ALLOWED) || !MQLInfoInteger(MQL_TRADE_ALLOWED) || !AccountInfoInteger(ACCOUNT_TRADE_EXPERT)
      || !AccountInfoInteger(ACCOUNT_TRADE_ALLOWED) || SymbolInfoInteger(_Symbol, SYMBOL_TRADE_MODE) == SYMBOL_TRADE_MODE_DISABLED)
     {
      Comment("Trade is not allowed...");
      return;
     }


Verificação manual: Ctrl+U >> Guia Especificação >> Seleciona o símbolo...


Negociação permitida:


Negociação não permitida:


 
Vinicius de Oliveira #:

Bom dia!!


Algumas verificações antes de enviar a ordem (podem ser utilizadas no início de OnTick):


Verificação manual: Ctrl+U >> Guia Especificação >> Seleciona o símbolo...


Negociação permitida:


Negociação não permitida:


Essa mensagem do vinicius eh boa tambem que seria algo que iria comentar, lembrar de ver se o algotrading esta ligado no mt5 e se o algotrading esta permitido no seu robo (eh um checkbox na primeira aba). Isso pode fazer a ordem nem sair do terminal, mas pelo que eu lembro nao devolve rejeitado.

Ainda pra complementar a resposta dele incluiria uma condicao tambem para alertar se o simbolo nao estiver sincronizado (SymbolIsSynchronized retornando false) com o servidor (isso pode ser importante se for um servico).

 
Vinicius de Oliveira #:

Bom dia!!


Algumas verificações antes de enviar a ordem (podem ser utilizadas no início de OnTick):


Verificação manual: Ctrl+U >> Guia Especificação >> Seleciona o símbolo...


Negociação permitida:


Negociação não permitida:


Fiz a verificação manual de um ativo que teve a ordem rejeitada, como podem ver no print é permitido.

Arquivos anexados:
mult3f.png  27 kb
 
ROMEU MASSELAI #Fiz a verificação manual de um ativo que teve a ordem rejeitada, como podem ver no print é permitido.

Bom, então resta fazer as verificações sugeridas pelo Ricardo:

Fórum de negociação, sistemas de negociação automatizados e testes de estratégias de negociação

Ordem rejeitada

Ricardo Rodrigues Lucca, 2022.12.28 18:05

Se estiver usando a classe Ctrade tem como habilitar mais log que dai da proxima vez pode ser que tenha algo que ajude...
   if(compra==true)
     {
      if(trade.Buy(Lote,_Symbol,0,0,sellprice))
        {
         Print("Ordem de compra Executada com Sucesso!!");
        }
      else
        {
         Print(m_trade.ResultRetcode(), " ", m_trade.ResultRetcodeDescription());
        }
     }



Fórum de negociação, sistemas de negociação automatizados e testes de estratégias de negociação

Ordem rejeitada

Ricardo Rodrigues Lucca, 2022.12.28 18:05

... Voce chegou a ver questao de margem disponivel ou se o tp nao poderia estar dentro do spread? ...
//+--------------------------------------------------------------------------------------------------------------------+
//| This function checks the availability of money in the account                                                      |
//+--------------------------------------------------------------------------------------------------------------------+
bool CheckMoneyForTrade(string symb, double lots, ENUM_ORDER_TYPE type)
  {
//--- obtemos o preço de abertura
   MqlTick mql_tick;
   SymbolInfoTick(symb, mql_tick);
   double price = mql_tick.ask;

   if(type == ORDER_TYPE_SELL)
      price = mql_tick.bid;

//--- valores da margem necessária e livre
   double margin, free_margin = AccountInfoDouble(ACCOUNT_MARGIN_FREE);

//--- chamamos a função de verificação
   if(!OrderCalcMargin(type, symb, lots, price, margin))
     {
      //--- algo deu errado, informamos e retornamos false
      ERRMSG = "Error in " + __FUNCTION__ + " code=" + (string)GetLastError();
      return(false);
     }

//--- se não houver fundos suficientes para realizar a operação
   if(margin > free_margin)
     {
      //--- informamos sobre o erro e retornamos false
      ERRMSG = "Not enough money for " + EnumToString(type) + " " + (string)lots + " " + symb + " Error code=" + (string)GetLastError();
      return(false);
     }

//--- a verificação foi realizada com sucesso
   return(true);
  }
//+--------------------------------------------------------------------------------------------------------------------+
//| Verifica se distância entre o TakeProfit/StopLoss e o preço de fechamento é maior do que SYMBOL_TRADE_STOPS_LEVEL  |
//+--------------------------------------------------------------------------------------------------------------------+
bool Check_SL_TP(ENUM_ORDER_TYPE type, double SL, double TP)
  {
//--- Local variables
   bool SL_check = false, TP_check = false;

//--- Gets the last price for current symbol
   double BID = SymbolInfoDouble(_Symbol, SYMBOL_BID);
   double ASK = SymbolInfoDouble(_Symbol, SYMBOL_ASK);

//--- get the SYMBOL_TRADE_STOPS_LEVEL level
   int stops_level = (int)SymbolInfoInteger(_Symbol, SYMBOL_TRADE_STOPS_LEVEL);
   if(stops_level != 0)
     {
      PrintFormat("SYMBOL_TRADE_STOPS_LEVEL=%d: StopLoss and TakeProfit must not be nearer than %d points from the closing price", stops_level, stops_level);
     }

//--- check only two order types
   switch(type)
     {
      //--- Buy operation
      case  ORDER_TYPE_BUY:
        {
         //--- check the StopLoss
         SL_check = (BID - SL > stops_level * _Point);
         if(!SL_check)
           {
            ERRMSG = StringFormat("For order %s StopLoss=%.5f must be less than %.5f (Bid=%.5f - SYMBOL_TRADE_STOPS_LEVEL=%d points)", EnumToString(type), SL, BID - stops_level * _Point, BID, stops_level);
           }
         //--- check the TakeProfit
         TP_check = (TP - BID > stops_level * _Point);
         if(!TP_check)
           {
            ERRMSG = StringFormat("For order %s TakeProfit=%.5f must be greater than %.5f (Bid=%.5f + SYMBOL_TRADE_STOPS_LEVEL=%d points)", EnumToString(type), TP, BID + stops_level * _Point, BID, stops_level);
           }
         //--- return the result of checking
         return(SL_check && TP_check);
        }
      //--- Sell operation
      case  ORDER_TYPE_SELL:
        {
         //--- check the StopLoss
         SL_check = (SL - ASK > stops_level * _Point);
         if(!SL_check)
           {
            ERRMSG = StringFormat("For order %s StopLoss=%.5f must be greater than %.5f (Ask=%.5f + SYMBOL_TRADE_STOPS_LEVEL=%d points)", EnumToString(type), SL, ASK + stops_level * _Point, ASK, stops_level);
           }
         //--- check the TakeProfit
         TP_check = (ASK - TP > stops_level * _Point);
         if(!TP_check)
           {
            ERRMSG = StringFormat("For order %s TakeProfit=%.5f must be less than %.5f (Ask=%.5f - SYMBOL_TRADE_STOPS_LEVEL=%d points)", EnumToString(type), TP, ASK - stops_level * _Point, ASK, stops_level);
           }
         //--- return the result of checking
         return(TP_check && SL_check);
        }
      break;
     }

//--- Verification succeeded
   return(false);
  }




Fórum de negociação, sistemas de negociação automatizados e testes de estratégias de negociação

Ordem rejeitada

Ricardo Rodrigues Lucca, 2022.12.28 18:05

... Outro chute na lua ja que nao parece ter nada errado era verificar os precos informados se estao normalizados ...

A função abaixo está disponível também na classe CSymbolInfo, se preferir. Utilize-a para normalizar sellprice (inclusive) antes de enviar a ordem:

//+--------------------------------------------------------------------------------------------------------------------+
//| This function normalizes and adjusts the price to the TICK SIZE                                                    |
//+--------------------------------------------------------------------------------------------------------------------+
double NormalizePrice(double price)
  {
//--- Get the minimal price change
   double tick_size = SymbolInfoDouble(_Symbol, SYMBOL_TRADE_TICK_SIZE);

//--- Return the price normalized
   if(tick_size == 0.0)
     {
      return(NormalizeDouble(price, _Digits));
     }

//--- Return the price normalized and adjusted to the TICK SIZE
   return(NormalizeDouble(MathRound(price / tick_size) * tick_size, _Digits));
  }
 
ROMEU MASSELAI #:
Rico

Bom ano novo!

Certifique-se que esteja usando modo de preenchimento RETURN .

ORDER_FILLING_RETURN


Em tempo: Você consegue emitir manualmente uma ordem?

 
Depois da alteração que fiz obtive esse retorno, das ordens rejeitadas hoje.
Arquivos anexados:
 
Rogerio Giannetti Torres #:

Bom ano novo!

Certifique-se que esteja usando modo de preenchimento RETURN .

ORDER_FILLING_RETURN


Em tempo: Você consegue emitir manualmente uma ordem?

Consigo emitir sim, o que seria o modo de preenchimento retorno?
 
ROMEU MASSELAI #:
Consigo emitir sim, o que seria o modo de preenchimento retorno?

Opa, é mais fácil você ler no manual o que é o modo de execução ou preenchimento de uma ordem.

Então se você consegue emitir ordens manuais é quase certo que o modo de preenchimento da ordem está incorreto,


Se você estiver usando a classe CTrade ajuste o modo de preenchimento usando: cTrade.SetTypeFilling(ORDER_FILLING_RETURN), só é necessário ajustar uma vez, portanto coloque na seção INIT.

Se você está usando o OrderSend(request,result)  ajuste o preenchimento da ordem no campo request.type_filling=ORDER_FILLING_RETURN.

 
ROMEU MASSELAI #:
Depois da alteração que fiz obtive esse retorno, das ordens rejeitadas hoje.

Se colocar no OnInit isso acredito que ele te deixa bem verboso o que ele esta fazendo nos rejects. Na chamada do ctrade tem uma função LogLevel que voce pode passar LOG_LEVEL_ALL. Mas, ainda não entendi se voce esta usando a classe ou populando na mão e mandando o OrderSend()... Sobre a imagem o que deu invalid stops pode ter sido porque não estava normalizado corretamente ou porque o preço "correu" deixando o stop invalido. Como eu vi que seus stops parecem meio dentro da volatilidade eu acredito muito mais que voce não esta normalizando o preço. Tem uma função no CSymbol que é NormalizePrice.


O que o Rogerio comentou é importante que tu leia. Na ajuda escreve no editor, seleciona e da F1. Muitas vezes ta até em portugues!
 
Vinicius de Oliveira #:

Bom, então resta fazer as verificações sugeridas pelo Ricardo:







A função abaixo está disponível também na classe CSymbolInfo, se preferir. Utilize-a para normalizar sellprice (inclusive) antes de enviar a ordem:

Alterei o código para sua sugestão a fim de obter mais logs. O TP creio não estar dentro do spread, pois é uma ordem a mercado com o TP no mínimo 1,5% maior que a ultimo preço (timeframe M1). Com relação a normalização não a fiz por não achar necessária, visto que o único parâmetro que vai preenchido (o TP) é a mínima de um determinado candle, ou seja um valor onde ouve negociação, não há cálculos que retornem números fracionários, somente valores inteiros. Se estiver equivocado peço que me corrijam.

PS.: Também ajustei o preenchimento da ordem, como o Rogerio sugeriu.