Caractéristiques du langage mql5, subtilités et techniques - page 51

 
fxsaber:

C'est un bon truc. L'astuce consiste à appliquer le motif au TParent. Je n'ai jamais rien vu de tel auparavant.

Eh bien, ce n'est pas un héritage multiple. C'est en fait une chaîne Base -> A -> B -> C -> X. Qui vous empêche de l'utiliser directement si elle est suffisante ?

 
Stanislav Korotky:

Eh bien, ce n'est pas un héritage multiple. C'est en fait une chaîne Base -> A -> B -> C -> X. Qui vous empêche de l'utiliser directement si elle est suffisante ?

La brièveté.

 
fxsaber:

La brièveté.

Je ne pourrais pas être plus d'accord. À mon avis, prescrire directement les quatre classes de successeurs serait plus court et plus clair.

 
Stanislav Korotky:

Je ne pourrais pas être plus d'accord. À mon avis, prescrire directement les quatre classes de successeurs serait plus court et plus clair.

Si, soudainement, l'héritage pluriel est introduit, il suffit d'effectuer un petit changement en une seule ligne

class X : public INHERIT3(A, B, C)  {  };   // Объявляем класс, наследуемый от A, B, C
 
fxsaber:

Si, soudainement, l'héritage multiple est introduit, il suffirait d'une petite substitution dans une seule ligne

Dommage que le forum ne dispose pas d'un formulaire de pari en plus des sondages - comme un sondage avec des options, mais bloquant quelques "centimes" sur le compte pour la réponse. Ceux qui choisissent la bonne option obtiendront les paris des perdants après l'événement ;-). Je ne pense pas qu'ils l'introduiraient.

 
Stanislav Korotky:

Eh bien, ce n'est pas un héritage multiple. C'est en fait une chaîne Base -> A -> B -> C -> X. Qui vous empêche de l'utiliser directement si elle est suffisante ?

Oui, mais la caractéristique principale est que toutes les classes sources sont définies et utilisées comme modèles. Cette chaîne peut donc être placée dans n'importe quel ordre. En substance, il n'y a pas de différence fondamentale avec l'héritage multiple. Comme je l'ai déjà écrit, les classes peuvent comporter des pièges. Quant aux interfaces, tout est identique. La seule chose est qu'il aura l'air un peu croûté, mais ici chacun est libre de décider s'il faut vérifier ou conduire ;)
 

Une dernière chose que j'aimerais ajouter. Une alternative complète à l'héritage multiple (et avec des options plus flexibles) pourrait être implémentée via la surcharge de l'opérateur fantôme. Mais MQ, pour une raison quelconque, n'a pas ajouté cette fonction de surcharge alors que je leur demande de le faire depuis longtemps. Et je n'ai même pas entendu de réponse concrète de leur part, ils se contentent de l'ignorer.

 

Il y a des situations comme celle-ci

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

Bugs, bugs, questions

fxsaber, 2017.07.24 09:27

EA est compilé sous 1641 où l'historique de trading rapide est implémenté.

Est-il possible que l'optimisation arrive à l'Agent build 1596, où l'historique fonctionne TRÈS lentement, et par conséquent obtenir un ralentissement de l'optimisation à plusieurs reprises ?

De manière plus générale, l'optimisation sur le Cloud donne parfois des résultats différents non seulement en termes de temps, mais aussi en termes de calculs. Il arrive parfois que le résultat de l'optimisation ne coïncide pas avec une seule exécution.

Cela peut être dû au fait que les agents impliqués dans l'optimisation et un agent local impliqué dans une seule exécution peuvent avoir un numéro de construction différent.

Et chaque version contient des bogues différents. Par exemple, voici un bogue qui est pertinent aujourd'hui, mais qui n'était pas présent dans les builds il y a quelques années

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

Bugs, bugs, questions

fxsaber, 2017.07.17 23:08

Encore une fois le bug de HistorySelect dans le testeur. Il ne semblait pas l'avoir en 1626. En 1629, il y a.

#include <Trade\Trade.mqh>

void OnTick()
{
  static CTrade Trade;

  const datetime NowTime = TimeCurrent();
  
  if (Trade.Buy(1) && Trade.PositionClose(_Symbol) && HistorySelect(NowTime, NowTime))
  {
    Print(HistoryDealsTotal()); // 0 - это при том, что мы открыли и закрыли позицию в NowTime-время
      
    ExpertRemove();
  }
}

Par conséquent, si votre EA touche l'Agent b1626 pendant l'optimisation, il peut afficher un résultat, mais lorsqu'il est exécuté sur l'Agent b1641 local, un résultat complètement différent.

Nous pouvons en conclure qu'avant l'optimisation, vous devez savoir pour quels bâtiments vous souhaitez optimiser votre EA et ceux pour lesquels il ne l'est pas.

Les développeurs ont prévu un coupeur pour les agents inadaptés - INIT_AGENT_NOT_SUITABLE.


Par conséquent, je recommanderais d'écrire une vérification pour faire correspondreTerminalInfoInteger(TERMINAL_BUILD) avec les valeurs souhaitées dans OnInit pour les optimisations basées sur le Cloud.

Mais il est presque impossible de connaître la liste des contrôles qui correspondent à vos besoins, donc vous écrirez probablement ceci

int OnInit( void )
{
  // Если Агент не совпадает с билдом компиляции, отказываемся от его услуг
  if (TerminalInfoInteger(TERMINAL_BUILD) != __MQLBUILD__)
    return(INIT_AGENT_NOT_SUITABLE);
//....

Mais c'est aussi une mauvaise solution. Une solution plus souple consiste à transmettre votre numéro de build aux agents pendant l'optimisation.


En général, soyez vigilant.


SZY. Il est possible de générer un rapport commercial de chaque exécution de l'agent et de l'obtenir en une seule fois pendant l'optimisation. Cela peut aider à mieux comprendre pourquoi le résultat de l'agent dans le nuage est différent du résultat local lors d'une seule exécution. La génération automatique de ces rapports pendant l'optimisation et l'exécution unique est possible avec l'aide de cette bibliothèque.

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

Bugs, bugs, questions

Renat Fatkhullin, 2017.07.25 08:26

Nous coupons périodiquement les anciennes builds dans le clouda, en attendant qu'elles soient mises à jour, ce qui passe très vite et inaperçu.

Cela n'est pas fait à chaque version, mais en fonction de l'importance des modifications apportées.
Report
Report
  • votes : 12
  • 2017.07.19
  • fxsaber
  • www.mql5.com
Библиотека для MetaTrader 4/5, которая позволяет формировать отчеты по истории торгов.
 

Lors du débogage (pas nécessairement du débogage), lorsque vous voulez réduire rapidement l'intervalle de test dans le testeur, j'utilise les fonctions suivantes

// Выгружает эксперт, если количество сделок в истории больше DealsNum.
void ConditionStopExpert( const int DealsNum = INT_MAX )
{
  if ((DealsNum != INT_MAX) && ::HistorySelect(0, ::TimeCurrent()) && ::HistoryDealsTotal() > DealsNum)
    ::ExpertRemove();

  return;  
}

// Выгружает эксперт, если с момента запуска прошло AmountHours-часов.
void ConditionStopExpert( const double AmountHours )
{
  static datetime FirstTime = ::TimeCurrent();
  
  if (::TimeCurrent() > FirstTime + (datetime)(AmountHours * 3600))
    ::ExpertRemove();

  return;  
}
 
fxsaber:

Lors du débogage (pas nécessairement du débogage), lorsque vous avez besoin de réduire rapidement l'intervalle de test dans le testeur, j'utilise les fonctions suivantes

Corrigez le code, vous avez le numéro 5 dans la première fonction au lieu de DealsNum.
Raison: