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

 
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.

1. Seu teste realmente conta uma micro porcentagem das iterações devido à condição

if (Interval##A > 100)

Em essência, você só conta anomalias onde o processador está sobrecarregado com tarefas e deixa de executar uma determinada tarefa na prateleira distante, pois mais de 99% das iterações são executadas em menos de 1 microssegundo.

E mesmo se você definir a condição >0, ainda não há objetividade.

2. A medição do tempo de operações tão rápidas deve ser feita apenas como um tempo de ciclo completo, não como uma única iteração.

3. mas como o ciclo em seu exemplo é limitado a 10 segundos (Por quê! Para carrapatos, acho que 0,1 segundo é o suficiente. Porque pode muito bem acontecer que 3 ticks cheguem em um segundo, e todos os três ticks sejam executados por 10 segundos cada um, e em paralelo), portanto, não é necessário nenhum timing. É mais fácil calcular quantas iterações serão executadas em um determinado tempo. Quanto mais, maior será a produtividade.

Eu modifiquei seu código "um pouco". Acho que minha variante reflete melhor a realidade.

O cálculo é feito um de cada vez, a fim de não misturar as duas variantes. Os carrapatos numerados pares são paraSYMBOL_BID, ímpares - para GetBid().

Acrescentei somas e seus resultados apenas por precaução, como uma tentativa de enganar o compilador contra a otimização.
O resultado de saída é cumulativo.

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

#define  Ask SymbolInfoDouble(_Symbol, SYMBOL_ASK)
#define  TimeLoop 125  // 15.625*8  

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)


long N1=0;
long N2=0;
long n=0;
double sum1=0;
double sum2=0;

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

//+------------------------------------------------------------------+

void OnTick()
  {
//  return;
   const uint StartTime = GetTickCount();
   if(n%2==0)
      while(!IsStopped() && (GetTickCount() - StartTime < TimeLoop))
        {
         sum1+=SymbolInfoDouble(_Symbol, SYMBOL_BID);
         N1++;
        }
   else
      while(!IsStopped() && (GetTickCount() - StartTime < TimeLoop))
        {
         sum2+=GetBid();
         N2++;
        }
   if(n%2==0 && n>1)
      if (N1>N2) Print(_Symbol+": SYMBOL_BID быстрее GetBid() в " + DoubleToString(double(N1)/N2,2) + " раза. Среднее время одной итерации: SYMBOL_BID - " + DoubleToString((TimeLoop*1000000.0*n/2)/N1,2) + " ns, GetBid() - " + DoubleToString((TimeLoop*1000000.0*n/2)/N2,2) + " ns" + TOSTRING(sum1) + TOSTRING(sum2));
      else       Print(_Symbol+": GetBid() быстрее SYMBOL_BID в " + DoubleToString(double(N2)/N1,2) + " раза. Среднее время одной итерации: SYMBOL_BID - " + DoubleToString((TimeLoop*1000000.0*n/2)/N1,2) + " ns, GetBid() - " + DoubleToString((TimeLoop*1000000.0*n/2)/N2,2) + " ns" + TOSTRING(sum1) + TOSTRING(sum2));
      n++;
  }
//+------------------------------------------------------------------+

Meu resultado:

2020.10.26 19:26:46.193 FxSaberBidSpeed (USDCAD,M1)     USDCAD: SYMBOL_BID быстрее GetBid() в 2.97 раза. Среднее время одной итерации: SYMBOL_BID - 45.80 ns, GetBid() - 135.80 ns, sum1 = 106706334.7283292, sum2 = 35987491.50911281
2020.10.26 19:26:46.193 FxSaberBidSpeed (EURUSD,M1)     EURUSD: SYMBOL_BID быстрее GetBid() в 2.90 раза. Среднее время одной итерации: SYMBOL_BID - 45.10 ns, GetBid() - 130.82 ns, sum1 = 34042649.2788716,  sum2 = 11735304.45101236
2020.10.26 19:26:47.085 FxSaberBidSpeed (USDCAD,M1)     USDCAD: SYMBOL_BID быстрее GetBid() в 2.95 раза. Среднее время одной итерации: SYMBOL_BID - 45.57 ns, GetBid() - 134.55 ns, sum1 = 110131593.3516681, sum2 = 37303001.98488424
2020.10.26 19:26:52.397 FxSaberBidSpeed (USDCAD,M1)     USDCAD: SYMBOL_BID быстрее GetBid() в 2.99 раза. Среднее время одной итерации: SYMBOL_BID - 45.48 ns, GetBid() - 135.90 ns, sum1 = 113269505.1945728, sum2 = 37903458.6724181
2020.10.26 19:26:59.412 FxSaberBidSpeed (EURUSD,M1)     EURUSD: SYMBOL_BID быстрее GetBid() в 2.85 раза. Среднее время одной итерации: SYMBOL_BID - 45.16 ns, GetBid() - 128.57 ns, sum1 = 36611618.7279973,  sum2 = 12858907.51985167
2020.10.26 19:27:00.131 FxSaberBidSpeed (BTCUSD,M1)     BTCUSD: SYMBOL_BID быстрее GetBid() в 2.78 раза. Среднее время одной итерации: SYMBOL_BID - 47.10 ns, GetBid() - 130.88 ns, sum1 = 305215291120.0239, sum2 = 109832697267.1495
2020.10.26 19:27:03.303 FxSaberBidSpeed (USDCAD,M1)     USDCAD: SYMBOL_BID быстрее GetBid() в 2.96 раза. Среднее время одной итерации: SYMBOL_BID - 45.44 ns, GetBid() - 134.61 ns, sum1 = 116279675.0471961, sum2 = 39248002.75579567
2020.10.26 19:27:06.318 FxSaberBidSpeed (USDCAD,M1)     USDCAD: SYMBOL_BID быстрее GetBid() в 3.01 раза. Среднее время одной итерации: SYMBOL_BID - 45.17 ns, GetBid() - 135.96 ns, sum1 = 119877506.6663743, sum2 = 39829996.08171722
2020.10.26 19:27:06.709 FxSaberBidSpeed (USDCAD,M1)     USDCAD: SYMBOL_BID быстрее GetBid() в 3.01 раза. Среднее время одной итерации: SYMBOL_BID - 44.92 ns, GetBid() - 135.42 ns, sum1 = 123505976.1123297, sum2 = 40965170.16304104
2020.10.26 19:27:07.803 FxSaberBidSpeed (USDCAD,M1)     USDCAD: SYMBOL_BID быстрее GetBid() в 2.99 раза. Среднее время одной итерации: SYMBOL_BID - 44.84 ns, GetBid() - 134.00 ns, sum1 = 126664503.6443297, sum2 = 42385980.37108831
Como você pode ver, a diferença de desempenho é três vezes a favor da versão padrão.
 
Nikolai Semko:


Como você pode ver, a diferença de desempenho é três vezes a favor da versão original.

A versão original do fxsaber mostra a vantagem do GetBid, ou trata-se de um PC mais potente/menos carregado?

 
Andrey Khatimlianskii:

A versão original da fxsaber mostra a vantagem da GetBid, ou é mais potente/menos carregada?

Sua variante também mostrou a vantagem da GetBid com carga total da CPU. Mas ao mesmo tempo, minha variante mostra três vezes a vantagem da função regular com a mesma carga.
Isto
porque minha variante leva em conta o tempo médio de todas as iterações de obter o preço de licitação e é apenas uma pequena fração com pendências anômalas.
Quem sabe por que razão o processador fica atolado com a função normal (quando o atraso é superior a 100 µ) em um "minuto" difícil. Mas ainda assim o tempo médio é três vezes menor para a função regular

Assim, por exemplo, se (Intervalo###A > 100) este for o caso:

enquanto que se (Intervalo##A > 0) já for bem diferente, mostrando uma distribuição aleatória de atrasos anormais entre a versão regular e a versão alternativa de obter o preço de licitação

ao mesmo tempo em que meu teste na mesma carga de CPU mostra:

2020.10.26 22:16:10.569 FxSaberBidSpeed (USDCAD,M1)     USDCAD: SYMBOL_BID быстрее GetBid() в 2.79 раза. Среднее время одной итерации: SYMBOL_BID - 57.95 ns, GetBid() - 161.43 ns, sum1 = 108105265.450882, sum2 = 38804020.20301527
2020.10.26 22:16:12.146 FxSaberBidSpeed (USDCAD,M1)     USDCAD: SYMBOL_BID быстрее GetBid() в 2.79 раза. Среднее время одной итерации: SYMBOL_BID - 57.81 ns, GetBid() - 161.06 ns, sum1 = 111212159.8857315, sum2 = 39917412.88663763
2020.10.26 22:16:13.741 FxSaberBidSpeed (USDCAD,M1)     USDCAD: SYMBOL_BID быстрее GetBid() в 2.79 раза. Среднее время одной итерации: SYMBOL_BID - 57.37 ns, GetBid() - 159.91 ns, sum1 = 114942034.0034028, sum2 = 41233865.03452455
2020.10.26 22:16:14.740 FxSaberBidSpeed (EURUSD,M1)     EURUSD: SYMBOL_BID быстрее GetBid() в 3.18 раза. Среднее время одной итерации: SYMBOL_BID - 52.88 ns, GetBid() - 167.92 ns, sum1 = 75470423.51597476, sum2 = 23764764.64380601
2020.10.26 22:16:15.756 FxSaberBidSpeed (USDCAD,M1)     USDCAD: SYMBOL_BID быстрее GetBid() в 2.78 раза. Среднее время одной итерации: SYMBOL_BID - 57.30 ns, GetBid() - 159.06 ns, sum1 = 117956798.0483066, sum2 = 42491447.24894404
2020.10.26 22:16:17.646 FxSaberBidSpeed (USDCAD,M1)     USDCAD: SYMBOL_BID быстрее GetBid() в 2.77 раза. Среднее время одной итерации: SYMBOL_BID - 57.19 ns, GetBid() - 158.36 ns, sum1 = 121056970.4066543, sum2 = 43721243.0341278
2020.10.26 22:16:20.146 FxSaberBidSpeed (USDCAD,M1)     USDCAD: SYMBOL_BID быстрее GetBid() в 2.76 раза. Среднее время одной итерации: SYMBOL_BID - 57.14 ns, GetBid() - 157.85 ns, sum1 = 124053724.3725583, sum2 = 44907061.11418578
2020.10.26 22:16:21.553 FxSaberBidSpeed (EURUSD,M1)     EURUSD: SYMBOL_BID быстрее GetBid() в 3.15 раза. Среднее время одной итерации: SYMBOL_BID - 52.80 ns, GetBid() - 166.11 ns, sum1 = 78375839.87008552, sum2 = 24913626.42960918
2020.10.26 22:16:24.865 FxSaberBidSpeed (USDCAD,M1)     USDCAD: SYMBOL_BID быстрее GetBid() в 2.77 раза. Среднее время одной итерации: SYMBOL_BID - 56.94 ns, GetBid() - 157.50 ns, sum1 = 127392085.5933389, sum2 = 46051851.71182434
2020.10.26 22:16:27.678 FxSaberBidSpeed (USDCAD,M1)     USDCAD: SYMBOL_BID быстрее GetBid() в 2.77 раза. Среднее время одной итерации: SYMBOL_BID - 57.13 ns, GetBid() - 158.30 ns, sum1 = 129851046.9417646, sum2 = 46862113.16739535

Portanto, acho que a versão do teste da fxsaber está longe de ser objetiva.

Eu não carreguei a CPU com agentes, mas com este roteiro. Foi mais eficiente.

Arquivos anexados:
LSD.mq5  6 kb
 

após uma pequena modificação do teste fxsaber para demonstrar claramente qual porcentagem das iterações é contabilizada nos cálculos:

2020.10.26 22:45:03.679 FxSaberBidSpeed (USDCAD,M1)     Alert: , TimeBid1-TimeBid2 = 2142416 mcs., TimeBid1 = 2858669, TimeBid2 = 716253,  Всего итераций - 31456223, из них принято во внимание, NBid1 = 3015, NBid2 = 1714
2020.10.26 22:45:05.739 FxSaberBidSpeed (BTCUSD,M1)     Alert: , TimeBid1-TimeBid2 = 1521696 mcs., TimeBid1 = 2282285, TimeBid2 = 760589,  Всего итераций - 31417549, из них принято во внимание, NBid1 = 1794, NBid2 = 1418
2020.10.26 22:45:06.006 FxSaberBidSpeed (USDJPY,M1)     Alert: , TimeBid1-TimeBid2 = 2241890 mcs., TimeBid1 = 3204507, TimeBid2 = 962617,  Всего итераций - 54138004, из них принято во внимание, NBid1 = 4401, NBid2 = 2083
2020.10.26 22:45:09.099 FxSaberBidSpeed (EURUSD,M1)     Alert: , TimeBid1-TimeBid2 = 1000828 mcs., TimeBid1 = 1496646, TimeBid2 = 495818,  Всего итераций - 10037824, из них принято во внимание, NBid1 = 2429, NBid2 = 1711
2020.10.26 22:45:14.803 FxSaberBidSpeed (USDCAD,M1)     Alert: , TimeBid1-TimeBid2 = 2676273 mcs., TimeBid1 = 3916168, TimeBid2 = 1239895, Всего итераций - 41606744, из них принято во внимание, NBid1 = 4935, NBid2 = 3790
2020.10.26 22:45:15.745 FxSaberBidSpeed (BTCUSD,M1)     Alert: , TimeBid1-TimeBid2 = 1521696 mcs., TimeBid1 = 2282285, TimeBid2 = 760589,  Всего итераций - 31417549, из них принято во внимание, NBid1 = 1794, NBid2 = 1418
2020.10.26 22:45:16.115 FxSaberBidSpeed (USDJPY,M1)     Alert: , TimeBid1-TimeBid2 = 2653810 mcs., TimeBid1 = 4195095, TimeBid2 = 1541285, Всего итераций - 64310228, из них принято во внимание, NBid1 = 6486, NBid2 = 3879
2020.10.26 22:45:19.834 FxSaberBidSpeed (EURUSD,M1)     Alert: , TimeBid1-TimeBid2 = 1949809 mcs., TimeBid1 = 3091755, TimeBid2 = 1141946, Всего итераций - 19435170, из них принято во внимание, NBid1 = 4724, NBid2 = 3547

ou seja, aproximadamente 0,01%.

Você pode apostar.
Se o tempo médio de execução do SymbolInfoDouble(_Symbol, SYMBOL_BID) é de cerca de 50 nanossegundos, somente aqueles com tempo de execução superior a 100 000 nanossegundos são levados em conta.

Arquivos anexados:
 
Nikolai Semko:

após uma leve modificação do teste fxsaber para demonstrar claramente qual porcentagem das iterações é contabilizada nos cálculos:

ou seja, aproximadamente 0,01%.

Você pode apostar.
Se o tempo médio de execução do SymbolInfoDouble(_Symbol, SYMBOL_BID) for de cerca de 50 nanossegundos, somente aquelas iterações superiores a 100 000 nanossegundos são contadas.

Poderíamos simplesmente ter feito a condição não mais que 100 µs, mas mais que 3 µs. O resultado foi aparentemente o mesmo. A idéia era que um estudo segmentar e em diferentes condições de execução pode haver uma diferença em diferentes segmentos e em diferentes seções. As prioridades de execução são muitas vezes feitas dependendo de qualquer coisa. Com uma carga leve algumas prioridades, com carga alta outras, com carga crítica, aquelas que não deixam o computador pendurar e travar, e o desempenho passa para segundo plano.

Geralmente, o comércio com uma carga de mais de 70% do hardware não é correto. É um desempenho quase crítico. A carga de ferro em EAs de combate não deve exceder 60%.

 
Não estarei em meu computador por um tempo, por isso vou mantê-lo curto.

Em algotrading, ninguém se preocupa com a temperatura média hospitalar quando há desacelerações regulares. A obtenção de preços em milissegundos é uma ocorrência regular. E isso em um ambiente de combate.

Se for possível obter preços sem picos de atraso em momentos importantes da negociação, então lutarei por esta mesma oportunidade.

Eu tenho provado pelo código que tal muleta existe. Se você quiser evitar atrasos, use a muleta.

Ninguém aqui jamais olhou para o código comparando os preços recebidos ao trabalhar com um secador também. E aí, para dizer de forma branda, são questões sérias.

O fato é que a função regular se atrasa catastroficamente com mais freqüência do que a muleta. E não me importa que o tempo médio esteja próximo de zero. São os atrasos que causam problemas durante o comércio

Querer HFT - esquecer até mesmo o nível de milissegundo lento por enquanto.
 
você já tem corretores HFT?)
 
secret:
e você já tem corretores HFT?)
Sim.
 
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 passando por essa desaceleração intermitente ao descompactar os dados

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

Em construções recentes, o recebimento de carrapatos não tem efeito nem mesmo teoricamente. Praticamente, SymbolInfoTick já funciona com cache, mas alguns cidadãos continuam procurando um gato preto.

Não vejo qual o interesse em testar um processador com 80% de carga.

Não está nem 80% no teste. Existem 6 agentes funcionando em 4 núcleos, ou seja, 100% garantidos.

A única questão é como o agendador de tarefas de seu sistema está lidando com a situação. Ao mesmo tempo, os autores afirmam que a culpa é da implementação do terminal.

Ou seja, uma situação é criada artificialmente quando um computador é sobrecarregado, quando literalmente tudo nele fica mais lento, e então são feitas algumas reivindicações na forma de "Oh, olha, por que o terminal às vezes está atrasado".

Vamos fechar os olhos para o fato de que mesmo em tais condições é "cerca de 0,01%" - para o inferno com os detalhes! Basta dizer que "ninguém se preocupa com a temperatura média hospitalar", "os atrasos causam problemas no comércio" e "queremos o HFT".

Além disso, é claro que queremos HFT em 20 especialistas em uma antiga mesa de escritório ou em uma máquina virtual morta.

PS PositionSelectByTicket() em sua implementação certamente tem acesso a um recurso compartilhado com sincronização de acesso. E se você não selecionar a posição em cada chamada, você está lendo o preço antigo. Foi mais fácil "instantâneo" via SymbolInfoDouble.

Ордерa, позиции и сделки в MetaTrader 5
Ордерa, позиции и сделки в MetaTrader 5
  • www.mql5.com
Конечной целью трейдера является извлечение прибыли посредством торговых операций на финансовых рынках. В этой статье дается описание терминов и процессов торговой платформы MetaTarder 5, знание которых необходимо для правильного понимания работы торговых функций языка MQL5. Ордера — это принятые торговым сервером запросы на совершение торговых...
 
o núcleo em tempo real pode ajudar de alguma forma?