Testeur de stratégie MetaTrader 5 : bugs, anomalies, suggestions d'amélioration - page 46

 
traveller00:
Bild 2280, mais c'était également le cas dans les versions précédentes. Si j'exécute un script ou un EA pour le débogage, une nouvelle fenêtre du premier symbole de l'aperçu du marché s'ouvre sur l'échelle de temps 1H. Et si j'ai besoin de déboguer non pas sur le premier symbole ou sur une autre période de temps ? Y a-t-il un moyen de le faire sans effacer tous les symboles pour que le bon soit le premier ?
Allez dans les paramètres du terminal. Vous pouvez y sélectionner le symbole à déboguer.
 
Artyom Trishkin:
Allez dans les paramètres du terminal. Il y a une sélection de symboles pour le débogage.

Artyom, tu te trompes. Il s'agit de paramètres ME, et non de paramètres de terminal.


Vous devez travailler moins)))

 
Artyom Trishkin:
Allez dans les paramètres du terminal. Vous pouvez y sélectionner un symbole pour le débogage.

Je l'ai, merci. Je suis nouveau sur MT5, je ne connais pas encore tout.

 
Alexey Viktorov:

Artyom, tu te trompes. Il s'agit de paramètres ME, pas de paramètres de terminal


Vous devriez travailler moins)))

Oui, je me suis trompé... Parfois, quand on écrit depuis un téléphone portable, on ne peut même pas regarder...
 

Construire 2280. Il y a 4 processeurs sur l'ordinateur. Il y a 2 MT5 en cours. Le premier exécute un long script, terminal64.exe consomme 100% d'un processeur, ce qui donne une charge totale de 25%. Le second MT5 exécute l'optimisation génétique. Il y a 4 agents par le nombre de processeurs en standard. Le premier lot d'emplois obtient les 127. Les tâches restantes sont reçues et exécutées par 2 agents, les 2 autres restent en suspens et ne sont même pas reçues. Si vous les désactivez de force, ils rejoignent le travail. Jusqu'à ce que l'optimisation recommence. Si vous détruisez le premier MT5, la situation reste la même. Si vous redémarrez le second MT5 après cela, tout ira bien. S'agit-il d'un équilibreur de charge délicat ou d'un bug quelque part ? Si c'est le premier, alors ce n'est pas très bon, car il finit par se charger à 75% (premiers agents MT5+2) et pourtant il devrait plutôt être géré par les priorités du vent.

P.S. Il semble que cela ne soit pas nécessairement lié à la charge du CPU. La génétique n'a commencé qu'après le redémarrage, rien d'autre n'a fonctionné, et deux agents étaient paresseux jusqu'à ce que je les éteigne ou les allume. Si je ne garde que 3 agents actifs et que j'en désactive 1, 2 sont toujours à la traîne, 1 seul fonctionne.

P.P.S. S'il y a 6 processeurs, alors il y en a 3.
 

Construire 2280. Débogué l'indicateur, effectué étape par étape dans le débogueur. Sur la ligne

StartTime = iTime(Symbols[0], _Period, Pos + PosAddon);

Le débogage a échoué. Quelque chose comme une erreur critique, débogage arrêté. Dans le journal, il est écrit

           crash -->  000000 B7250C38B1 038424 B8000000    add        eax, [rsp+0xb8]
                      000000 B7250C38B8 89442460          mov        [rsp+0x60], eax
                      000000 B7250C38BC 448 B4C2460        mov        r9d, [rsp+0x60]
                      000000 B7250C38C1 49 B8010000000000  mov        r8, 0x1
                                       0000
                      000000 B7250C38CB 488 B542468        mov        rdx, [rsp+0x68]
                      000000 B7250C38D0 48 B9E8DD4220B700  mov        rcx, 0xb72042dde8
                                       0000
                      000000 B7250C38DA 49 FF96580F0000    call       qword near [r14+0xf58]  ; #11037 (terminal64.exe)
        
        00: 0x000000B7250C38B1

Cela se reproduit, mais rarement. Sans que je le sache, rien n'a beaucoup changé entre les deux débogages.

 

Construire 2280. Bourse, marché à terme. Tout l'historique est chargé, mais les tests sont effectués hors ligne. iBarShift fonctionne étrangement dans les indicateurs. Et le même code fonctionne bien dans le script. Est-ce un bug ou est-ce que je rate quelque chose ?

#property indicator_separate_window

void OnInit()
{
  datetime Time[];
  ArraySetAsSeries(Time, true);
  CopyTime(_Symbol,_Period,0,1,Time);

  int Shift=iBarShift(_Symbol,_Period,Time[0]);
  Print("Symbol="+_Symbol+", Shift="+(string)Shift);

  for(int i=0;i!=SymbolsTotal(true);++i)
  {
    const string SymbName=SymbolName(i,true);
    Shift=iBarShift(SymbName,_Period,Time[0]);
    Print("Symbol="+SymbName+", Shift="+(string)Shift);
  }
}

int OnCalculate(const int rates_total,const int prev_calculated,const datetime& time[],const double& open[],const double& high[],
  const double& low[],const double& close[],const long& tick_volume[],const long& volume[],const int& spread[])
{
  return 0;
}

Il existe un tel code. Il parcourt essentiellement tous les symboles de la revue de marché et arrache l'iBarShift. Le même code fonctionne bien dans le script. L'indicateur produit -1 pour tous les symboles, sauf pour le symbole actuel (sur le graphique sur lequel il fonctionne) avec l'erreur qu'il n'y a pas d'historique. Au même moment, lors de la deuxième exécution, il charge apparemment l'historique et l'affiche déjà normalement.

 
traveller00:

le même code fonctionne bien dans le script. Est-ce un bug ou est-ce que je rate quelque chose ?

Contrairement au script, l'indicateur fonctionne de manière asynchrone - il n'attend pas que l'histoire soit prête.

 
fxsaber:

Contrairement au script, l'indicateur fonctionne de manière asynchrone - il n'attend pas que l'historique soit prêt.

Eh bien, toute l'histoire est là. Comme je l'ai dit, il fonctionne hors ligne, tout l'historique est déjà téléchargé depuis le serveur. Ou a-t-il besoin d'autre chose ?

 
traveller00:

Eh bien, toute l'histoire est là. Comme je l'ai dit, il travaille hors ligne, tout l'historique est déjà téléchargé du serveur. Ou a-t-il besoin d'autre chose ?

En théorie, bien sûr, il faut tout reprendre depuis le début. En pratique, cependant, je ne suis pas dans les indicateurs, donc je ne peux pas dire avec certitude.