Bibliotecas: MT4Orders - página 68

 
fxsaber #:
A versão mais recente está sempre aqui.

Uma das corretoras mais populares removeu parte do histórico de negociação de todas as contas de negociação de seus clientes. Portanto, muitos usuários perceberam que a biblioteca emite avisos devido a um histórico incorreto no servidor de negociação.


Esse problema foi corrigido na versão mais recente.

Faça o download da versão mais recente da biblioteca na página em russo.

 
'DEAL_SL' - undeclared identifier       MT4Orders.mqh   1186    89
'DEAL_TP' - undeclared identifier       MT4Orders.mqh   1187    91
'MQL_HANDLES_USED' - undeclared identifier      MT4Orders.mqh   1345    104
'MQL_HANDLES_USED' - undeclared identifier      MT4Orders.mqh   1726    124

O MT5 não se baseia em versões antigas.

E a versão de lançamento mais recente tem bugs https://www.mql5.com/ru/forum/380278/page31#comment_26286913

Новая версия платформы MetaTrader 5 build 3091: Улучшения в работе
Новая версия платформы MetaTrader 5 build 3091: Улучшения в работе
  • 2021.12.04
  • www.mql5.com
В пятницу 22 октября 2021 года будет выпущена обновленная версия платформы MetaTrader 5...
 
traveller00 #:

Ele não é compatível com versões mais antigas do MT5.

Eu compilo em versões novas e o utilizo na b2958. Trato as compilações de lançamento da mesma forma que as versões beta.

 

Tenho uma pergunta rápida sobre fechamentos parciais.

No MT4, o fechamento de 0,01 lote de uma ordem de 0,1 lote resulta no fechamento do ticket original com um tamanho de lote de 0,01 e o comentário da ordem parcialmente fechada muda para "to: xxxxxx". Ao mesmo tempo, uma nova ordem de 0,09 lote é aberta com o comentário definido como "from: xxxxxx".

Isso não parece estar acontecendo no MT5 (pelo menos, OrdersToString() não lista nenhum texto de comentário de ordem para as partes abertas ou fechadas), portanto, não posso acompanhar a cadeia de fechamentos parciais como faria normalmente.

Você tem algum trecho de código compatível com o MT4Orders que possa compartilhar ou pode explicar como posso fazer isso de forma confiável?

 

Como visualizar a execução parcial de posições abertas.

#include <MT4Orders.mqh> // https://www.mql5.com/pt/code/16006

#define  Ask SymbolInfoDouble(_Symbol, SYMBOL_ASK)

void OnStart()
{
  // Posição aberta.
  const TICKET_TYPE Ticket  = OrderSend(_Symbol, OP_BUY, 0.1, Ask, 0, 0, 0, "Hello!");
  
  // Fechamentos parciais.
  if (OrderSelect(Ticket, SELECT_BY_TICKET))
  {
    OrderClose(OrderTicket(), 0.01, OrderClosePrice(), 0);
    OrderClose(OrderTicket(), 0.02, OrderClosePrice(), 0);
  }
    
  for (int i = OrdersTotal() - 1; i >= 0; i--)
    if (OrderSelect(i, SELECT_BY_POS))
    {
      PrintFullOrder();
      
      Print("");
    }
}

#include <fxsaber\TradesID\TradesID.mqh> // https://www.mql5.com/pt/code/34173

void PrintFullOrder()
{
  static TRADESID TradesID;
  
  long Deals[];  
  const int Size = TradesID.GetDealsByID(OrderTicketID(), Deals);
  
  for (int i = 0; i < Size; i++)
    if (OrderSelect(Deals[i], SELECT_BY_TICKET))
      OrderPrint();  
}


Resultado.

#50005051444 2021.12.20 21:22:29.566 buy 0.07 GBPUSD 1.32174 0.00000 0.00000 1.32169 0.00 0.00 -0.31 Hello! 0
#50004982892 2021.12.20 21:22:29.566 buy 0.01 GBPUSD 1.32174 0.00000 0.00000 2021.12.20 21:22:29.631 1.32169 0.00 0.00 -0.04 Hello! 0
#50004982893 2021.12.20 21:22:29.566 buy 0.02 GBPUSD 1.32174 0.00000 0.00000 2021.12.20 21:22:29.694 1.32169 0.00 0.00 -0.09 Hello! 0

#50005051217 2021.12.20 21:22:05.921 buy 0.09 USDCHF 0.92179 0.00000 0.00000 0.92179 0.00 0.00 0.00 Hello! 0
#50004982634 2021.12.20 21:22:05.921 buy 0.01 USDCHF 0.92179 0.00000 0.00000 2021.12.20 21:22:05.984 0.92174 0.00 0.00 -0.05 Hello! 0
 
SysFX comentário da ordem parcialmente fechada muda para "to: xxxxxx". Ao mesmo tempo, uma nova ordem de 0,09 lote é aberta com o comentário definido como "from: xxxxxx".

Isso não parece estar acontecendo no MT5 (pelo menos, OrdersToString() não lista nenhum texto de comentário de ordem para as partes abertas ou fechadas), portanto, não posso acompanhar a cadeia de fechamentos parciais como faria normalmente.

Você tem algum trecho de código compatível com o MT4Orders que possa compartilhar ou pode explicar como posso fazer isso de forma confiável?

Exemplo.

 
fxsaber #:

Exemplo.

Isso é perfeito! ...obrigado pela resposta rápida :)

 
// Lista de modificações:
// 28.12.2021
// Correção: OrderSelect(Index, SELECT_BY_POS, MODE_TRADES) leva em conta mais uma dessincronização no lado do MT5.
// Correção: OrderLots(true) leva em conta outra sincronização incorreta do lado do MT5. 


A primeira edição na lista de alterações, em particular, tornou possível tornar as duas lógicas idênticas.

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

Bibliotecas: MT4Orders

fxsaber, 2021.05.12 18:24

À primeira vista, esses dois códigos deveriam dar o mesmo resultado.

while (OrdersTotal() <= 1)
  if (OrderSelect(0, SELECT_BY_POS))
    OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(), 0);
  else
    OrderSend(_Symbol, OP_BUY, 1, Ask, 0, 0, 0);    


while (OrdersTotal() <= 1)
  if (!OrdersTotal())
    OrderSend(_Symbol, OP_BUY, 1, Ask, 0, 0, 0);    
  else if (OrderSelect(0, SELECT_BY_POS))
    OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(), 0);


Na verdade, não é assim. Tente entender o motivo.

Em geral, acabou sendo ainda melhor se proteger contra as peculiaridades dos impedimentos de ordens no MT5.

 
// Lista de modificações:
// 29.12.2021
// Correção: sincronização aprimorada no modo ByPass.
 

No MT4, ao recuperar ordens , o retrocesso (contagem dupla) é possível devido à agitação da tabela de ordens.


No MT4Orders, a indexação da tabela de ordens muda em uma determinada situação. Isso acontece quando uma ordem MT5-moret se transforma em uma MT5-position. Se você tentar encontrar essa situação em alguns servidores, poderá obter uma falha contábil. Escrevi uma demonstração para isso.

#define  MT4ORDERS_BYPASS_MAXTIME 1000000 // Tempo máximo (em µs) para aguardar a sincronização do ambiente de negociação
#include <MT4Orders.mqh> // https://www.mql5.com/pt/code/16006

#define  Ask SymbolInfoDouble(_Symbol, SYMBOL_ASK)
#define  MinLot SymbolInfoDouble(_Symbol, SYMBOL_VOLUME_MIN)

double GetLots()
{
  double Lots = 0;
  
  for (int i = OrdersTotal() - 1; i >= 0; i--) // Executar todas as ordens - pode haver uma falha aqui.
    if (OrderSelect(i, SELECT_BY_POS))
      Lots += OrderLots();
      
  return(NormalizeDouble(Lots, 2));
}

void OnStart()
{
  MT4ORDERS::OrderSend_MaxPause = 0; // Rejeitar a correção do resultado MT5-OrderSend incorporado.

  const double NewLots = 0.11;
  
  while (!IsStopped())
  {
    const double Lots = NormalizeDouble(GetLots() + NewLots, 2); // Quantos lotes devem ser totais após a colocação de uma ordem.
    const TICKET_TYPE Ticket = OrderSend(_Symbol, OP_BUY, NewLots, Ask, 0, 0 ,0); // Uma ordem de mercado foi colocada.
    
    if (Ticket != -1)
    {
      while (!PositionSelectByTicket(Ticket)) // Aguarde até que a ordem de mercado se transforme em uma posição.
      {
        const double Lots2 = GetLots(); // Calcule o volume total.
        
        if (Lots2 != Lots) // O volume total não corresponde ao cálculo preliminar - saída.
          Alert((string)Lots + " " + (string)Lots2);                        
      }
    }
          
    if (OrderSelect(Ticket, SELECT_BY_TICKET) &&
        OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(), 0)) // Enviar uma ordem de mercado para fechar a posição.
      while (PositionSelectByTicket(Ticket))                          // Aguardando o fechamento da posição.
        ;      
  }
    
  Print(MT4ORDERS::ByPass.ToString()); // Imprimir as estatísticas de sincronização.
}


Esse EA funcionará em algumas configurações. O modo ByPass torna os valores de alerta estáveis, mas ainda não os elimina.


Eu mesmo não opero sem o ByPass-mode, porque ele é muito forte para contornar as surpresas do MT5. Também não opero sem snapshots. É o mecanismo de snapshot que permite que você se cure da superindexação.


Este é o aspecto do mesmo exemplo.

#define  VIRTUAL_SNAPSHOT_REFRESHTIME 1000 // Tempo de vida do instantâneo para atualização. No MT5, é necessário conectar o MT4Orders.mqh
#define  VIRTUAL_SNAPSHOT_WITHOUT_HISTORY // Descarte do instantâneo do histórico para melhorar o desempenho
#include <fxsaber\Virtual\Virtual.mqh> // https://www.mql5.com/pt/code/22577

double GetLots()
{
  double Lots = 0;

  VIRTUAL::Snapshot(0, -1, false, ""); // Ambiente de negociação real Zasnepsholy.
  
  for (int i = OrdersTotal() - 1; i >= 0; i--) // Devido ao mecanismo de instantâneo, execute todos os pedidos com segurança.
    if (OrderSelect(i, SELECT_BY_POS))
      Lots += OrderLots();

  VIRTUAL::SnapshotDelete(); // Removido o instantâneo.
      
  return(NormalizeDouble(Lots, 2));
}


Recomendo o pacote ByPass+Snapshot. Ele não só ajuda a contornar as armadilhas, mas também reduz significativamente o consumo de recursos computacionais. Especialmente quando há muitas ordens/consultores de várias moedas.