Bibliotecas: MT4Orders - página 86

 
Obrigado por compartilhar.
 
Muito obrigado!!! Isso é super INCRÍVEL
 
Às vezes, você precisa usar um tíquete fechado para encontrar sua posição no histórico de negociação.
// Retorna a posição do tíquete na tabela de pedidos históricos.
int OrderSelectPos( const long Ticket = -1 )
{
#ifdef  MT4ORDERS_ORDERS_SORT
  #ifdef __MQL5__
    #ifdef __VIRTUAL__
      if (!VIRTUAL::GetHandle())
    #endif // #ifdef __VIRTUAL__
    
    return(-1);  
  #endif // #ifdef __MQL5__ 
#else // #ifdef MT4ORDERS_ORDERS_SORT
  #ifdef __VIRTUAL__
    if (VIRTUAL::GetHandle())
      return(-1);  
  #endif // #ifdef __VIRTUAL__ 
#endif // #ifdef MT4ORDERS_ORDERS_SORT #else

  int Pos = -1;
  
  if (::OrderSelect(Ticket, SELECT_BY_TICKET, MODE_HISTORY) && ::OrderCloseTime())
  {
    static int PrevHistoryTotal = 0;
    static CHashMap<long, int> Tickets;
        
    const long SearchTicket = (::OrderType() <= OP_SELL) ? ::OrderTicket() : -::OrderTicket();    
    const int Total = ::OrdersHistoryTotal();
    
    while (PrevHistoryTotal < Total)
    {
      if (::OrderSelect(PrevHistoryTotal, SELECT_BY_POS, MODE_HISTORY))        
      {
        const long NewTicket = (::OrderType() <= OP_SELL) ? ::OrderTicket() : -::OrderTicket();
        
        if (NewTicket == SearchTicket)
          Pos = PrevHistoryTotal;
          
        Tickets.Add(NewTicket, PrevHistoryTotal);       
      }
      
      PrevHistoryTotal++;      
    }
    
    if ((Pos == -1) && !Tickets.TryGetValue(SearchTicket, Pos))
      Pos = -1;
  }
  
  return(Pos);
}


Verifique.

void OnStart()
{  
  long Tickets[];
  
  // Correção.
  for (uint i = ArrayResize(Tickets, OrdersHistoryTotal()); (bool)i--;)
    if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY))
    {
      Tickets[i] = OrderTicket();
      
      if (OrderSelectPos(OrderTicket()) != i)
        Print(i);
    }

  const ulong StartTime = GetMicrosecondCount();

  // Desempenho.
  for (uint i = ArraySize(Tickets); (bool)i--;)
    if (OrderSelectPos(Tickets[i]) == -1)
      Print(i);
      
  Print(DoubleToString((double)(GetMicrosecondCount() - StartTime) / ArraySize(Tickets), 2) + " mcs/unit.");
}


Resultado.

1.62 mcs/unit.
 

Com um grande número de negociações/ordens do MT5 no modo ByPass (eu uso, por exemplo, no CustomReport), o primeiro acesso ao histórico pode levar muito tempo.

#define  MT4ORDERS_BYPASS_MAXTIME 1000000 // Tempo máximo (em µs) para aguardar a sincronização do ambiente de negociação 
#include <MT4Orders.mqh>

#define  PRINT(A) Print(#A + " = " + (string)(A))

void OnStart()
{  
  for (int i = 0; i < 3; i++)
  {
    const ulong StartTime = GetMicrosecondCount();
    PRINT(OrdersHistoryTotal());
    PRINT(GetMicrosecondCount() - StartTime);
  }
  
  PRINT(HistoryDealsTotal());
  PRINT(HistoryOrdersTotal());
}
OrdersHistoryTotal() = 235627
GetMicrosecondCount() - StartTime = 14831029

HistoryDealsTotal() = 259381
HistoryOrdersTotal() = 619850

14 segundos!


Descobriu-se que os freios vêm da função ArrayCopy.


Essa edição em Include\fxsaber\TradesID\ByPass.mqh

  bool IsPosDeal( const ulong Ticket )
  {
    bool Res = true;

    const ulong PositionID = ::HistoryDealGetInteger(Ticket, DEAL_POSITION_ID);

    if (PositionID)
    {
      static ulong Deals[];
// .....

  bool IsPosOrder( const ulong Ticket )
  {
    bool Res = true;

    const ulong PositionID = ::HistoryOrderGetInteger(Ticket, ORDER_POSITION_ID);

    if (PositionID)
    {
      const long TicketTime = ::HistoryOrderGetInteger(Ticket, ORDER_TIME_DONE_MSC);

      static ulong OldOrders[];
// .....

aumenta o desempenho em 4,5 vezes - ~3 segundos.

OrdersHistoryTotal() = 235627
GetMicrosecondCount() - StartTime = 3307875


Um exemplo claro de que o trabalho frequente com matrizes deve ser feito com sabedoria. Nesse caso, a estática permite que você não aloque memória para uma matriz no ArrayCopy todas as vezes. E obtemos um aumento de desempenho múltiplo em uma tarefa real, que pode ser sentido a olho nu.

Проверь своего брокера!
Проверь своего брокера!
  • 2021.11.12
  • www.mql5.com
На просторах интернета можно видеть довольно частые сценарии торговли. Управляющий ПАММ-счетом набрал инвесторов. Хорошо торговал, но с какого-то момента прибыльность сильно уменьшилась, вплоть до
 
fxsaber #:

Com um grande número de negociações/ordens do MT5 no modo ByPass (eu uso, por exemplo, no CustomReport), o primeiro acesso ao histórico pode levar muito tempo.

O ByPass.mqh atualizado permitiu acelerar esse procedimento 15 vezes nos testes.
 

Olá autor, ao usar a função OrderSendAsync, notei que MT4ORDERS::LastTradeResult.retcode é igual a TRADE_RETCODE_DONE . No entanto, em seu código, ele verifica se MT4ORDERS::LastTradeResult.retcode == TRADE_RETCODE_PLACED. Isso pode ser um erro ou é um mal-entendido meu?

#define  RETURN_ASYNC(A) return((A) && ::OrderSendAsync(MT4ORDERS::LastTradeRequest, MT4ORDERS::LastTradeResult) &&                        \
                               (MT4ORDERS::LastTradeResult.retcode == TRADE_RETCODE_PLACED) ? MT4ORDERS::LastTradeResult.request_id : 0);
 
hini #:

Ao usar a função OrderSendAsync, notei que MT4ORDERS::LastTradeResult.retcode é igual a TRADE_RETCODE_DONE

Nome do servidor?
 
fxsaber #:
Nome do servidor?
Esqueci de mencionar que estou usando o testador MT5. Isso não deve ter nada a ver com o servidor, certo?
 
hini #:
Esqueci de mencionar que estou usando o testador MT5. Isso não deve ter nada a ver com o servidor, certo?
Na negociação ao vivo, MT4ORDERS::LastTradeResult.retcode == TRADE_RETCODE_PLACED está de fato correto, enquanto no testador MT5 é TRADE_RETCODE_DONE . Esse foi o meu erro.
 
hini #:
Esqueci de mencionar que estou usando o testador MT5. Isso não deve ter nada a ver com o servidor, certo?

No testador, para a primeira execução bem-sucedida de MT5-OrderSend/OrderSendAsync, MqlTradeResult.request_id == 0.

Considero esse comportamento como um descuido por parte do MQ, pois o request_id deve começar com um.


Esse é um dos motivos pelos quais o MT4Orders não implementa o OrderSendAsync para o Tester. Há outro motivo menos bom(do livro).

Aviso. No Tester, a funçãoOrderSendAsync funciona comoOrderSend. Isso dificulta a depuração do processamento atrasado de solicitações assíncronas.
Учебник по MQL5: Автоматизация торговли / Создание экспертов / Отправка торгового запроса: OrderSend и OrderSendAsync
Учебник по MQL5: Автоматизация торговли / Создание экспертов / Отправка торгового запроса: OrderSend и OrderSendAsync
  • www.mql5.com
Для выполнения торговых операций MQL5 API предоставляет две функции: OrderSend и OrderSendAsync . Они, также как и OrderCheck , выполняют в...