MT5 et la vitesse en action - page 54

 
Roman:

OK, laissez-moi reformuler. Dans les limites du mql, c'est à peu près possible, en fonction de la vitesse d'horloge du processeur.
Et pour le PWM ? -Un signal d'impulsion de fréquence constante et de rapport cyclique variable.
N'y a-t-il pas une constante ?

Tout d'abord, lisez ce qu'est la fonction Sleep de WinAPI et ce qu'elle fait réellement.

PS Windows n'est pas un système en temps réel

 
Slava:

Tout d'abord, lisez ce qu'est la fonction Sleep de WinAPI et ce qu'elle fait réellement.

PS Windows n'est pas un système en temps réel

Ahem, qu'est-ce que WinAPI Sleep a à voir avec ça ?
Lorsque nous parlons de glissement microseconde
Individuellement, pour votre processeur, vous pouvez définir la fréquence du timer et calculer le nombre de répétitions.
Vous pouvez donc écrire votre propre MicrosecondCount en mql, mais quel est l'intérêt ? Le standard est suffisant.

MT5 и скорость в боевом исполнении
MT5 и скорость в боевом исполнении
  • 2020.10.10
  • www.mql5.com
MT5 - шустрая платформа. Но есть узкие горлышки, которые сводят на нет все старания быстрой торговли...
 
Roman:

Ahem, je suis gêné de demander, qu'est-ce que WinAPI Sleep a à voir avec ça ?
Quand on parle de glissement de microseconde
Individuellement, pour votre processeur, vous pouvez définir la fréquence du timer et calculer le nombre de répétitions.
Vous pouvez donc écrire votre propre MicrosecondCount en mql, mais quel est l'intérêt ? Le standard est suffisant.

Votre propre glissement en attente sans changement de contexte consommera votre cœur à 100%.

C'est une méthode de programmation qui donne la chair de poule. Dieu interdit qu'un tel code se répande sur le marché.

 
Renat Fatkhullin:

Votre fiche d'attente sans changement de contexte consommera votre cœur à 100%.

C'est une méthode de programmation horrible. Dieu interdit qu'un tel code se répande sur le marché.

Et personne n'a nié le hardcore ;))
Si vous montrez un exemple de changement de contexte, vous pourrez peut-être vous améliorer ?

Voici la charge CPU pour µsSLEEP (µsRange), sur VirtualBox avec seulement 2 cœurs, 4 threads.
Les mineurs font pire que ça.)

cp

 

Forum sur le trading, les systèmes de trading automatisés et les tests de stratégie

Bibliothèques : Séquence

fxsaber, 2020.10.13 12:54

Un exemple d'un EA qui va tuer la plupart des VPS.
#include <fxsaber\Sequence.mqh> // https://www.mql5.com/ru/code/31446

#define  PRINT(A) Print(#A + " = " + (string)(A))

input datetime inFrom = D'2020.09.01'; // С какой даты анализировать историю

void OnInit()
{
  SEQUENCE Sequence; // Последовательный запуск расчетов
  
//  if (Sequence.Init()) // Раскомментируйте для последовательного выполнения.
  {
    MqlTick Ticks[];
    
    PRINT(CopyTicksRange(_Symbol, Ticks, COPY_TICKS_ALL, (long)inFrom * 1000));
    PRINT(TerminalInfoInteger(TERMINAL_MEMORY_USED));
    
    Sleep(10000); // Ждем освобождения CopyTicks-данных.
  }
}


Je l'utilise sur quelques graphiques de différents symboles. J'ai utilisé ce script avec inAmount = 5 pour automatiser cette action.


Résultat.

2020.10.13 13:26:53.199 Test9 (AUDCAD,H1)       CopyTicksRange(_Symbol,Ticks,COPY_TICKS_ALL,(long)inFrom*1000) = 5406953
2020.10.13 13:26:53.326 Test9 (AUDCAD,H1)       TerminalInfoInteger(TERMINAL_MEMORY_USED) = 2838
2020.10.13 13:26:53.528 Test9 (EURCHF,H1)       CopyTicksRange(_Symbol,Ticks,COPY_TICKS_ALL,(long)inFrom*1000) = 3430958
2020.10.13 13:26:53.807 Test9 (EURCHF,H1)       TerminalInfoInteger(TERMINAL_MEMORY_USED) = 3144
2020.10.13 13:26:53.924 Test9 (EURUSD,H1)       CopyTicksRange(_Symbol,Ticks,COPY_TICKS_ALL,(long)inFrom*1000) = 4244747
2020.10.13 13:26:54.214 Test9 (EURUSD,H1)       TerminalInfoInteger(TERMINAL_MEMORY_USED) = 3464
2020.10.13 13:26:54.344 Test9 (AUDCHF,H1)       CopyTicksRange(_Symbol,Ticks,COPY_TICKS_ALL,(long)inFrom*1000) = 4327679
2020.10.13 13:26:54.702 Test9 (AUDCHF,H1)       TerminalInfoInteger(TERMINAL_MEMORY_USED) = 3797
2020.10.13 13:26:54.864 Test9 (GBPCHF,H1)       CopyTicksRange(_Symbol,Ticks,COPY_TICKS_ALL,(long)inFrom*1000) = 5340006
2020.10.13 13:26:55.457 Test9 (GBPCHF,H1)       TerminalInfoInteger(TERMINAL_MEMORY_USED) = 4308
2020.10.13 13:26:55.666 Test9 (EURAUD,H1)       CopyTicksRange(_Symbol,Ticks,COPY_TICKS_ALL,(long)inFrom*1000) = 7730155
2020.10.13 13:26:55.756 Test9 (EURAUD,H1)       TerminalInfoInteger(TERMINAL_MEMORY_USED) = 4316

Le terminal nécessite plus de 4 Go de mémoire pour exécuter ces six conseillers experts. Veuillez noter qu'il n'est nécessaire que pour l'initialisation, et non pour le fonctionnement de ces EA. Imaginez que vous démarrez le terminal avec les Expert Advisors qui s'y trouvent. Si vous ne disposez pas de 4 Go de RAM honnêtes, c'est presque un désastre.


Maintenant, supprimons le commentaire de cette ligne dans le code source.

  if (Sequence.Init()) // Раскомментируйте для последовательного выполнения.

Ainsi, nous avons permis l'initialisation séquentielle des Expert Advisors.


Regardons le résultat (après recompilation).

2020.10.13 13:27:24.002 Test9 (AUDCAD,H1)       CopyTicksRange(_Symbol,Ticks,COPY_TICKS_ALL,(long)inFrom*1000) = 5406980
2020.10.13 13:27:24.021 Test9 (AUDCAD,H1)       TerminalInfoInteger(TERMINAL_MEMORY_USED) = 1234
2020.10.13 13:27:35.407 Test9 (EURUSD,H1)       CopyTicksRange(_Symbol,Ticks,COPY_TICKS_ALL,(long)inFrom*1000) = 4244772
2020.10.13 13:27:35.422 Test9 (EURUSD,H1)       TerminalInfoInteger(TERMINAL_MEMORY_USED) = 1095
2020.10.13 13:27:46.886 Test9 (GBPCHF,H1)       CopyTicksRange(_Symbol,Ticks,COPY_TICKS_ALL,(long)inFrom*1000) = 5340072
2020.10.13 13:27:46.905 Test9 (GBPCHF,H1)       TerminalInfoInteger(TERMINAL_MEMORY_USED) = 1224
2020.10.13 13:27:58.293 Test9 (AUDCHF,H1)       CopyTicksRange(_Symbol,Ticks,COPY_TICKS_ALL,(long)inFrom*1000) = 4327724
2020.10.13 13:27:58.310 Test9 (AUDCHF,H1)       TerminalInfoInteger(TERMINAL_MEMORY_USED) = 1114
2020.10.13 13:28:09.683 Test9 (EURCHF,H1)       CopyTicksRange(_Symbol,Ticks,COPY_TICKS_ALL,(long)inFrom*1000) = 3430999
2020.10.13 13:28:09.696 Test9 (EURCHF,H1)       TerminalInfoInteger(TERMINAL_MEMORY_USED) = 1015
2020.10.13 13:28:21.339 Test9 (EURAUD,H1)       CopyTicksRange(_Symbol,Ticks,COPY_TICKS_ALL,(long)inFrom*1000) = 7730313
2020.10.13 13:28:21.363 Test9 (EURAUD,H1)       TerminalInfoInteger(TERMINAL_MEMORY_USED) = 1519


Au démarrage des conseillers experts, nous avons réussi à réduire la consommation de mémoire du terminal de plus de 2,5 Go. La probabilité de pannes de VPS (et d'ordinateurs domestiques faibles) a considérablement diminué.


Voici comment les deux parcours se présentent en dynamique.

Le lancement séquentiel a étiré l'initialisation globale dans le temps, mais a réussi à empêcher le terminal de consommer d'énormes quantités de RAM.


Lesgraphiques supérieur et inférieur montrent clairement le processus d'initialisation parallèle (pic supérieur gauche) et six initialisations consécutives (six pics intermédiaires ).


SZY Pendant les expériences, une nuance désagréable avec Sleep est apparue - voir le code source.


Je demande d'une manière ou d'une autre de permettre de libérer la mémoire par la force après avoir utilisé CopyTicks. Pas pour créer de telles béquilles du sommeil.

 
Veuillez recommander le moyen le moins coûteux en mémoire pour interroger l'historique des tics à un intervalle donné.
 
fxsaber:
Veuillez me recommander le moyen le plus économique de demander l'historique des tiques à un intervalle donné.

il me semble que vous ne cherchez pas un produit bon marché, mais un moyen de libérer rapidement de la mémoire.

comme une option à vérifier :

- envelopper le tableau dynamique MqlTick Ticks[] dans la classe et créer un objet avec new (c'est-à-dire aussi un objet dynamique), le supprimer lorsque vous n'en avez plus besoin.

- la même chose, mais avec une structure, mais dans une portée locale ( ou fonction ou bloc local { } - ou boucle avec une itération ? ), les structures ne fonctionnent pas aussi bien que les classes - j'ai réécrit la plupart de mon code EA en m'éloignant des classes et en les remplaçant par des structures de données, la vitesse d'optimisation a augmenté de manière significative - peut-être est-ce un effet subjectif - peut-être que les nouvelles versions sont plus rapides

- Essayez d'ajouter ArrayFree() au destructeur.

 
Igor Makanu:

Je ne pense pas que vous en cherchiez un bon marché, mais un moyen de libérer rapidement de la mémoire.

Le terminal ne libère pas de mémoire. Les variables MQL n'ont rien à voir avec cela.

 
fxsaber:

Le terminal ne libère pas de mémoire. Les variables MQL n'ont rien à voir avec cela.

que se passe-t-il si vous forcez la taille = 1 ?

et si vous le faites^

MqlTick  Tick[];
MqlTick  ZeroTick[1] = {0};
.....
ArrayResize(Tick,1);
ArrayCopy(Tick,ZeroTick)
 
Igor Makanu:

et si

Après avoir appelé CopyTicks, le terminal conserve toutes les données en mémoire pendant quelques secondes. Juste au cas où quelqu'un voudrait relire un morceau de l'histoire des tiques.

C'est-à-dire que la quantité de mémoire ainsi consommée par le Terminal ne dépend pas de la taille des variables MQL.


La tâche consiste à forcer le terminal à libérer la mémoire.

Raison: