Erreurs, bugs, questions - page 2438

 
Il semble qu'il s'agisse d'un défaut purement méthodologique.

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

Test des calendriers de stratégie avec autosubstitution des résultats dans les EE

Slava, 2013.04.10 15:04

void OnTesterDeinit()
  {
   string        name;
   ulong         pass;
   long          id;
   double        value;
   int           handle,i;
   BalanceInTime balance[];
   MqlRates      rates[];
//---
   FrameFirst();
   FrameFilter("",1);
   while(FrameNext(pass,name,id,value,balance))
     {
      handle=FileOpen(name+"_"+string(id)+"_"+IntegerToString(pass,5,'0')+".txt",FILE_WRITE|FILE_CSV|FILE_ANSI);
      if(handle!=INVALID_HANDLE)
        {
         for(i=0; i<ArraySize(balance); i++)
            FileWrite(handle,balance[i].date,EnumToString(balance[i].entry),DoubleToString(balance[i].price,5),DoubleToString(balance[i].balance,2));
         FileClose(handle);
        }
     }
//---
   FrameFirst();
   FrameFilter("",2);
   while(FrameNext(pass,name,id,value,rates))
     {
      handle=FileOpen(name+"_"+string(id)+"_"+IntegerToString(pass,5,'0')+".txt",FILE_WRITE|FILE_CSV|FILE_ANSI);
      if(handle!=INVALID_HANDLE)
        {
         for(i=0; i<ArraySize(rates); i++)
            FileWrite(handle,rates[i].time,DoubleToString(rates[i].open,5),DoubleToString(rates[i].high,5),DoubleToString(rates[i].low,5),DoubleToString(rates[i].close,5),string(rates[i].tick_volume));
         FileClose(handle);
        }
     }
//---
  }
Avant FrameNext dans la boucle, il serait bon d'appeler ArrayFree à chaque passage de la boucle.
 
Slava:

1. Oui. Ça peut être redondant.

2. un type de trames est lu dans OnTesterPass et terminé dans OnTesterDeinit. Les trames restantes sont lues dans OnTesterDeinit

Cette capacité à transmettre-récevoir plusieurs types de trames nous a permis de corriger certaines erreurs difficiles à reproduire dans le testeur. Et les trames n'étaient transmises que s'il y avait une différence avec une certaine valeur de référence.

J'ai mentionné plus tôt la perte de trames, si de nombreuses trames sont passées en une seule fois et qu'il y a des problèmes avec l'agent - la connexion est rompue - est-ce que quelque chose sera fait pour remédier à cette situation ?

 
fxsaber:

Allez-vous ouvrir l'opt-format ?

Oui.

En échange de la publication du code pour lire le fichier opt.

 
fxsaber:

Cette fonction ne vous permet pas de travailler en temps réel avec les résultats des passes comptées s'il y a plusieurs images par passe.

Oui.

C'est pourquoi nous devons lire les trames de type "non-core" une fois l'optimisation terminée.

 
Aleksey Vyazmikin:

J'ai parlé plus tôt de la perte de trames. Si de nombreuses trames sont transmises en une seule fois et qu'il y a un dysfonctionnement de l'agent - une rupture de communication - est-ce que quelque chose sera fait pour remédier à cette situation ?

Que pouvez-vous faire ?

Le résultat de l'optimisation partira en tout cas plus tôt et plus vite que son cadre. Si l'agent a été bloqué (arrêt de l'ordinateur, arrêt du service), vous ne pouvez absolument rien y faire.

Nous pourrions essayer ce qui suit : tant que la trame n'est pas envoyée, ne pas envoyer le résultat. Mais on ne sait pas quand nous allons le corriger.

 
fxsaber:
Il semble s'agir d'un défaut purement méthodologique.
Avant le FrameNext dans la boucle, c'est une bonne idée d'appeler ArrayFree à chaque passage de la boucle.

Nous évitons la réallocation inutile de la mémoire.

Dans ce cas, il y a 99% de probabilité que le tampon du tableau soit alloué une fois.

 
Slava:

Que pouvez-vous faire ?

Le résultat de l'optimisation partira de toute façon plus tôt et plus vite que son cadre. Si l'agent a été bloqué (arrêt de l'ordinateur, arrêt du service), il n'y a rien que vous puissiez faire.

Nous pourrions essayer ce qui suit : tant qu'une trame n'est pas envoyée, ne pas envoyer le résultat. Mais on ne sait pas quand nous allons le corriger.

Peut-être qu'avant la transmission des trames, vous pouvez dire combien de trames sont attendues, et si c'est moins que prévu et que l'agent n'est pas disponible, alors donner le passage à un autre agent et écraser les trames déjà reçues ?

Ou bien, dans le corps de chaque image, écrivez le nombre total et son numéro de séquence dans ce nombre, et de la même manière, si tout n'est pas venu, réoptimisez.
 
Slava:

Oui.

En échange de la publication du code pour lire le fichier opt.

Je suis encore plus intéressé par l'enregistrement. Je ferai la lecture, si le format est connu.

 
Aleksey Vyazmikin:

Pouvez-vous dire combien de trames sont attendues avant de commencer à transmettre, et si moins que prévu sont arrivées et que l'agent n'est pas disponible, alors donner la passe à un autre agent et écraser les trames déjà reçues ?

Ou dans le corps de chaque cadre pour écrire le nombre total et son numéro de séquence dans cette quantité, et de la même manière, si tout n'est pas venu, ré-optimiser.

Et si chaque passe ne renvoie pas une image ?

J'ai donné ci-dessus un exemple de capture d'erreur dans le testeur. Les trames n'étaient envoyées que lorsqu'une valeur de résultat ne coïncidait pas avec le point de référence

 
Slava:

Et si chaque passe ne renvoie pas une image ?

J'ai donné un exemple ci-dessus sur la capture des erreurs dans le testeur. Les trames n'étaient envoyées que lorsqu'une valeur de résultat ne correspondait pas à la référence.

Il faut donc créer une trame nulle (système), qui sera renvoyée à chaque passage, mais qui ne participera pas à la génération des données.