Como trabalhar corretamente em MT5 com OrderSend - página 2

 
fxsaber:
Este já é um argumento terminológico. A situação ruim foi descrita em detalhes acima. As bibliotecas padrão nem mesmo levam isso em conta.

Não.

Mas continue persistindo. Não vou explicar mais.

 
Renat Fatkhullin:

Não.

Mas continue persistindo. Não vou explicar mais.

As pessoas escrevem sobre isso no fórum. E mais de uma vez. A reação é exatamente essa.

 
fxsaber:

As pessoas escrevem sobre isso no fórum. E mais de uma vez. A reação é exatamente como esta.

As pessoas não querem pensar por si mesmas, mas querem que os outros o façam por elas... Infelizmente, este é o caso.
 
prostotrader:

Você quer que eu o ajude a contornar esses contratempos (a partir de experiência pessoal de negociação com robôs MT5 em uma conta real)?

Adicionado

Absolutamente livre :)

Acrescente também o seu próprio ao mealheiro.

Fórum sobre comércio, sistemas automatizados de comércio e testes estratégicos

Aguardando a resposta do servidor após o envio do OrderSend()

Denis Sartakov, 2016.10.08 15:43

A função é síncrona, apenas o histórico não é atualizado de forma síncrona com a conclusão desta função,

Estou fazendo assim, acho que é mais fácil do que mexer com OnTrade(), e outras coisas:

bool ClosePosition()
{
   if (!PositionSelect(_Symbol))
   {
      return(false);
   }

   bool   b_Result;
   
   b_Result = m_trade.PositionClose(_Symbol,mi_Deviation);
   
   if(!b_Result)
   {
      Print("The PositionClose() method has failed. Return code=",m_trade.ResultRetcode(),
            ". Code description: ",m_trade.ResultRetcodeDescription());
      return(false);
   }
   
   if(b_Result)
   {
      if (m_trade.ResultRetcode() == TRADE_RETCODE_DONE)
      {
         while(PositionSelect(_Symbol))
         {
         }
         
         Print("The PositionClose() has been successfully executed. Return code=",m_trade.ResultRetcode(),
               " (",m_trade.ResultRetcodeDescription(),")");
         return(true);
      }
      if (m_trade.ResultRetcode() != TRADE_RETCODE_DONE)
      {
         Print("The PositionClose() failed. Return code=",m_trade.ResultRetcode(),
               " (",m_trade.ResultRetcodeDescription(),")");
         return(false);
      }
   }
   return(false);
}      
//+------------------------------------------------------------------+

 
prostotrader:
As pessoas não querem pensar por si mesmas, mas querem que os outros o façam por elas... infelizmente, é este o caso.

As pessoas não apenas pensam, mas também compartilham suas soluções. Infelizmente, os desenvolvedores estão em silêncio sobre isso.

Não há um único exemplo na Documentação sobre este tópico. E isto é com a função principal.

 
fxsaber:

As pessoas não apenas pensam, mas também compartilham suas soluções. Infelizmente, os desenvolvedores estão em silêncio sobre isso.

Não há um único exemplo na Documentação sobre este tópico. E isso é com a função principal.

O exemplo que você deu acima é, desculpe-me, um completo absurdo.

Esse não é o lugar para começar!

 
prostotrader:

O exemplo que você deu acima é, desculpe-me, um completo absurdo.

Esse não é o lugar para começar!

Minha variante

Fórum sobre comércio, sistemas automatizados de comércio e testes estratégicos

Bichos, insetos, perguntas

fxsaber, 2016.10.09 09:39

Se um OrderSend é enviado, você tem que LEMBRAR (é aqui que está a vulnerabilidade potencial) que ele é feito. Em seguida, desconsiderar o histórico atual (ambiente comercial) até que a mensagem apropriada da OnTrade chegue. Uma vez chegado, LEMBRE-SE de ESQUECER.

Quando não há LEMBRE-SE, você pode confiar na história como na MT4.


 
//+------------------------------------------------------------------+
//|                                                    OrderSend.mq5 |
//|                        Copyright 2016, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
//
bool is_busy;
ulong order_ticket;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   is_busy=false; 
   order_ticket=0;
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   if(!is_busy && (order_ticket==0)) //Только при выполнении данного условия мы продолжаем работать(кроме отложенного ордера)
   {
     MqlTradeRequest request={0};
     MqlTradeResult  result={0};
     
     if(PositionSelect(Symbol()))
     {
       if(OrderSend(request, result)
       {
         if(result.retcode==TRADE_RETCODE_PLACED) //для биржи TRADE_RETCODE_PLACED
         {
           if(result.order>0)
           {
             is_busy=true;
             order_ticket=result.order;
             Print("Order plased, ticket = ",result.order);
           }
           else
           {
             Print("Internal error!");
           }  
         }
         else
         {
           //смотрим причину result.retcode
         }
       }
       else
       {
         Print("Order NOT send!");
       }
     }
     else
     {
     }
   }   
  }
//+------------------------------------------------------------------+
//| TradeTransaction function                                        |
//+------------------------------------------------------------------+
void OnTradeTransaction(const MqlTradeTransaction& trans,
                        const MqlTradeRequest& request,
                        const MqlTradeResult& result)
  {
//--- В зависимости от того, квкой тип ордера мы устанавливали, смотрим, что с ордером произошло
// и только после полного понимания снимаем флаг is_busy=false; order_ticket=0;
// вот и все премудрости OrderSend
   
  }
//+------------------------------------------------------------------+

Aproveite.

 
prostotrader:

Use-o.

Então como é diferente do que eu escrevi acima? Um bom homem até me enviou uma bíblia séria sobre o assunto.

As pessoas estão encontrando soluções. Tratava-se do fato de que os próprios desenvolvedores nem sequer o têm na SB.

 
fxsaber:

Então como isso é diferente do que eu escrevi acima? Até mesmo um bom homem me deixou cair uma Bíblia séria sobre o assunto.

As pessoas estão encontrando soluções. Tratava-se do fato de que os próprios desenvolvedores não o têm nem mesmo na SB.

Se você não gosta, não o use.
Razão: