Erreurs, bugs, questions - page 452

 

Merci !

 
alexvd:

Oui, sur le premier point, je suis clairement confus. Expliquez ce qui ne va pas dans la description, pour qu'une copie soit renvoyée ?

Et pour ce qui est de la concaténation, dans votre cas, vous auriez dû écrire quelque chose comme

Pour clarifier. Il est dit"Renvoie une copie de la chaîne avec une valeur modifiée du caractère à la position spécifiée. "Le prototype de la fonction est boolStringSetCharacter(...). Évidemment, vous ne pouvez pas mettre une chaîne de caractères dans un bool. Si un booléen est effectivement renvoyé, c'est apparemment un signe de réussite ou d'erreur. Normalement, les autres pages de documentation ont une section séparée sur la valeur renvoyée, mais cette page n'en a pas.Il faut l'ajouter, et dans la description textuelle formuler une phrase concernant la sémantique de la fonction, et non la valeur de retour.


En ce qui concerne la concaténation, si ce que vous avez écrit est correct, la description de la fonction StringConcatenate devrait également être modifiée. Ladescription indique que le paramètre string_var est une chaîne [in][out] qui sera générée à la suite de la concaténation. Vous indiquez que ce paramètre est seulement [out].

 
Nouvelle question. Que signifie le fait que BarsCalculated renvoie 0. Cela ne semble pas être une erreur, mais comment peut-on calculer 0 barre ? En fait, rien n'a été compté. N'est-ce pas une erreur ?
 
MoneyJinn:

Malheureusement, le problème est que le terminal ne publie que les ordres de fermeture de positions avec commentaires dans l'onglet "Résultats".

La commande correspondante n'est pas ajoutée à la liste de HistoryDealsTotal().

Dans la liste générale des ordres HistoryOrdersTotal(), l'ordre est également absent, même si vous sélectionnez une période avec une certaine redondance.

Je peux vous assurer que les commandes et les transactions, dans le cas d'une clôture par "fin de test", sont présentes dans l'historique. Mon multidevise calcule le bénéfice réalisé sur chaque symbole. Les transactions fermées dans le testeur par "fin du test" sont corrigées dans la désinitialisation pour refléter ces transactions. Le bénéfice total pour tous les symboles coïncide avec les données du rapport de test. Voici le code ;

       if(HistorySelect(0,TimeTradeServer()))   // Поправка для 'end of test'
        {
         int DeelsTotal=HistoryDealsTotal();
         for(int i=0;i<SymbolsNumber;i++)
           {
            ulong ticket=HistoryDealGetTicket(DeelsTotal-1-i);
            string comment=HistoryDealGetString(ticket,DEAL_COMMENT);
            if(comment!="end of test"&&StringSubstr(comment,0,3)!="so ")
               break;
            for(int j=0;j<SymbolsNumber;j++)
              {
               if(HistoryDealGetString(ticket,DEAL_SYMBOL)!=m_expert[j].Name())
                continue;
               m_Profit[j]=m_Profit[j]+HistoryDealGetDouble(ticket,DEAL_PROFIT)+  // Добавим профит закрытой позиции для "end of test" и "so"
                           HistoryDealGetDouble(ticket,DEAL_SWAP)+HistoryDealGetDouble(ticket,DEAL_COMMISSION);
              }
           }
        }
 

Chers collègues, y a-t-il un moyen de faire fonctionner SymbolInfoSessionTrade dans le testeur de stratégie ?

Une entrée triviale ne fonctionne pas :

void OnTick() {
  datetime from, to;
  if (SymbolInfoSessionTrade(_Symbol, FRIDAY, 0, from, to)) Print("WOW!");
}
Документация по MQL5: Получение рыночной информации / SymbolInfoSessionQuote
Документация по MQL5: Получение рыночной информации / SymbolInfoSessionQuote
  • www.mql5.com
Получение рыночной информации / SymbolInfoSessionQuote - Документация по MQL5
 

Une dernière question, si possible. J'aimerais comprendre la signification du nouvel opérateur. Quelle est l'idée derrière tout ça ? Pourquoi ne pas créer l'objet de la manière habituelle ? Après tout, après la fin du bloc, l'accès à l'objet déclaré par new sera perdu, alors pourquoi en avons-nous besoin ?

P.S. Honnêtement, je ne l'ai pas trouvé dans la documentation :)

Документация по MQL5: Основы языка / Операторы / Оператор создания объекта new
Документация по MQL5: Основы языка / Операторы / Оператор создания объекта new
  • www.mql5.com
Основы языка / Операторы / Оператор создания объекта new - Документация по MQL5
 
220Volt:

Une dernière question, si possible. J'aimerais comprendre la signification du nouvel opérateur. Quelle est l'idée derrière tout ça ? Pourquoi ne pas créer l'objet de la manière habituelle ? Après tout, après la fin du bloc, l'accès à l'objet déclaré par new sera perdu, alors pourquoi en avons-nous besoin ?

Tout passe à un moment donné. Cela signifie-t-il que rien ne doit être fait... ?


P.S. Honnêtement, je n'ai pas pu le trouver dans la documentation :)

Je te crois... :))
 
Valmars:

Merci ! J'ai compris. Il est nécessaire et suffisant d'utiliserTimeTradeServer() au lieu de TimeCurrent().

À la fin de la semaine de négociation, il n'y a pas de nouvelles cotations et c'est pourquoi TimeCurrent() n'est pas mis à jour pendant un long moment.

Lors de la désinitialisation de l'Expert Advisor, TimeCurrent() indique l'heure 23:00 ; TimeTradeServer() indique l'heure 23:59, ce qui coïncide avec la fin du test.

 
MoneyJinn:

Merci ! J'ai compris. Il est nécessaire et suffisant d'utiliserTimeTradeServer() au lieu de TimeCurrent().

À la fin de la semaine de négociation, il n'y a pas de nouvelles cotations et, par conséquent, TimeCurrent() n'est pas mis à jour pendant une longue période.

Il ne s'agit pas de guillemets, mais du fait que les contrats de "fin d'essai" sont exécutés après la fin de la période d'essai. Ainsi, ni 'OnTick' ni 'OnTimer' ne peuvent les récupérer dans l'historique. Du moins, c'était comme ça il y a un an, alors j'ai déplacé leur vérification vers 'OnDeinit'.
 
220Volt:

Une dernière question, si possible. J'aimerais comprendre la signification du nouvel opérateur. Quelle est l'idée derrière tout ça ? Pourquoi ne pas créer l'objet de la manière habituelle ? Après tout, à la fin du bloc, l'accès à l'objet déclaré via new sera perdu, alors pourquoi en avons-nous besoin ?

P.S honnêtement je n'ai pas pu le trouver dans la documentation :)

Ne créez pas d'objets dynamiques - n'utilisez pas maintenant et tout ce qui est associé à ces objets (bien qu'ensuite vous ne puissiez pas faire grand chose).

Vous voulez comprendre non pas le sens de maintenant, mais le sens de travailler avec des objets dynamiques...

Initialisation et désinitialisation des objets placés dynamiquement

Les pointeurs vers des objets sontun cas particulier, car la déclaration d'un pointeur ne nécessite pas l'initialisation de l'objet en question. Les objets placés dynamiquement ne sont initialisés qu'au moment de la création d'une instance d'une classe par l'opérateur new. L 'initialisation d'un objet implique un appel du constructeur de la classe correspondante. S'il n'y a pas de constructeur correspondant dans une classe, ses membres de type simple ne seront pas initialisés automatiquement ; les membres de type chaîne de caractères, tableau dynamique et objet complexe seront initialisés automatiquement.

Les pointeurs peuvent être déclarés localement ou globalement, et peuvent être initialisés avec une valeur NULL vide ou avec un pointeur du même type ou d' un type engendré . Sinew estappelé sur un pointeur déclaré au niveau local , l'instruction deletede ce pointeur doit être exécutée avant de quitter le niveau local également. Sinon, le pointeur sera perdu et l'objet ne pourra pas être supprimé explicitement.

Tous les objets créés par l'expression pointer_objet=new_ClassName doivent ensuite être détruits avec l'opérateur delete(pointer_objet).Si, pour une raison quelconque, cette variable n'a pas été détruite par l'opérateur de suppression, un message à ce sujet apparaîtra dans le Journal des experts. Vous pouvez déclarer plusieurs variables et leur attribuer à toutes des pointeurs vers le même objet.

Si l'objet créé dynamiquement a un constructeur, ce constructeur sera appelé lorsque l'opérateur newsera exécuté . Si l'objet a un destructeur, celui-ci sera appelé lorsque l'opérateur desuppression sera exécuté.

Ainsi, les objets placés dynamiquement sont créés uniquement lorsqu'ils sont créés à l'aide de l'opérateur new, et il est garanti qu' ils seront supprimés soit par l'opérateur delete , soit automatiquement par le système d'exécution de MQL5 au moment du déchargement du programme.L'ordre de déclaration des pointeurs des objets créés dynamiquement n'affecte pas l'ordre de leur initialisation. L'ordre d'initialisation et de désinitialisation est entièrement contrôlé par le programmeur.