MT5 et la vitesse en action - page 61

 
fxsaber:

Je pense que ce mur de QM ne passera pas sans le soutien des membres du forum. Le code est court, les pros devraient pouvoir le comprendre rapidement. Il n'y a aucun défaut. Il est clairement démontré que les prix à travers les positions sont obtenus beaucoup plus rapidement qu'à partir de Market Watch. Comment MQ ne peut pas voir l'évidence - je ne comprends pas.

1. Votre test compte réellement un micro pourcentage d'itérations en raison de la condition

if (Interval##A > 100)

En substance, vous ne comptez que les anomalies où le processeur est surchargé de tâches et repousse l'exécution de la tâche donnée sur l'étagère lointaine, car plus de 99 % des itérations sont effectuées en moins d'une microseconde.

Et même si vous fixez la condition >0, il n'y a toujours pas d'objectivité.

2. La mesure du temps de telles opérations rapides ne doit être effectuée que sous forme de temps de cycle complet, et non d'une seule itération.

3. mais puisque le cycle dans votre exemple est limité à 10 secondes (Pourquoi ! Pour les ticks, je pense que 0,1 seconde est tout à fait suffisant. Parce qu'il se peut très bien que 3 ticks arrivent dans une seconde, et que les trois ticks soient exécutés pendant 10 secondes chacun, et en parallèle), donc aucun timing n'est nécessaire. Il est plus facile de calculer le nombre d'itérations qui seront exécutées dans un temps donné. Plus il y en a, plus la productivité est élevée.

J'ai modifié votre code "un peu". Je pense que ma variante reflète mieux la réalité.

Le calcul se fait un par un, afin de ne pas mélanger les deux variantes. Les tics pairs sont pourSYMBOL_BID, les impairs - pour GetBid().

J'ai ajouté les sommes et leur sortie juste au cas où, pour essayer de tromper le compilateur contre l'optimisation.
Le résultat de la sortie est cumulatif.

#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++;
  }
//+------------------------------------------------------------------+

Mon résultat :

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
Comme vous pouvez le constater, la différence de performance est trois fois plus importante en faveur de la version standard.
 
Nikolai Semko:


Comme vous pouvez le constater, la différence de performance est trois fois plus importante en faveur de la version originale.

La version originale de fxsaber montre-t-elle l'avantage de GetBid, ou s'agit-il d'un PC plus puissant/moins chargé ?

 
Andrey Khatimlianskii:

La version originale de fxsaber présente-t-elle un avantage GetBid, ou bien le PC est-il plus puissant/moins chargé ?

Sa variante a également montré l'avantage de GetBid à pleine charge CPU. Mais en même temps, ma variante présente trois fois plus d'avantages que la fonction normale à la même charge.
Cela
s'explique par le fait que ma variante prend en compte le temps moyen de toutes les itérations pour obtenir le prix de l'offre et qu'il ne s'agit que d'une fraction minuscule avec des accrochages anormaux.
Qui sait pour quelle raison le processeur s'embourbe dans la fonction régulière (lorsque le retard est supérieur à 100 µ) dans une "minute" difficile. Mais le temps moyen est tout de même trois fois inférieur pour la fonction régulière

Ainsi, par exemple, si (Interval##A > 100), c'est le cas :

alors que si (Interval##A > 0) est déjà très différent, montrant une distribution aléatoire des délais anormaux entre la version régulière et la version alternative d'obtention du prix de l'offre.

en même temps mon test avec la même charge CPU montre :

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

Par conséquent, je pense que la version du test de fxsaber est loin d'être objective.

Je n'ai pas chargé le CPU avec des agents, mais avec ce script. C'était plus efficace.

Dossiers :
LSD.mq5  6 kb
 

après une légère modification du test fxsaber pour démontrer clairement quel pourcentage d'itérations est pris en compte dans les calculs :

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

c'est-à-dire environ 0,01%.

Tu parles.
Si le temps d'exécution moyen de SymbolInfoDouble(_Symbol, SYMBOL_BID) est d'environ 50 nanosecondes, seuls ceux dont le temps d'exécution est supérieur à 100 000 nanosecondes sont pris en compte.

Dossiers :
 
Nikolai Semko:

après une légère modification du test fxsaber pour montrer clairement quel pourcentage d'itérations est pris en compte dans les calculs :

c'est-à-dire environ 0,01%.

Tu parles.
Si le temps d'exécution moyen de SymbolInfoDouble(_Symbol, SYMBOL_BID) est d'environ 50 nanosecondes, seules les itérations supérieures à 100 000 nanosecondes sont comptées.

Nous aurions pu simplement faire en sorte que la condition ne soit pas supérieure à 100 µs, mais supérieure à 3 µs. Le résultat était apparemment le même. L'idée était qu'il s'agissait d'une étude segmentaire et que dans différentes conditions d'exécution, il pouvait y avoir une différence dans différents segments et dans différentes sections. Les priorités d'exécution sont souvent établies en fonction de n'importe quoi. À faible charge, certaines priorités, à forte charge, d'autres, à charge critique, celles qui ne laissent pas l'ordinateur se bloquer et tomber en panne, et les performances passent au second plan.

En général, il n'est pas bon de négocier avec une charge de plus de 70 % du matériel. C'est une performance presque critique. La charge en fer des EA de combat ne doit pas être supérieure à 60%.

 
Je ne serai pas devant mon ordinateur avant un moment, alors je vais faire court.

Dans l'algotrading, personne ne se soucie de la température moyenne de l'hôpital lorsqu'il y a des ralentissements réguliers. Obtenir des prix en quelques millisecondes est un phénomène courant. Et ça, c'est dans un environnement de combat.

S'il est possible d'obtenir des prix sans pics de retard aux moments importants de la négociation, alors je me battrai pour cette possibilité.

J'ai prouvé par le code qu'une telle béquille existe. Si vous voulez éviter les décalages, utilisez la béquille.

Personne ici n'a jamais regardé le code comparant les prix reçus en travaillant également avec un tumbler. Et là, le moins que l'on puisse dire, c'est qu'il y a de sérieuses questions.

Le fait est que la fonction régulière accuse plus souvent un retard catastrophique que la béquille. Et je me moque que le temps moyen soit proche de zéro. Ce sont les décalages qui causent des problèmes lors des transactions.

Vous voulez le HFT - oubliez même le niveau lent de la milliseconde pour le moment.
 
avez-vous déjà des courtiers HFT ?)
 
secret:
et avez-vous déjà des courtiers HFT ?)
Oui.
 
Igor Makanu:

essayez de tester SymbolInfoTick quand il n'y a qu'un seul symbole dans la vue d'ensemble du marché et quand il y a des dizaines de symboles, mais demandez un seul outil - comme dans votre exemple

il y a une forte probabilité que le serveur envoie du trafic compressé et que SymbolInfoTick subisse des décalages périodiques lors de la décompression des données.

c'est-à-dire que lorsqu'il y a beaucoup de symboles, les creux dans le temps de test seront encore plus fréquents ou plus profonds.

Dans les constructions récentes, la réception du flux de tics n'a aucun effet, même en théorie. En pratique, SymbolInfoTick fonctionne déjà avec le cache, mais certains citoyens continuent à chercher un chat noir.

Je ne vois pas l'intérêt de faire des tests sur un processeur chargé à 80%.

Ce n'est même pas 80% dans le test. Il y a 6 agents fonctionnant sur 4 cœurs, c'est-à-dire 100% garantis.

La seule question est de savoir comment le planificateur de tâches de son système gère la situation. Dans le même temps, certains prétendent que c'est la mise en œuvre du terminal qui est en cause.

En d'autres termes, une situation est créée artificiellement lorsqu'un ordinateur est surchargé, lorsque littéralement tout ce qui s'y trouve ralentit, et ensuite certaines revendications sont faites sous la forme de "Oh, regardez, pourquoi le terminal traîne-t-il parfois".

Fermons les yeux sur le fait que, même dans de telles conditions, elle est "d'environ 0,01%" - au diable les détails ! Il suffit de dire que "personne ne se soucie de la température moyenne d'un hôpital", "les décalages posent des problèmes lors des transactions" et "nous voulons du HFT".

De plus, il est évident que nous voulons HFT dans 20 experts sur un vieux bureau de bureau ou une machine virtuelle morte.

PS PositionSelectByTicket() dans son implémentation a certainement accès à une ressource partagée avec synchronisation des accès. Et si vous ne sélectionnez pas la position sur chaque appel, vous lisez l'ancien prix. Il était plus facile de faire un "snapshot" via SymbolInfoDouble.

Ордерa, позиции и сделки в MetaTrader 5
Ордерa, позиции и сделки в MetaTrader 5
  • www.mql5.com
Конечной целью трейдера является извлечение прибыли посредством торговых операций на финансовых рынках. В этой статье дается описание терминов и процессов торговой платформы MetaTarder 5, знание которых необходимо для правильного понимания работы торговых функций языка MQL5. Ордера — это принятые торговым сервером запросы на совершение торговых...
 
Le noyau en temps réel peut-il aider de quelque manière que ce soit ?