Erreurs, bugs, questions - page 100

 
Urain:

Existe-t-il une terminaison forcée de la fonction OnTester()?

ou pourquoi l'historique des transactions avant la fonction personnalisée existe et renvoie zéro après :

double OnTester()
  {
   int HTD=-1;
   Custom_func();
   if(HistorySelect(0,TimeCurrent()))HTD=HistoryDealsTotal();   
   return(HTD);
  }

Quelles sont les fonctions qui ne fonctionnent pas dans le testeur ?

comment le testeur (pendant l'optimisation) peut-il signaler à l'extérieur que quelque chose ne va pas (impression d'alertes, rien ne fonctionne) ?

Apparemment, tout le monde dort ce soir.
 
Urain:
Apparemment, tout le monde dort aujourd'hui.

Avez-vous regardé les journaux de l'agent, peut-être que tout y est ?

Pour autant que je sache, les imprimantes ne sont pas affichées dans le journal principal du testeur uniquement pendant l'optimisation (en mode normal, tout est OK).

D'après ce que je comprends, il n'est pas possible de sortir de force de OnTester(). Et pour quoi faire ? Il calcule simplement un certain résultat de test (de plus, il ne sert essentiellement qu'à l'optimisation) ?

OnTester:
La fonction OnTester() est un gestionnaire d'événement de test qui est automatiquement généré à la fin du test historique du conseiller expert sur un intervalle de date donné. La fonction doit être définie avec le type double, elle n'a pas de paramètres :

doubleOnTester() ;

La fonction est appelée immédiatement avant OnDeinit() et a le type de retour double. La fonction OnTester() ne peut être utilisée que par les experts pendant les tests. Son objectif principal est de calculer une valeur à utiliser comme critère Custom max dans l'optimisation génétique des paramètres d'entrée.


PS

> pourquoi l'historique des transactions avant une fonction personnalisée, mais après cela, il affiche zéro...

Cette question s'adresse peut-être aux développeurs.

D'après ce que je comprends, OnTester doit retourner le nombre de transactions (s'il y en a), tandis que Custom_func() est compris comme une fonction personnalisée ?

 
Urain:

Dédié aux développeurs ...

Vous auriez au moins prévenu si vous donniez une opportunité qui, en principe, n'était pas possible auparavant.

J'ai perdu vingt-quatre heures à essayer d'attraper ce bug.

Ne me dites pas que c'est bon. Bien sûr que je le sais, mais j'ai perdu 24 heures juste parce que je suis habitué au fait qu'avec ce...

J'ai l'habitude que le compilateur me donne une erreur.

Quelle est la bonne chose à faire à la fin ? C'est "==" ou "=" ?
 
Urain:

Existe-t-il une terminaison forcée de la fonction OnTester()?

ou pourquoi l'historique des transactions avant la fonction personnalisée existe et renvoie zéro après :

Quelles sont les fonctions qui ne fonctionnent pas dans le testeur ?

comment signaler au testeur (pendant l'optimisation) que quelque chose ne va pas (alertes d'impression, rien ne fonctionne) ?

Merci pour votre message. Votre demande a été reçue - nous la traitons.

 

Comment calculer le lot maximum autorisé par marge pour ouvrir une nouvelle position ? Dans MQL4, cela se faisait comme suit :

MaxLot=AccountFreeMargin()/MarketInfo(Symbol(),MODE_MARGINREQUIRED);
 
EvgeTrofi:

Comment calculer le lot maximum autorisé par marge pour ouvrir une nouvelle position ? Dans MQL4, cela se faisait de la manière suivante :

A peu près comme ça :

double CalculateMaxVolume(string symbol)
  {
   double price=0.0;
   double margin=0.0;
//--- select lot size
   if(!SymbolInfoDouble(symbol,SYMBOL_ASK,price))                return(0.0);
   if(!OrderCalcMargin(ORDER_TYPE_BUY,symbol,1.0,price,margin)) return(0.0);
   if(margin<=0.0)                                            return(0.0);

   double lot=NormalizeDouble(AccountInfoDouble(ACCOUNT_FREEMARGIN)/margin,2);
//--- normalize and check limits
   double stepvol=SymbolInfoDouble(symbol,SYMBOL_VOLUME_STEP);
   lot=stepvol*NormalizeDouble(lot/stepvol,0);

   double minvol=SymbolInfoDouble(symbol,SYMBOL_VOLUME_MIN);
   if(lot<minvol) lot=minvol;

   double maxvol=SymbolInfoDouble(symbol,SYMBOL_VOLUME_MAX);
   if(lot>maxvol) lot=maxvol;
//--- return trading volume
   return(lot);
  }
Ce code ne se contente pas de calculer le volume maximal, mais l'inscrit exactement dans les limites des paramètres du symbole.
Документация по MQL5: Стандартные константы, перечисления и структуры / Состояние окружения / Информация об инструменте
Документация по MQL5: Стандартные константы, перечисления и структуры / Состояние окружения / Информация об инструменте
  • www.mql5.com
Стандартные константы, перечисления и структуры / Состояние окружения / Информация об инструменте - Документация по MQL5
 
Renat:

Ça donne quelque chose comme ça :

Ce code ne se contente pas de calculer le volume maximal, il l'inscrit aussi exactement dans les limites de la configuration des caractères.
Merci ! Je n'ai pas OrderCalcMargin() dans mon aide :)
 
EvgeTrofi:
Merci ! Je n'ai pas OrderCalcMargin() dans mon aide :)
Cette fonction a été ajoutée il y a longtemps - regardez dans la documentation, s'il vous plaît.
 
EvgeTrofi:
Alors, quel est le bon chemin à suivre en fin de compte ? C'est "==" ou "=" ?

De toute façon.

if(a==0){expression} signifie que si a est égal à 0, c'est vrai, donc nous exécutons {expression}.

if(a=0){expression} equals if(a){a=0;expression} si a est vrai, {a=0;expression}.

 
Interesting:

Avez-vous regardé les journaux de l'agent, peut-être que tout y est ?

Pour autant que je sache, les imprimantes ne sont pas affichées dans le journal principal du testeur uniquement pendant l'optimisation (en mode normal, tout est OK).

D'après ce que je comprends, il n'est pas possible de sortir de force de OnTester(). Et pour quoi faire, il ne fait que calculer un certain résultat de test (qui en fait ne sert qu'à l'optimisation) ?

PS

> Pourquoi l'historique des transactions avant une fonction personnalisée existe et donne zéro après...

C'est peut-être un problème pour les développeurs.

D'après ce que je comprends, le OnTester doit renvoyer le nombre de transactions (s'il y en a), tandis que la fonction personnalisée est Custom_func() ?

Le problème est que dans l'optimisation elle-même, le programme ne fonctionne pas comme dans d'autres situations (c'est pourquoi j'ai besoin d'envoyer un message depuis OnTester).

C'est dans ce but que j'ai inventé l'analogique print (fonction qui crée un fichier dans le but d'imprimer une chaîne de caractères passée à la fonction comme paramètre).

int prints=0;// счётчик вызовов, должен быть обьявлен глобально
//+------------------------------------------------------------------+
//| вывод информации из под тестера                                  |
//+------------------------------------------------------------------+
void WriteFilePrint(string text,string folder="Print")
  {
   string subfolder="Print";
   int han=FileOpen(subfolder+"\\"+folder+(string)prints+".csv",FILE_WRITE|FILE_CSV,";");
   if(han!=INVALID_HANDLE)
     {
      FileWrite(han,text);
      FileClose(han);
     }
   else Print("File open failed"+subfolder+"\\"+folder+".txt, error",GetLastError());
   prints++;
  }

Ainsi, j'ai réussi à attraper l'exécution incorrecte de certaines fonctions dans OnTester.

Raison: