MT5 e velocidade em ação - página 60

 
Anton:

Código de teste:

Este código mostra que o autor não entende o problema.

Prove-o.
// Классический SYMBOL_BID vs Альтернативный SYMBOL_BID.
// Запускать только на демо-счетах.

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

#define  Ask SymbolInfoDouble(_Symbol, SYMBOL_ASK)

bool GetPosition( const int Type = OP_BUY )
{
  bool Res = false;
  
  for (int i = PositionsTotal() - 1; (i >= 0) && !Res; i--)
    Res = PositionGetTicket(i) && (PositionGetInteger(POSITION_TYPE) == Type) && 
                                  (PositionGetString(POSITION_SYMBOL) == _Symbol);
                                  
  return(Res);
}

// Альтернативный способ получения Bid-цены текущего символа.
// Запускать только на демо-счетах.
double GetBid()
{
  static const TICKET_TYPE Ticket = GetPosition() ? PositionGetInteger(POSITION_TICKET) : OrderSend(_Symbol, OP_BUY, 0.1, Ask, 0, 0, 0);
  
  return(PositionSelectByTicket(Ticket) ? PositionGetDouble(POSITION_PRICE_CURRENT) : 0);
}

#define  TOSTRING(A) ", "#A + " = " + (string)(A)

#define  MACROS(A, B)                                              \
  const ulong StartTime##A = GetMicrosecondCount();               \
  const double A = B;                                             \
  const ulong Interval##A = GetMicrosecondCount() - StartTime##A; \
                                                                  \
  if (Interval##A > 100)                                          \
    Time##A += (long)Interval##A;  

long TimeBid1 = 0; // Суммарное время на длительный SYMBOL_BID
long TimeBid2 = 0; // Суммарное время на длительный GetBid()

const bool Init = EventSetTimer(10) && GetBid(); // Будем выводить статистику каждый 10 секунд.

void OnTimer()
{
  // На сколько отстает один вариант от другого по времени выполнения.
  Alert(TOSTRING(TimeBid1 - TimeBid2) + " mcs." + TOSTRING(TimeBid1) + TOSTRING(TimeBid2));
}

void OnTick()
{  
  const uint StartTime = GetTickCount();
  
//  return;
  
  while (!IsStopped() && (GetTickCount() - StartTime < 10000))
  {
    MACROS(Bid1, SymbolInfoDouble(_Symbol, SYMBOL_BID))
    MACROS(Bid2, GetBid())
      
//    if (Bid1 != Bid2)
//      Alert("Error!" + TOSTRING(Bid1) + TOSTRING(Bid2));
    
//    Sleep(0); // Специально убрал.
  }
}

Esta EA obtém o preço de licitação do símbolo atual de duas maneiras. Para cada um deles, ele resume o tempo de execução dos longos casos de execução. E depois mostra a diferença entre os dois.


Carregados 6/8 agentes. E executou esta EA em seis gráficos (símbolos diferentes) na demonstração doRannForex-Server. Resultado.

2020.10.26 16:10:40.596 Test9 (EURNZD,H1)       Alert: , TimeBid1-TimeBid2 = 236507295 mcs., TimeBid1 = 246491044, TimeBid2 = 9983749
2020.10.26 16:10:42.596 Test9 (CAC40,H1)        Alert: , TimeBid1-TimeBid2 = 235249710 mcs., TimeBid1 = 241768964, TimeBid2 = 6519254
2020.10.26 16:10:44.267 Test9 (DAX30,H1)        Alert: , TimeBid1-TimeBid2 = 243552816 mcs., TimeBid1 = 253424672, TimeBid2 = 9871856
2020.10.26 16:10:44.382 Test9 (DJI30,H1)        Alert: , TimeBid1-TimeBid2 = 265778370 mcs., TimeBid1 = 272279313, TimeBid2 = 6500943
2020.10.26 16:10:44.623 Test9 (ASX200,H1)       Alert: , TimeBid1-TimeBid2 = 210921561 mcs., TimeBid1 = 219901110, TimeBid2 = 8979549
2020.10.26 16:10:44.732 Test9 (FTSE100,H1)      Alert: , TimeBid1-TimeBid2 = 226824499 mcs., TimeBid1 = 235809635, TimeBid2 = 8985136

Temos uma prova completa de que o tempo total de execução(TimeBid1) da SYMBOL_BID está perdendo desastrosamente (TimeBid2) para a alternativa de obter o preço Bid.


Esta solução tipo muleta de obter os preços atuais bate o desempenho da própria função principal da MQL5. Você concorda com esta prova?


Eu gostaria de ter pensado nesta muleta eloqüente antes.


ZZZY A EA precisa permitir que algo comercial funcione. Por isso, só execute-o em contas de demonstração.

 
fxsaber:

Esta EA obtém o preço de licitação do símbolo atual de duas maneiras.

POSITION_PRICE_CURRENT is snapped?

Então com o que estamos comparando? Obter o último preço armazenado (quando?) com a obtenção do último preço conhecido pelo terminal?

Bem e cerca de 6 dos 8 núcleos disseram diretamente para cima. Por que tais testes?

 
fxsaber:

Este código mostra que o autor não entende o problema.

Sua declaração prova que você não quer ver o óbvio.

Este código mostra que não há "SymbolInfoTick braking".

Em hardware mais ou menos moderno, o tempo de execução do SymbolInfoTick é inferior a 1 MICROSsegundo.

Este consultor especializado recebe o preço de licitação do símbolo atual de duas maneiras. Para cada um deles, ele resume o tempo de execução dos longos casos de execução. E depois mostra a diferença entre eles.

Carregados 6/8 agentes. E executou esta EA em seis gráficos (símbolos diferentes) na demonstração doRannForex-Server. Resultado.

Temos uma prova completa de que o tempo total de execução(TimeBid1) da SYMBOL_BID está perdendo desastrosamente (TimeBid2) em relação à alternativa de obter o preço de Bid.

Esta solução tipo muleta de obter os preços atuais bate o desempenho da própria função principal da MQL5. Você concorda com esta prova?

Eu gostaria de ter pensado nesta muleta eloqüente antes.

ZZZY A EA precisa permitir que algo comercial funcione. Portanto, pode ser útil executá-lo apenas em contas de demonstração.

Não, isso não é prova. Um teste absolutamente imundo que não pode ser levado a sério.

Nem vou me dar ao trabalho de entrar em detalhes, o fato de você estar novamente cronometrando uma única chamada usando GetMicrosecondCount(), e novamente com "Agentes 6/8 carregados" em uma CPU de 4 kernel em segundo plano.

Já mostrei claramente acima que também é possível encontrar freios imaginários na execução "x++" desta maneira.

Sua declaração sobre "SymbolInfoTick freios" é elementar verificada e refutada pelo meu código, muito simples e óbvia.

A implementação original do SymbolInfoTick, embora bastante rápida, permitiu picos de tempo de execução esporádicos em roscas individuais sob carga multi-tarefa estressante.

Nas últimas construções, ele também não tem este inconveniente.

É simplesmente incrível que você continue discutindo com alguém que sabe exatamente do que ele está falando, ou seja, vê implementações e pode traçar o perfil delas em diferentes modos.

"Vamos discutir sobre o sabor das ostras e dos cocos com aqueles que os comeram".

 
Andrey Khatimlianskii:

POSITION_PRICE_CURRENT is snapped?

O número MT4Orders é usado apenas para colocar uma posição.

Então com o que estamos comparando? Obtenção do último preço poupado (quando?) versus a obtenção do último preço conhecido pelo terminal?

Comparamos a duração do preço obtido do Market Watch e a posição. Os preços, evidentemente, coincidem.

E cerca de 6 dos 8 núcleos disseram diretamente. Por que tais testes?

Apenas para fazer até mesmo um cego ver que existe um problema. É um absurdo, quando o Bid-price não abranda via posição e o SymbolInfoTick fica horrivelmente atrasado.


Tenho a sensação de que esta parede do MQ não passará sem o apoio dos usuários do fórum. O código é curto, os profissionais devem ser capazes de agarrá-lo rapidamente. Não há falhas nele. É claramente demonstrado que os preços são obtidos muito mais rapidamente das posições do que da Market Watch. Como os MQs não vêem o óbvio - eu não entendo.

 
Anton:

Sua declaração prova que você não quer ver o óbvio.

Este código mostra que não há "SymbolInfoTick braking".

Em hardware mais ou menos moderno, o tempo de execução do SymbolInfoTick não excede 1 MICROsecond.

Não, não é uma prova. Um teste absolutamente sujo que não pode ser levado a sério.

Nem vou me preocupar em entrar em detalhes, o fato de que você está novamente medindo o tempo de uma única chamada pela GetMicrosecondCount(), e novamente sobre o fundo de "Agentes 6/8 carregados" em uma CPU de 4 núcleos é suficiente.

Já mostrei claramente acima que também é possível encontrar freios imaginários na execução "x++" desta maneira.

Sua declaração sobre "SymbolInfoTick freios" é elementar verificada e refutada pelo meu código, muito simples e óbvia.

A implementação original do SymbolInfoTick, embora bastante rápida, permitiu picos de tempo de execução esporádicos em roscas individuais sob carga multi-tarefa estressante.

Nas últimas construções, ele também não tem este inconveniente.

É simplesmente incrível que você continue discutindo com alguém que sabe exatamente do que ele está falando, ou seja, vê implementações e pode traçar o perfil delas em diferentes modos.

"Vamos discutir sobre o sabor das ostras e dos cocos com aqueles que os comeram".

Você ainda não olhou para o código. Eu não acredito na incompetência.

  if (Interval##A > 100)                                          \
    Time##A += (long)Interval##A;

É uma condição em que somente se a execução durasse mais de 100µs é que conta. Se você acha que é um valor pequeno, faça dele uma ordem de magnitude maior. O efeito é o mesmo.

Ambas as funções que estão sendo comparadas estão em condições absolutamente iguais. Uma está na frenagem final, a outra não. Veja mais uma vez de perto o que o código mede.


No momento, a substituição do SymbolInfoTick em EAs de combate pela muleta sugerida remove quase todos os atrasos associados à obtenção dos preços atuais. É um delírio, mas infelizmente, é.


HI Observe o tempo em OnTick. É feito deliberadamente para pegar carrapatos que vieram depois que o OnTick foi aceito. O código não foi escrito do nada. Não é um for-cycle completamente artificial, medindo a temperatura média hospitalar em condições ideais.

 
fxsaber:

Sinto que este muro do MQ não conseguirá passar sem o apoio dos membros do fórum. O código é curto, os profissionais devem ser capazes de descobri-lo rapidamente. Lá não há falhas. É claramente demonstrado que os preços através de posições são obtidos muito mais rapidamente do que através do Market Watch. Como a MQ não consegue ver o óbvio - eu não entendo.

Não há erros no código, então SymbolInfoTick é mais lento do que obter o preço de uma posição aberta

bom hack recebendo preço da posição, não teria adivinhado ou percebido que poderia haver tal diferença
 
fxsaber:

Só para que mesmo uma pessoa cega possa ver que existe um problema. Bem, é um absurdo quando o preço da licitação por posição não é lento, mas o SymbolInfoTick está atrasado de uma forma terrível.

Tente testar SymbolInfoTick quando houver apenas um símbolo na visão geral do mercado e quando houver dezenas de símbolos, mas peça um único símbolo - como em seu exemplo

é altamente provável que o servidor tenha tráfego comprimido e que o SymbolInfoTick tenha esta defasagem intermitente ao descomprimir os dados

ou seja, quando há muitos caracteres, haverá mergulhos ainda mais freqüentes ou mais profundos em tempo de teste


portanto, se isto se provar verdadeiro, então refazer toda a arquitetura.... prazer questionável

 
Igor Makanu:

tente testar SymbolInfoTick quando há apenas um símbolo na visão geral do mercado e quando há dezenas de símbolos, mas peça uma ferramenta - como em seu exemplo

há uma alta probabilidade de que o servidor esteja enviando tráfego comprimido e que o SymbolInfoTick esteja sofrendo atrasos periódicos quando os dados estão sendo descompactados

ou seja, quando há muitos símbolos, haverá mergulhos ainda mais freqüentes ou mais profundos em tempo de teste.

Esta hipótese se refere a este caso quando os preços no Market Watch estão atrasados em relação aos preços do tumblr (e vice versa). Mas até agora estamos falando apenas da frenagem do próprio SymbolInfoTick dentro do Terminal, sem tocar na questão da relevância do preço.

 
fxsaber:

As duas funções que estão sendo comparadas estão exatamente nas mesmas condições.

Pelo menos o GetBid é chamado após SymbolInfoDouble. Se os trocarmos, o resultado será o mesmo?

Algo me diz quePOSITION_PRICE_CURRENT leva o preço armazenado, e não o preço fresco.

Também não vejo a utilidade de testar em uma CPU com 80% de carga. Estamos testando o desempenho da CPU e a alocação de recursos pelo vento, não as características de que precisamos.

 
Andrey Khatimlianskii:

Pelo menos o GetBid é chamado após SymbolInfoDouble. Se você trocá-lo, o resultado será o mesmo?

Experimentado antes da publicação. Não, isso não afeta o resultado.

Algo me diz quePOSITION_PRICE_CURRENT leva o preço armazenado, e não o preço fresco.

Esse é o ponto, os programas MQL precisam do último preço que chegou ao terminal, não de outra coisa. Quando um tick chega ao Terminal, ele atualiza automaticamente todas as tabelas de posição/ordem.

Bem e novamente, não vejo a utilidade de testar em uma CPU com 80% de carga. Estamos testando o desempenho da CPU e a alocação de recursos pelo vento, não as características de que precisamos.

A condição principal é que o ambiente seja idêntico para ambas as funções. A carga da CPU é o fator mais marcante para a visibilidade da discrepância.

Vinte EAs em paralelo podem às vezes fazer uma chamada SymbolInfoTick ao mesmo tempo, depois há um estouro de milissegundos de carga e desfasamentos. Apenas sugeri fazê-lo explicitamente para que o problema seja imediatamente perceptível.


Novamente, as condições de teste são idênticas para ambas as funções. Fato.

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

MT5 e Velocidade em Ação

fxsaber, 2020.10.26 17:53

No momento, a substituição do SymbolInfoTick em EAs de combate pela muleta proposta remove quase toda a frenagem associada à obtenção dos preços atuais. É um delírio, mas infelizmente, é.