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.
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.2622: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.203015272020.10.2622: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.886637632020.10.2622: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.034524552020.10.2622: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.643806012020.10.2622: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.248944042020.10.2622: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.03412782020.10.2622: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.114185782020.10.2622: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.429609182020.10.2622: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.711824342020.10.2622: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.
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.2622:45:03.679 FxSaberBidSpeed (USDCAD,M1) Alert: , TimeBid1-TimeBid2 = 2142416 mcs., TimeBid1 = 2858669, TimeBid2 = 716253, Всего итераций - 31456223, из них принято во внимание, NBid1 = 3015, NBid2 = 17142020.10.2622:45:05.739 FxSaberBidSpeed (BTCUSD,M1) Alert: , TimeBid1-TimeBid2 = 1521696 mcs., TimeBid1 = 2282285, TimeBid2 = 760589, Всего итераций - 31417549, из них принято во внимание, NBid1 = 1794, NBid2 = 14182020.10.2622:45:06.006 FxSaberBidSpeed (USDJPY,M1) Alert: , TimeBid1-TimeBid2 = 2241890 mcs., TimeBid1 = 3204507, TimeBid2 = 962617, Всего итераций - 54138004, из них принято во внимание, NBid1 = 4401, NBid2 = 20832020.10.2622:45:09.099 FxSaberBidSpeed (EURUSD,M1) Alert: , TimeBid1-TimeBid2 = 1000828 mcs., TimeBid1 = 1496646, TimeBid2 = 495818, Всего итераций - 10037824, из них принято во внимание, NBid1 = 2429, NBid2 = 17112020.10.2622:45:14.803 FxSaberBidSpeed (USDCAD,M1) Alert: , TimeBid1-TimeBid2 = 2676273 mcs., TimeBid1 = 3916168, TimeBid2 = 1239895, Всего итераций - 41606744, из них принято во внимание, NBid1 = 4935, NBid2 = 37902020.10.2622:45:15.745 FxSaberBidSpeed (BTCUSD,M1) Alert: , TimeBid1-TimeBid2 = 1521696 mcs., TimeBid1 = 2282285, TimeBid2 = 760589, Всего итераций - 31417549, из них принято во внимание, NBid1 = 1794, NBid2 = 14182020.10.2622:45:16.115 FxSaberBidSpeed (USDJPY,M1) Alert: , TimeBid1-TimeBid2 = 2653810 mcs., TimeBid1 = 4195095, TimeBid2 = 1541285, Всего итераций - 64310228, из них принято во внимание, NBid1 = 6486, NBid2 = 38792020.10.2622: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.
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.
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.
Конечной целью трейдера является извлечение прибыли посредством торговых операций на финансовых рынках. В этой статье дается описание терминов и процессов торговой платформы MetaTarder 5, знание которых необходимо для правильного понимания работы торговых функций языка MQL5. Ордера — это принятые торговым сервером запросы на совершение торговых...
Si vous n'avez pas de compte, veuillez vous inscrire
Autorisez l'utilisation de cookies pour vous connecter au site Web MQL5.com.
Veuillez activer les paramètres nécessaires dans votre navigateur, sinon vous ne pourrez pas vous connecter.
Vous êtes connecté. L'authentification à deux facteurs a été désactivée. Configurez-la à nouveau et scannez un nouveau code QR, ou continuez avec l'authentification à deux facteurs désactivée.
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
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.
Mon résultat :
Comme vous pouvez le constater, la différence de performance est trois fois plus importante en faveur de la version standard.
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é ?
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 :
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.
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 :
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.
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%.
et avez-vous déjà des courtiers HFT ?)
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.
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.