Como abrir corretamente uma ordem de mercado?

 

Recentemente levantei um tópico sobre a reabertura de pedidos. Pensei que tinha resolvido o problema, pois tudo estava funcionando muito bem durante uma semana. Mas hoje eu encontrei um problema semelhante somente ao abrir.
Muitos pedidos foram abertos na Finam, e 9 na Otkritie... embora apenas um pedido devesse ter sido aberto em todos os casos.

Aqui está um trecho de código da EA

    if(OpenOrders<1)
    {
        Coment="Open Sell "+string(OpenOrders+1);
        ret=OpenSellPosition(_Symbol,volume,Coment,Sleeppage,Filling);
    }
    
    
  if(ret)
  {
    OpenOrders++;
    PriceLastOpen=price;
  }

bool OpenSellPosition(string symbol, double volume, string comment="", ulong deviation=10, ENUM_ORDER_TYPE_FILLING filling=ORDER_FILLING_FOK)
{
  MqlTradeRequest Request;
  MqlTradeResult Results;
  ZeroMemory(Request);
  ZeroMemory(Results);
  Request.price=SymbolInfoDouble(_Symbol,SYMBOL_BID);
  Request.action=TRADE_ACTION_DEAL;
  Request.type=ORDER_TYPE_SELL;
  Request.symbol=symbol;
  Request.volume=volume;      
  Request.deviation=deviation;
  Request.comment=comment;  
  Request.type_filling=filling;
  bool res=false;
  res=OrderSend(Request,Results);
  if(res)
  {
    if(Results.deal>0) return(true);
    else return(false);
  }
  return(false);
}

ou seja, podemos ver pelo código que se a operação for bem sucedida, a variávelOpenOrders aumenta, o que inicialmente é igual a 0

Se for maior que 0, não deve haver mais abertura do pedido, mas toda a pilha de pedidos é aberta com o comentário Ordem1.

Eu verifico se há uma resposta positiva na função que abre o pedido e se o bilhete de pedido foi recebido, mas por alguma razão esta função retorna falsa, mesmo que o pedido esteja realmente definido.

Explicar o que está errado, como resolver este problema?

 
Presumo que as informações sobre o negócio ainda não tenham chegado. Aqui (destacado em vermelho) você está confiando na sorte. E ela é uma senhora caprichosa :-))

bool OpenSellPosition(string symbol, double volume, string comment="", ulong deviation=10, ENUM_ORDER_TYPE_FILLING filling=ORDER_FILLING_FOK)
{
  MqlTradeRequest Request;
  MqlTradeResult Results;
  ZeroMemory(Request);
  ZeroMemory(Results);
  Request.price=SymbolInfoDouble(_Symbol,SYMBOL_BID);
  Request.action=TRADE_ACTION_DEAL;
  Request.type=ORDER_TYPE_SELL;
  Request.symbol=symbol;
  Request.volume=volume;      
  Request.deviation=deviation;
  Request.comment=comment;  
  Request.type_filling=filling;
  bool res=false;
  res=OrderSend(Request,Results);
  if(res)
  {
    if(Results.deal>0) return(true);
    else return(false);

  }
  return(false);
}
 
Gennady Mazur:

Recentemente levantei a questão da reabertura das ordens. Pensei que tinha resolvido o problema porque tudo estava funcionando muito bem durante uma semana. Mas hoje eu encontrei um problema semelhante apenas com a abertura.
Um número muito grande de pedidos abertos na Finam, e 9 na Otkritie... embora em todos os casos apenas um pedido deveria ter sido aberto.

Aqui está um trecho de código da EA

    if(OpenOrders<1)
    {
        Coment="Open Sell "+string(OpenOrders+1);
        ret=OpenSellPosition(_Symbol,volume,Coment,Sleeppage,Filling);
    }
    
    
  if(ret)
  {
    OpenOrders++;
    PriceLastOpen=price;
  }

bool OpenSellPosition(string symbol, double volume, string comment="", ulong deviation=10, ENUM_ORDER_TYPE_FILLING filling=ORDER_FILLING_FOK)
{
  MqlTradeRequest Request;
  MqlTradeResult Results;
  ZeroMemory(Request);
  ZeroMemory(Results);
  Request.price=SymbolInfoDouble(_Symbol,SYMBOL_BID);
  Request.action=TRADE_ACTION_DEAL;
  Request.type=ORDER_TYPE_SELL;
  Request.symbol=symbol;
  Request.volume=volume;      
  Request.deviation=deviation;
  Request.comment=comment;  
  Request.type_filling=filling;
  bool res=false;
  res=OrderSend(Request,Results);
  if(res)
  {
    if(Results.deal>0) return(true);
    else return(false);
  }
  return(false);
}

ou seja, podemos ver pelo código que se a operação for bem sucedida, a variávelOpenOrders aumenta, o que inicialmente é igual a 0

Se for maior que 0, não deve haver mais abertura do pedido, mas toda a pilha de pedidos é aberta com o comentário Ordem1.

Eu verifico se há uma resposta positiva na função que abre o pedido e se o bilhete de pedido foi recebido, mas por alguma razão esta função retorna falsa, mesmo que o pedido esteja realmente definido.

Você pode explicar o que está errado e como resolver este problema?

Mau legado forex.

Você deve verificaros resultados.ordem.

Se o pedido for feito, isso não significa que o negócio já tenha sido feito.

 
Sergey Chalyshev:

Mau legado forex.

Temos que verificar isso.ordem.

Se um pedido é feito, isso não significa que uma negociação já tenha sido executada.

Você estaria certo se eu estivesse fazendo pedidos pendentes, mas eu trabalho por mercado e aqui o bilhete é obtido comResults.deal
 
Dennis Kirichenko:
Presumo que as informações sobre o negócio ainda não tenham chegado. Aqui (destacado em vermelho) você está confiando na sorte. E ela é uma senhora caprichosa :-))

bool OpenSellPosition(string symbol, double volume, string comment="", ulong deviation=10, ENUM_ORDER_TYPE_FILLING filling=ORDER_FILLING_FOK)
{
  MqlTradeRequest Request;
  MqlTradeResult Results;
  ZeroMemory(Request);
  ZeroMemory(Results);
  Request.price=SymbolInfoDouble(_Symbol,SYMBOL_BID);
  Request.action=TRADE_ACTION_DEAL;
  Request.type=ORDER_TYPE_SELL;
  Request.symbol=symbol;
  Request.volume=volume;      
  Request.deviation=deviation;
  Request.comment=comment;  
  Request.type_filling=filling;
  bool res=false;
  res=OrderSend(Request,Results);
  if(res)
  {
    if(Results.deal>0) return(true);
    else return(false);

  }
  return(false);
}
Não, este resultado está presente, não é uma ordem de bilhetes no servidor, é uma operação temporária de bilhetes, que mais tarde será substituída por uma posição de bilhetes
 
Dennis Kirichenko:
Presumo que as informações sobre o negócio ainda não tenham chegado. Aqui (destacado em vermelho) você está confiando na sorte. E ela é uma senhora caprichosa :-))

bool OpenSellPosition(string symbol, double volume, string comment="", ulong deviation=10, ENUM_ORDER_TYPE_FILLING filling=ORDER_FILLING_FOK)
{
  MqlTradeRequest Request;
  MqlTradeResult Results;
  ZeroMemory(Request);
  ZeroMemory(Results);
  Request.price=SymbolInfoDouble(_Symbol,SYMBOL_BID);
  Request.action=TRADE_ACTION_DEAL;
  Request.type=ORDER_TYPE_SELL;
  Request.symbol=symbol;
  Request.volume=volume;      
  Request.deviation=deviation;
  Request.comment=comment;  
  Request.type_filling=filling;
  bool res=false;
  res=OrderSend(Request,Results);
  if(res)
  {
    if(Results.deal>0) return(true);
    else return(false);

  }
  return(false);
}
E me foi assegurado em um tópico anterior, o guru deste fórum, que esta informação sempre vem ... quase instantaneamente ... e se o servidor respondeu positivamente o bilhete não é emitido, a ordem falhou
 

Você precisa registrar todas as negociações. Por exemplo, assim:

primeiro no "cabeçalho" conectamos a classe de comércio CTrade

#include <Trade\Trade.mqh>
CTrade         m_trade;                      // trading object

e aqui está um exemplo de operação de compra:

   if(m_trade.Buy(lots,NULL,m_symbol.Ask(),sl,tp))
     {
      if(m_trade.ResultDeal()==0)
         Print("Buy -> false. Result Retcode: ",m_trade.ResultRetcode(),
               ", description of result: ",m_trade.ResultRetcodeDescription());

      else
         Print("Buy -> true. Result Retcode: ",m_trade.ResultRetcode(),
               ", description of result: ",m_trade.ResultRetcodeDescription());
     }
   else
      Print("Buy -> false. Result Retcode: ",m_trade.ResultRetcode(),
            ", description of result: ",m_trade.ResultRetcodeDescription());

para que você possa obter dois erros: primeiro nível - a operação não passou na verificação básica e segundo nível - verificação do bilhete do comércio.

Então, se houver um problema, você pode usar os registros para resolvê-lo.

Acrescentado: isto é verdade para o modo de operação SYNC.

 

Agora os gurus aqui também lhe ensinarão ))

Объясните что не так, как решить данную проблему? 

Com sua experiência, é indecoroso fazer tais perguntas aqui.

 
Vladimir Karputov:

Você precisa registrar todas as negociações. Por exemplo, assim:

primeiro no "cabeçalho" conectamos a classe de comércio CTrade

#include <Trade\Trade.mqh>
CTrade         m_trade;                      // trading object

e aqui está um exemplo de operação de compra:

   if(m_trade.Buy(lots,NULL,m_symbol.Ask(),sl,tp))
     {
      if(m_trade.ResultDeal()==0)
         Print("Buy -> false. Result Retcode: ",m_trade.ResultRetcode(),
               ", description of result: ",m_trade.ResultRetcodeDescription());

      else
         Print("Buy -> true. Result Retcode: ",m_trade.ResultRetcode(),
               ", description of result: ",m_trade.ResultRetcodeDescription());
     }
   else
      Print("Buy -> false. Result Retcode: ",m_trade.ResultRetcode(),
            ", description of result: ",m_trade.ResultRetcodeDescription());

para que você possa obter dois erros: primeiro nível - a operação não passou na verificação básica e segundo nível - verificação do bilhete do comércio.

Então, se houver um problema, você pode usar os registros para resolvê-lo.

Acrescentado: o acima descrito é verdadeiro para o modo de operação SYNC.

Foi exatamente assim que eu o fiz.

  bool res=false;
  res=OrderSend(Request,Results);
  if(res)
  {
    if(Results.deal>0) return(true);
    else return(false);
  }
  return(false);
somente com meu próprio código
 
Vladimir Karputov:

Você precisa registrar todas as negociações. Por exemplo, assim:

primeiro no "cabeçalho" conectamos a classe de comércio CTrade

#include <Trade\Trade.mqh>
CTrade         m_trade;                      // trading object

e aqui está um exemplo de operação de compra:

   if(m_trade.Buy(lots,NULL,m_symbol.Ask(),sl,tp))
     {
      if(m_trade.ResultDeal()==0)
         Print("Buy -> false. Result Retcode: ",m_trade.ResultRetcode(),
               ", description of result: ",m_trade.ResultRetcodeDescription());

      else
         Print("Buy -> true. Result Retcode: ",m_trade.ResultRetcode(),
               ", description of result: ",m_trade.ResultRetcodeDescription());
     }
   else
      Print("Buy -> false. Result Retcode: ",m_trade.ResultRetcode(),
            ", description of result: ",m_trade.ResultRetcodeDescription());

para que você possa obter dois erros: primeiro nível - a operação não passou na verificação básica e segundo nível - verificação do bilhete do comércio.

Então, se houver um problema, você pode usar os registros para resolvê-lo.

Acrescentado: isto é verdade para o modo de operação SYNC.

Oh e outra coisa, a função padrão suporta a execução de ordens, seu preenchimento, porque eu costumava usar o SeaTrade para abertura, até chegar a uma troca onde as ordens não queriam ser executadas porque era impossível determinar o preenchimento
 
Gennady Mazur:
Foi exatamente isso que eu fiz.

  bool res=false;
  res=OrderSend(Request,Results);
  if(res)
  {
    if(Results.deal>0) return(true);
    else return(false);
  }
  return(false);
mas com meu próprio código.
E a extração de madeira? Você tem que emitir tanto a conclusão bem sucedida da operação quanto, especialmente, a falha com o código de erro.
Razão: