Ordem de venda não funciona

 
Boa tarde Senhores (as),

Estou com um problema que não consigo resolver. Tenho as funções de compra e venda que são ativadas quando a estratégia retorna True, porém, tanto na conta real quanto no ambiente de testes, a venda não funciona, somente a compra. Poderiam dar uma olhada e analisar se eu cometi algum erro na função?

Desde já agradeço.

// COMPRA A MERCADO
void CompraAMercado() // bser na documentação ordem das variaveis!!!
  {
   MqlTradeRequest   requisicao;    // requisição
   MqlTradeResult    resposta;      // resposta
   
   ZeroMemory(requisicao);
   ZeroMemory(resposta);
   
   //--- Cacacterísticas da ordem de Compra
   requisicao.action       = TRADE_ACTION_DEAL;                                 // Executa ordem a mercado
   requisicao.magic        = magic_number;                                      // Nº mágico da ordem
   requisicao.symbol       = _Symbol;                                           // Simbolo do ativo
   requisicao.volume       = num_lots;                                          // Nº de Lotes
   requisicao.price        = NormalizeDouble(tick.ask,_Digits);                 // Preço para a compra
   requisicao.sl           = NormalizeDouble(tick.ask - Loss*_Point,_Digits);   // Preço Stop Loss
   requisicao.tp           = NormalizeDouble(tick.ask + Profit*_Point,_Digits); // Alvo de Ganho - Take Profit
   requisicao.deviation    = 
0.0 ;                                                 // Desvio Permitido do preço
   requisicao.type         = ORDER_TYPE_BUY;                                    // Tipo da Ordem
   requisicao.type_filling = ORDER_FILLING_FOK;                                 // Tipo deo Preenchimento da ordem
   
   //---
   bool res = OrderSend(requisicao,resposta);
   //---
   if(res || resposta.retcode == 10008 || resposta.retcode == 10009)
     {
      Print("Ordem de Compra executada com sucesso!");
     }
   else
     {
       Print("Erro ao enviar Ordem Compra. Erro = ", GetLastError());
       ResetLastError();
     }
  }

// VENDA A MERCADO
void VendaAMercado()
  {
   MqlTradeRequest   requisicao;    // requisição
   MqlTradeResult    resposta;      // resposta
   
   ZeroMemory(requisicao);
   ZeroMemory(resposta);
   
   //--- Cacacterísticas da ordem de Venda
   requisicao.action       = TRADE_ACTION_DEAL;                                   // Executa ordem a mercado
   requisicao.magic        = magic_number;                                        // Nº mágico da ordem
   requisicao.symbol       = _Symbol;                                             // Simbolo do ativo
   requisicao.volume       = num_lots;                                            // Nº de Lotes
   requisicao.price        = NormalizeDouble(tick.bid,_Digits);                   // Preço para Venda
   requisicao.sl           = NormalizeDouble(tick.bid + Loss*_Point,_Digits);     // Preço Stop Loss
   requisicao.tp           = NormalizeDouble(tick.bid - Profit*_Point,_Digits);   // Alvo de Ganho - Take Profit
   requisicao.deviation    = 
0.0 ;                                                   // Desvio Permitido do preço
   requisicao.type         = ORDER_TYPE_SELL;                                     // Tipo da Ordem
   requisicao.type_filling = ORDER_FILLING_FOK;                                   // Tipo deo Preenchimento da ordem
   //---
   bool res = OrderSend(requisicao,resposta);
   //---
     if(res || resposta.retcode == 10008 || resposta.retcode == 10009)
       {
        Print("Ordem de Venda executada com sucesso!");
       }
     else
       {
        Print("Erro ao enviar Ordem Venda. Erro = ", GetLastError());
        ResetLastError();
       } 
 }


OBS: Como não sabia em qual tópico se aplicava a minha dúvida, estou colocando no geral.
Porque a Hospedagem Virtual no MetaTrader 4 e no MetaTrader 5 são Melhores que os VPS Usuais
Porque a Hospedagem Virtual no MetaTrader 4 e no MetaTrader 5 são Melhores que os VPS Usuais
  • www.mql5.com
A rede de hospedagem virtual em nuvem foi desenvolvida especialmente para o MetaTrader 4 e o MetaTrader 5, possuindo todas as vantagens de uma solução nativa. Obtenha os benefícios de nossa oferta gratuita por 24 horas - teste um servidor virtual agora mesmo.
 
Anderson Pedrucci FilhoBoa tarde Senhores (as), Estou com um problema que não consigo resolver. Tenho as funções de compra e venda que são ativadas quando a estratégia retorna True, porém, tanto na conta real quanto no ambiente de testes, a venda não funciona, somente a compra. Poderiam dar uma olhada e analisar se eu cometi algum erro na função? Desde já agradeço. [ . . . ]

Boa tarde!! Faça um teste substituindo a função NormalizeDouble(), em todos os preços, pela função abaixo:

//+--------------------------------------------------------------------------------------------------------------------+
//| 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));
  }

EDIT.1: Se não resolver, lembre de verificar possíveis mensagens de erro nas guias Experts e Diário da Caixa de Ferramentas...


Anderson Pedrucci Filho: [ . . . ] OBS: Como não sabia em qual tópico se aplicava a minha dúvida, estou colocando no geral.

Você poderia ter incluído na seção Expert Advisors e Negociação Automatizada.

 
Encontrei o erro. Por algum motivo, o indicador de ajuste diário que eu estava usando estava inabilitando somente a venda, mas consegui corrigir. Obrigado pela ajuda Vinicius!
 
Anderson Pedrucci Filho #:
Encontrei o erro. Por algum motivo, o indicador de ajuste diário que eu estava usando estava inabilitando somente a venda, mas consegui corrigir. Obrigado pela ajuda Vinicius!

Note que isso aqui nos dois codigos pode não ser exatamente o que voce quer:

requisicao.type_filling = ORDER_FILLING_FOK;

Falo isso porque tem dois entendimentos: (1) vai consumir até todo o nível de preço e parar, ou; (2) vai consumir somente o que esta disponivel na ordem mais no topo.

Acredito que seja mais a segunda opção, então se tu colocar uma ordem de por exemplo 1k ai e no topo tem so 100. Tu a ordem vai ser rejeitada.
Razão: