Erreurs, bugs, questions - page 2437

 
Slava:

si plusieurs images sont passées en une seule fois.

J'ai essayé une fois, ça n'a pas marché. Seul un FrameAdd a fonctionné.

 
Slava:

L'optimisation s'arrête lorsque le dernier résultat est arrivé. Les trames peuvent arriver plus tard, notamment si une grande quantité de données est transférée dans une trame ou si plusieurs trames sont transférées en une seule fois. Par conséquent, il est nécessaire d'organiser la réception des trames restantes dans OnTesterDeinit, qui est lancé lorsque l'optimisation est terminée - également dans la boucle.

Si les cadres peuvent arriver plus tard, il n'y a aucune garantie qu'ils arriveront aussi en même temps dans OnTesterDeinit ? c'est-à-dire qu'il faut faire une boucle pour attendre pendant combien de temps ?

Je pensais précédemment que la situation était la suivante : OnTesterPass n'est appelé que pour les images qui sont arrivées depuis la fin du précédent OnTesterPass, mais si une nouvelle image est arrivée pendant que OnTesterPass était en cours, et plus précisément - depuis le dernier appel de FrameNext et avant l'achèvement de la fonction, cette image sera suspendue, jusqu'à ce qu'une nouvelle image générant l'événement arrive. C'est pourquoi OnTesterDeinit est nécessaire pour recevoir ces trames dormantes.

 
Alexey Navoykov:

Si les cadres peuvent arriver plus tard, il n'y a aucune garantie qu'ils seront immédiatement disponibles dans OnTesterDeinit ? c'est-à-dire qu'il faut faire un cycle d'attente ? et combien de temps faut-il attendre ?

Je pensais précédemment que la situation était la suivante : OnTesterPass n'est appelé que pour les images qui sont arrivées depuis la fin du précédent OnTesterPass, mais si une nouvelle image est arrivée pendant que OnTesterPass était en cours, et plus précisément - depuis le dernier appel de FrameNext et avant l'achèvement de la fonction, cette image sera suspendue, jusqu'à ce qu'une nouvelle image générant l'événement arrive. C'est pourquoi OnTesterDeinit est nécessaire pour récupérer ces cadres dormants.

FrameNext est une stupide lecture de fichier mqd et rien d'autre.

FrameFirst est FileSeek.
 
fxsaber:

J'ai essayé une fois, ça n'a pas marché. Seul un FrameAdd a fonctionné.

J'ai montré un exemple ici.
 

Merci.


PS FrameFirst est redondant ici

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

Test de stratégies sur un calendrier avec substitution automatique du résultat au conseiller expert.

Slava, 2013.04.10 15:04

Voici un exemple. Dans OnTester, le conseiller expert envoie deux trames - l'historique des transactions et l'historique sur lequel il travaillait.

Dans OnTesterDeinit, il reçoit et traite toutes les trames du premier et du second type.

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);
        }
     }
//---
  }
 
fxsaber:


PS FrameFirst est superflu ici.

Non. Pas superflue - purement méthodologique. Un bloc de code complet sans aucune valeur par défaut

Ce code a été arraché à un code plus complexe. Quatre types de trames différentes ont été transmises. En même temps, nous lisons aussi OnTesterPass. Voici le code "raffiné".

 
Slava:

Non. Pas de redondance - purement méthodologique. Un bloc complet de code sans aucune valeur par défaut

Ce code a été arraché à un code plus complexe. Quatre types de trame différents ont été transmis. En même temps, nous lisons aussi OnTesterPass. Nous présentons ici le code "raffiné".

About FrameFirst est toujours superflu s'il est appelé avant FrameFilter.

Je ne recommanderais pas le transfert de données par plus d'un cadre.

 
fxsaber:

A propos de FrameFirst est toujours redondant s'il est appelé avant FrameFilter.

Il n'est pas recommandé de faire passer les données par plus d'un cadre.

1. Oui. Elle peut être superflue.

2. un type de trames est lu dans OnTesterPass et terminé dans OnTesterDeinit. Les autres cadres sont lus dans OnTesterDeinit

Cette possibilité d'envoyer et de recevoir plusieurs types de trames nous a permis de corriger plusieurs erreurs qui étaient 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.

 
Slava:

Allez-vous ouvrir l'opt-format ?

 
Slava:

2. un type de trames est lu dans OnTesterPass, terminé dans OnTesterDeinit. Les autres cadres sont lus dans OnTesterDeinit.

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

Raison: