Como abrir corretamente uma ordem de mercado? - página 5

 
Gennady Mazur:

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?

Além disso, você pode verificar a abertura de uma posição ao tentar selecioná-la. E é melhor tentar várias vezes.

         int n = 0;
          do
           {
            n++;
           }
          while(!PositionSelectByTicket(tradeResult.deal) && n < 5);
Há um atraso e uma confirmação de que a posição já está em vigor.

Também notei que não há verificação OrderCheck(Request, checkResult), o que é ruim.
 

Oh, e também em ordem de mercado - preço = 0

Request.price=SymbolInfoDouble(_Symbol,SYMBOL_BID); esqueça-o

bool SendOrderSyncMode()
  {
   MqlTradeRequest request={0};
   MqlTradeResult  result={0};
   order_ticket=0;
   request.action = TRADE_ACTION_DEAL;
   request.magic  = 9876543211;
   request.symbol = Symbol();
   request.volume = 1;
   request.price  = 0;
   request.type=ORDER_TYPE_BUY;
   request.comment="Sync mode";
   request.type_filling=ORDER_FILLING_FOK;
   request.type_time=ORDER_TIME_DAY;
   if(OrderSend(request,result))
     {
      if((result.retcode==TRADE_RETCODE_DONE) || (result.retcode==TRADE_RETCODE_PLACED))
        {
         if(result.order>0)
           {
            order_ticket=result.order;
            Print(__FUNCTION__," Order sent in sync mode");
            return(true);
           }
         else
           {
            Print(__FUNCTION__," Error order sent in sync mode! Retcode = ",result.retcode);
           }
        }
      else
        {
         Print(__FUNCTION__," Error order sent in sync mode! Retcode = ",result.retcode);
        }
     }
   else
     {
      Print(__FUNCTION__," Order not sent in sync mode.");
     }
   return(false);
  }
void OnTradeTransaction(const MqlTradeTransaction &trans,
                        const MqlTradeRequest &request,
                        const MqlTradeResult &result)
  {
   switch(trans.type)
     {
      case TRADE_TRANSACTION_HISTORY_ADD:
        if((order_ticket > 0) && (trans.order == order_ticket))
      {
        //Вот здесь и смотрим что произошло
      }
      break;
     }
  }
 
Alexey Viktorov:
Além disso, é possível verificar a abertura da posição, tentando selecioná-la. E é melhor tentar várias vezes

         int n = 0;
          do
           {
            n++;
           }
          while(!PositionSelectByTicket(tradeResult.deal) && n < 5);
Há tanto atraso quanto confirmação de que a posição já foi aberta.

Também notei que não há verificação OrderCheck(Request, checkResult), o que é ruim.

E se a posição já existisse?

Ou se já existe um cargo, mas o pedido não está completamente preenchido?

 
Alexey Viktorov:
Além disso, pode-se verificar a abertura da posição, tentando selecioná-la. E várias tentativas são melhores.

         int n = 0;
          do
           {
            n++;
           }
          while(!PositionSelectByTicket(tradeResult.deal) && n < 5);
Há tanto atraso quanto confirmação de que a posição já está em vigor.

Também notei que não há verificação OrderCheck(Request, checkResult) e isto é ruim.

Bem, talvez eu insiraOrderCheck(Request, checkResult)
Obrigado

Mas eu não gosto particularmente de um laço assim

 
prostotrader:

Oh, e também em ordem de mercado - preço = 0

Request.price=SymbolInfoDouble(_Symbol,SYMBOL_BID); esqueça-o

bool SendOrderSyncMode()
  {
   MqlTradeRequest request={0};
   MqlTradeResult  result={0};
   order_ticket=0;
   request.action = TRADE_ACTION_DEAL;
   request.magic  = 9876543211;
   request.symbol = Symbol();
   request.volume = 1;
   request.price  = 0;
   request.type=ORDER_TYPE_BUY;
   request.comment="Sync mode";
   request.type_filling=ORDER_FILLING_FOK;
   request.type_time=ORDER_TIME_DAY;
   if(OrderSend(request,result))
     {
      if((result.retcode==TRADE_RETCODE_DONE) || (result.retcode==TRADE_RETCODE_PLACED))
        {
         if(result.order>0)
           {
            order_ticket=result.order;
            Print(__FUNCTION__," Order sent in sync mode");
            return(true);
           }
         else
           {
            Print(__FUNCTION__," Error order sent in sync mode! Retcode = ",result.retcode);
           }
        }
      else
        {
         Print(__FUNCTION__," Error order sent in sync mode! Retcode = ",result.retcode);
        }
     }
   else
     {
      Print(__FUNCTION__," Order not sent in sync mode.");
     }
   return(false);
  }
void OnTradeTransaction(const MqlTradeTransaction &trans,
                        const MqlTradeRequest &request,
                        const MqlTradeResult &result)
  {
   switch(trans.type)
     {
      case TRADE_TRANSACTION_HISTORY_ADD:
        if((order_ticket > 0) && (trans.order == order_ticket))
      {
        //Вот здесь и смотрим что произошло
      }
      break;
     }
  }
Muito obrigado por uma descrição tão detalhada...e explicação....
E sobre o preço.... sim, mais habituado à MT4, e lá você sempre tem que colocar o preço...
 
Sergey Chalyshev:

Repita

Além disso, você também deve verificar o status da ordem e se ela já apareceu ou não na história.

A troca não funciona com posições, apenas com ordens.

Sério?
 
Gennady Mazur:
Você estaria certo se eu fizesse pedidos pendentes, mas eu trabalho por mercado, e aqui o bilhete é obtido comResults.deal
Ainda assim, a ordem é enviada primeiro, depois é executada.
 
Sergey Chalyshev:

Eu não entendo o que significa seu sorriso?

Eu não esperava ouvi-lo dizer isso. O que pausa, ou você está brincando?

Pausa após o OrderSend() para que as informações e o histórico do mercado possam ser atualizados.
 
Sergey Chalyshev:

Mau legado forex.

...

Talvez você queira ter cuidado com a maneira como você o diz. Caso contrário, poderíamos também falar sobre a mutação genética dos aderentes de FOORTS.
 
Sergey Chalyshev:

E se a posição já existisse?

Ou já existe um cargo, mas o pedido não está completamente preenchido?

Sim. E eu sou todo a favor da minha sebe. Admito que eu não estava muito certo. Ou totalmente errado. :-)