Bibliotecas: MT4Orders - página 23

 
Sergey Likho:

Ao mesmo tempo, o registro também mostra uma mensagem de que tudo está normal.

Há vários links nesta página sobre esse tópico. Em resumo, você pode ver um Result.deal nulo no registro. É possível ver no log (Request.position não nulo) que foi feito um OrderClose, que supostamente foi concluído com êxito (Result.code), mas, ao mesmo tempo, nenhum registro (DEAL_ENTRY_OUT deal) sobre ele apareceu no terminal por um segundo (a biblioteca estava aguardando). Isso indica dois cenários:

  1. Uma ordem de negociação MT5 foi enviada com sucesso, mas a negociação MT5 não foi concluída.
  2. A negociação foi aprovada, mas não apareceu no histórico de negociações.

Ambos os cenários nem sempre são bons para o MT5 (consulte o link acima para obter uma discussão detalhada). Infelizmente, a biblioteca funcionou claramente. Todas essas nuances já foram analisadas cuidadosamente e, portanto, a biblioteca desenvolveu reações razoáveis a elas.

 
Sergey Likho:

Se eu usar o corretor de demonstração da fhtm para testes, a função OrderSend abre uma negociação, mas retorna um erro.

Repeti o teste e descobri que a culpa foi minha. Obrigado pela mensagem, comportamento interessante do MT5 nesse servidor de negociação.

Corrigi o problema. Se precisar, posso enviá-la para sua PM. E assim, para não incomodar os moderadores, postarei a mensagem na KB, quando os desenvolvedores resolverem o DEAL_SL/TP em novas versões.

 
fxsaber:

Repeti a operação e descobri que a culpa foi minha. Obrigado por sua mensagem, o comportamento interessante do MT5 nesse servidor de negociação.

Corrigi o problema. Se precisar, posso enviá-la para sua PM. E assim, para não incomodar os moderadores, vou postar na KB, quando os desenvolvedores resolverem o DEAL_SL/TP em novas compilações.

Sim, envie-o para sua PM

 
Sergey Likho:

Sim, por favor, me envie uma MP

Enviado.

Raramente, mas podem ocorrer tais alertas

Alert: OrderSend(2210958493) - BUG!
Alert: Please send the logs to the author - https://www.mql5.com/en/users/fxsaber
::AccountInfoString(ACCOUNT_SERVER) = ForexTimeFXTM-Demo01
(bool)::TerminalInfoInteger(TERMINAL_CONNECTED) = true
::TerminalInfoInteger(TERMINAL_PING_LAST) = 66676
::TerminalInfoDouble(TERMINAL_RETRANSMISSION) = 13.63636363636363
::TerminalInfoInteger(TERMINAL_BUILD) = 1861
(bool)::TerminalInfoInteger(TERMINAL_X64) = true
MT4ORDERS::IsHedging = true
Res = true
MT4ORDERS::OrderSendBug = 1
Request.action = TRADE_ACTION_DEAL (1)
Request.magic = 0
Request.order = 0
Request.symbol = EURUSD
Request.volume = 1.0
Request.price = 1.15758
Request.stoplimit = 0.0
Request.sl = 0.0
Request.tp = 0.0
Request.deviation = 0
Request.type = ORDER_TYPE_SELL (1)
Request.type_filling = ORDER_FILLING_FOK (0)
Request.type_time = ORDER_TIME_GTC (0)
Request.expiration = 1970.01.01 00:00:00
Request.comment = 
Request.position = 0
Request.position_by = 0
Result.retcode = 10009
Result.deal = 2208425527
Result.order = 2210958493
Result.volume = 1.0
Result.price = 0.0
Result.bid = 0.0
Result.ask = 0.0
Result.comment = Request executed 180.441 + 9.521 (1) ms.
Result.request_id = 153
Result.retcode_external = 0

Este é um alerta puramente informativo (não afeta a negociação) de que o MT5-OrderSend está trabalhando com um erro. Esse erro é discutido em detalhes aqui. No entanto, os desenvolvedores ainda não acreditam que esse seja um comportamento incorreto do MT5...


ZY Uma sutileza do MT5 foi revelada. As ordens fantasmas não ocorrerão ao negociar por meio da biblioteca.

 
Andrey Khatimlianskii:

Trabalhar com um longo histórico agora simplesmente voa!

Alguns resultados inesperados. O script calcula a hora de abertura/fechamento da última "posição".

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

Consultor especialista OrderCloseTime MQL5

fxsaber, 2018.07.06 00:49

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

void LastTimeMQL4( datetime &OpenTime, datetime &CloseTime )
{
  if (OrderSelect(OrdersHistoryTotal() - 1, SELECT_BY_POS, MODE_HISTORY))
  {
    OpenTime = OrderOpenTime();
    CloseTime = OrderCloseTime();
  }
}

void LastTimeMQL5( datetime &OpenTime, datetime &CloseTime )
{
  if (HistorySelect(0, INT_MAX))
  {
    for (int i = HistoryDealsTotal() - 1; i >= 0; i--)
    {
      const ulong Ticket = HistoryDealGetTicket(i);
  
      if (HistoryDealGetInteger(Ticket, DEAL_ENTRY) == DEAL_ENTRY_OUT)
      {
        CloseTime = (datetime)HistoryDealGetInteger(Ticket, DEAL_TIME);

        if (HistorySelectByPosition(HistoryDealGetInteger(Ticket, DEAL_POSITION_ID)))
          OpenTime = (datetime)HistoryDealGetInteger(HistoryDealGetTicket(0), DEAL_TIME);
          
        break;
      }
    }
  }
}

typedef void (*GetLastTime)( datetime&, datetime& );

void Bench( GetLastTime LastTime, const int Amount = 10000 )
{
  datetime OpenTime, CloseTime;
  datetime Tmp = 0;

  for (int i = 0; i < Amount; i++)
  {
    LastTime(OpenTime, CloseTime);
    
    Tmp += CloseTime - OpenTime;        
  }
  
  Print(Tmp);
}

#define  BENCH(A)                                                              \
{                                                                             \
  const ulong StartTime = GetMicrosecondCount();                              \
  A;                                                                          \
  Print("Time[" + #A + "] = " + (string)(GetMicrosecondCount() - StartTime)); \
}

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

void OnStart()
{  
  if (HistorySelect(0, INT_MAX))
    PRINT(HistoryDealsTotal());

  BENCH(Bench(LastTimeMQL4))
  BENCH(Bench(LastTimeMQL5))  
}


Resultado

HistoryDealsTotal() = 343
1970.01.01 00:00:00
Time[Bench(LastTimeMQL4)] = 88705
1970.01.01 00:00:00
Time[Bench(LastTimeMQL5)] = 749410

Não analisei por que o desempenho da biblioteca é tão superior ao da MQL5 pura. Presumo que o HistorySelect fica mais lento em tempo real. Não verifiquei isso no testador.


Sim, o HistorySelect fica mais lento.

 

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

Bibliotecas: MT4Orders

fxsaber, 2017.09.03 18:52

// Lista de modificações:
// 03.09.2017:
// Adicionar: Adicionado OrderTicketOpen() - Ticket MT5 da transação de abertura de posição
// OrderOpenReason() - motivo da transação de abertura do MT5 (motivo para abrir uma posição)
// OrderCloseReason() - причина проведения MT5-сделки закрытия (причина закрытия позиции)


Impressão de todas as posições fechadas pelo SL

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

Como descobrir o preço de fechamento quando a posição entrou em stop loss?

fxsaber, 2018.07.10 11:46 AM

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

void OnStart()
{
  const int Total = OrdersHistoryTotal();
  
  for (int i = 0; i < Total; i++)
    if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY) && (OrderCloseReason() == DEAL_REASON_SL))
      OrderPrint();  
}
 
fxsaber:

Um resultado um tanto inesperado. O script calcula a hora de abertura/fechamento da última "posição".

Não analisei por que o desempenho da biblioteca é muito melhor do que o da MQL5 pura. Presumo que o HistorySelect fique mais lento em tempo real. Não verifiquei isso no Tester.

Sim, o HistorySelect fica mais lento.

Esta é a versão mais recente da biblioteca?

 
Vitaly Muzichenko:

Esta é a versão mais recente da biblioteca?

Sim.

 

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

Bibliotecas: MT4Orders

fxsaber, 2017.02.16 15:16

Consegui encontrar problemas de execução no MT5 com esse script. Recomendo que você verifique sua conexão Terminal+Servidor de Negociação e, em caso de problemas, informe ao Service Desk.


Script atualizado no aplicativo. Localiza rapidamente, por exemplo, esses problemas

2018.07.24 10:24:19.177 Trades  '35247942': market buy 0.01 USDHKD
2018.07.24 10:24:19.246 Trades  '35247942': failed market buy 0.01 USDHKD [No prices]
2018.07.24 10:24:19.246 Trades  '35247942': buy limit 0.01 USDHKD at 7.83618
2018.07.24 10:24:19.315 Trades  '35247942': failed buy limit 0.01 USDHKD at 7.83618 [No prices]
2018.07.24 10:24:19.316 Trades  '35247942': buy stop 0.01 USDHKD at 7.85618
2018.07.24 10:24:19.384 Trades  '35247942': failed buy stop 0.01 USDHKD at 7.85618 [No prices]
Arquivos anexados:
 

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

Bibliotecas: MT4Orders

Andrey Khatimlianskii, 2018.06.06 01:53 pm.

// 30.05.2018
// Acrescentar: trabalho acelerado com histórico comercial, selecionado uma média de ouro de realizações entre desempenho e
// consumo de memória - importante para VPS. É usada a biblioteca genérica padrão.
// Se você não quiser usar a biblioteca Generic, o modo antigo de trabalhar com o histórico está disponível.
// Para fazer isso, você precisa escrever a seguinte linha na biblioteca MT4Orders ANTES da biblioteca MT4Orders
//
// #define MT4ORDERS_FASTHISTORY_OFF // Desative a implementação do histórico de negociação rápida - não use a biblioteca genérica.

Trabalhar com um longo histórico agora é muito fácil!

Verificando os ganhos genéricos em números
#define  MT4ORDERS_FASTHISTORY_OFF // Desative a implementação rápida do histórico comercial - não use a biblioteca Generic.
#include <MT4Orders.mqh>

double HistoryToDouble( void )
{
  double Res = 0;

  for (int i = OrdersHistoryTotal() - 1; i >= 0; i--)
    if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY))
      Res += OrderCloseTimeMsc() - OrderOpenTimeMsc() + OrderProfit() + OrderTicket() - OrderTicketOpen();
    
  return(Res);
}

#define  BENCH(A)                                                              \
{                                                                             \
  const ulong StartTime = GetMicrosecondCount();                              \
  A;                                                                          \
  Print("Time[" + #A + "] = " + (string)(GetMicrosecondCount() - StartTime)); \
}

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

void OnStart()
{  
  if (HistorySelect(0, INT_MAX))
  {
    PRINT(HistoryDealsTotal());
    PRINT(HistoryOrdersTotal());
  }

  for (int i = 0; i < 3; i++)
  {
    PRINT(i);
    BENCH(Print(HistoryToDouble()))    
  }
}


Resultado sem genérico

HistoryDealsTotal() = 10063
HistoryOrdersTotal() = 20296
i = 0
1195028482.07
Time[Print(HistoryToDouble())] = 829525
i = 1
1195028482.07
Time[Print(HistoryToDouble())] = 885207
i = 2
1195028482.07
Time[Print(HistoryToDouble())] = 918911


Resultado com o genérico

HistoryDealsTotal() = 10063
HistoryOrdersTotal() = 20296
i = 0
1195028482.07
Time[Print(HistoryToDouble())] = 52603
i = 1
1195028482.07
Time[Print(HistoryToDouble())] = 39051
i = 2
1195028482.07
Time[Print(HistoryToDouble())] = 34409


Em um histórico com 10 mil negociações e 20 mil ordens, a variante Generic é cerca de 30 vezes mais rápida. Quanto maior o histórico de negociações, mais perceptível é a aceleração.