Bibliotecas: MT4Orders - página 64

 
fxsaber:

Já tive ordens que atingiram a oitava centena. Em negociações ativas, essa é uma ocorrência comum com novas construções. Nesse caso, você deve fazer o hashmap de várias centenas de ordens.

Mas isso não acontece a cada 15 minutos, não é mesmo?
 
mktr8591:
Mas isso não acontece a cada 15 minutos, não é mesmo?

Sim.

 

Para aqueles que usam esse pacote.

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

Bibliotecas: MT4Orders

fxsaber, 2021.05.12 21:58

#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

Recomendo que você atualize o sincronizador.

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

Bibliotecas: TradesID

fxsaber, 2021.06.30 15:53

O ByPass.mqh foi atualizado. Ele funciona corretamente na situação de exclusão de uma ordem parcialmente executada. Adicionado registro de log quando ocorrem problemas.

Até que seja corrigido, recomendo trabalhar no b2958.

 
fxsaber:

Por favor, esclareça alguns pontos no código MT4Orders.mqh (a partir de 2021.06.01):

1. linha 1413 HistoryDealSelect2():
else if (::HistoryDealGetInteger(DealTicket, DEAL_TIME_MSC) < OrderTimeFill)
            break;

aqui o ciclo do histórico é interrompido se o tempo da negociação for menor que o tempo da ordem.

Não acontece na prática que o tempo de uma negociação no mqh é menor do que o tempo da ordem que a negociação executou (não me refiro a situações em que a ordem foi executada por várias negociações ao mesmo tempo)?

2. linha 2259 MT4OrderSend():

return((arrow_color == INT_MAX) ? (MT4ORDERS::NewOrderCheck() ? 0 : -1) :
           ((((int)arrow_color != INT_MIN) || MT4ORDERS::NewOrderCheck()) &&
            MT4ORDERS::OrderSend(MT4ORDERS::LastTradeRequest, MT4ORDERS::LastTradeResult)
          #ifdef  MT4ORDERS_BYPASS_MAXTIME
            && (!MT4ORDERS::IsHedging || _B2(MT4ORDERS::ByPass += MT4ORDERS::LastTradeResult.order))
          #endif // #ifdef MT4ORDERS_BYPASS_MAXTIME
                                                                                          ?
            (MT4ORDERS::IsHedging ? (long)MT4ORDERS::LastTradeResult.order : // PositionID == Result.order - recurso MT5-Hedge
             ((MT4ORDERS::LastTradeRequest.action == TRADE_ACTION_DEAL) ?
              (MT4ORDERS::IsTester ? (_B2(::PositionSelect(MT4ORDERS::LastTradeRequest.symbol)) ? PositionGetInteger(POSITION_TICKET) : 0) :
                                      // HistoryDealSelect em MT4ORDERS::OrderSend
                                      ::HistoryDealGetInteger(MT4ORDERS::LastTradeResult.deal, DEAL_POSITION_ID)) :
              (long)MT4ORDERS::LastTradeResult.order)) : -1));

Por que, para a compensação, a ordem não é adicionada a MT4ORDERS::ByPass+= ?

3: Em algumas funções, você usa a macro WHILE(A): linha 1088

#define  WHILE(A) while ((!(Res = (A))) && MT4ORDERS::Waiting())

Por que você não verifica IsStopped()? Para otimizar o tempo? E se o usuário definir OrderSend_MaxPause para vários segundos?

4. notei que antes de OrderSend(LastTradeRequest, LastTradeResult) você não limpa LastTradeResult. Isso é feito pela própria função? Como um recurso não documentado?

 
mktr8591:

Por favor, esclareça alguns pontos no código MT4Orders.mqh (a partir de 2021.06.01):

1. linha 1413 HistoryDealSelect2():

aqui o ciclo do histórico é interrompido se o tempo da negociação for menor que o tempo da ordem.

Não acontece na prática que o tempo de uma negociação no mqh é menor do que o tempo da ordem que a negociação executou (não me refiro a situações em que a ordem foi executada por várias negociações ao mesmo tempo)?

Muito fora de contexto. Veja onde HistoryDealSelect2 é chamado. O Result.deal está localizado lá, quando é nulo com o Result.order totalmente executado. Há um limite de tempo para salvar. passagem de loop. Provavelmente testado em um grande problema de histórico. Ainda não me lembro. Eu mesmo não uso o sincronizador incorporado no OrderSend, porque uso o nulo MT4ORDERS::OrderSend_MaxPause.

 
mktr8591:

2. linha 2259 MT4OrderSend():

Por que a ordem não é adicionada a MT4ORDERS::ByPass+= ?

Não pensei em ByPass para compensação. Eu o escrevo para mim mesmo.
 
mktr8591:

3. em algumas funções, você usa a macro WHILE(A): linha 1088

Por que você não verifica IsStopped()? Para otimizar o tempo? E se o usuário definir OrderSend_MaxPause para vários segundos?

Na prática, não vejo nenhum problema aqui. Definitivamente, não o adicionei por esquecimento.

 
mktr8591:

4. observei que antes de OrderSend(LastTradeRequest, LastTradeResult) você não limpa LastTradeResult. Isso é feito pela própria função? Como um recurso não documentado?

Parece que todos os campos MqlTradeResult são preenchidos pelo OrderSend, portanto, economizo na limpeza.

 
fxsaber:


Muito obrigado!

A biblioteca é ótima.

 
fxsaber:
Não projetei o ByPass para redes. Estou escrevendo-o para mim mesmo.
Analisei o código do ByPass do ponto de vista da rede - tudo deve funcionar bem. (é claro, você deve testá-lo).