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

 
// Возвращает текущее количество объектов классов
int GetAmountObjects( void )
{
  const class CLASS_TMP {} Tmp;
  
  return((int)::StringFormat("%d", &Tmp) - 1);
}
Exemple d'utilisation
int OnInit()
{
  if (GetAmountObjects() > 0)
    Print("До " + __FUNCSIG__ + " были вызваны конструкторы!");

  return(INIT_SUCCEEDED);
}
 

l'exemple est tiré du post contrôle aléatoire

void OnStart()
{
  string Str = "1.23qwedfg";
  
  Print((int)Str);;;;;;;
  Print((double)Str);;;
}

Les points-virgules n'affectent pas le résultat de la compilation .... aucune erreur
 
ruslan:

les points-virgules n'affectent pas le résultat de la compilation .... résultat sans erreur

Il n'y en a pas.
 

Initialiser des variables statiques en appelant des fonctions est une fonctionnalité non documentée qui est apparue complètement par accident, mais qui est maintenant très problématique à supprimer.

Les appels aux fonctions de l'environnement commercial pour initialiser les variables statiques sont fortement déconseillés.

 
float f = 16777217; // 16777216.0
 
Vladimir Karputov:


Il n'est pas nécessaire de sortir la phrase de son contexte. La phrase est la suivante :

Pour assurer la plus grande précision dans les tests, les barres minutes sont également utilisées en mode tick réel. Ceux-ci sont utilisés pour vérifier et corriger les données de coche. Il permet également d'éviter la divergence des graphiques dans le testeur de stratégie et dans le terminal client.

Cela signifie-t-il que l'historique des barres d'une minute ne correspond pas aux barres de tic-tac ?

Comment est-ce possible ... en supposant que les données correspondent à l'historique réel des transactions ?

 
#define  DEFINE_TOSTRING(A) string ToString( const A Var ) { return((string)Var); }
  DEFINE_TOSTRING(char)
  DEFINE_TOSTRING(short)
  DEFINE_TOSTRING(int)
  DEFINE_TOSTRING(long)
  
  DEFINE_TOSTRING(uchar)
  DEFINE_TOSTRING(ushort)
  DEFINE_TOSTRING(uint)
  DEFINE_TOSTRING(ulong)
  
  DEFINE_TOSTRING(bool)
  
  DEFINE_TOSTRING(string)
  
  DEFINE_TOSTRING(double)
  DEFINE_TOSTRING(float)

  DEFINE_TOSTRING(color)  
  
  DEFINE_TOSTRING(datetime)  
#undef  DEFINE_TOSTRING

template <typename T>
string ToString( const T Var ) { return(::EnumToString(Var)); }

void OnStart()
{
  Print(ToString(1));
  Print(ToString(clrRed));
  Print(ToString(TimeCurrent()));
  Print(ToString(ACCOUNT_LOGIN));
}
 
template <typename T>
class IS
{
public:
  template <typename T1>
  static bool Object( const T1* Ptr )
  {
    return(dynamic_cast<const T*>(Ptr) != NULL);
  }
};

class CLASS1 {};
class CLASS2 : public CLASS1 {};
class CLASS3 : public CLASS1 {};

void OnStart()
{
  CLASS2 Object;
  CLASS1* Ptr = &Object;
  
  Print(IS<CLASS1>::Object(Ptr)); // true - Ptr указывает на объект класса CLASS1
  Print(IS<CLASS2>::Object(Ptr)); // true - Ptr указывает на объект класса CLASS2
  Print(IS<CLASS3>::Object(Ptr)); // false - Ptr НЕ указывает на объект класса CLASS3
}
 
Recommandations pour mesurer la vitesse du testeur

Exécutez plusieurs optimisations (pas une seule !) pour 10 passes (50 serait trop). Gardez à l'esprit qu'il y a un cache d'optimisation, donc soit vous recompilez EA entre les optimisations, soit vous changez les valeurs de l'énumération des faux paramètres (c'est préférable). Les 2 valeurs extrêmes en haut et en bas doivent être écartées. Analysez les 6 valeurs restantes de chaque optimisation.

Ne pas utiliser de minuterie microseconde pour les mesures de masse. Utilisez le GetTickCount normal en millisecondes. Utilisez une gamme de dates d'essai tellement large que les millisecondes se mesurent en centaines et en milliers. Vous obtiendrez alors des mesures plus précises et plus stables.

 
fxsaber:
Recommandations pour mesurer la vitesse du testeur
Vous avez oublié de préciser que le début de la mesure se situe au début du premier OnTick. La fin de la mesure se situe au début de OnDeinit.