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

 
Slava:
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.
Ou au début de OnTester, car
// После окончания бэктеста сначала вызывается OnTester, затем OnDeinit

Dans le sujet

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

Bugs, bugs, questions

fxsaber, 2016.08.25 11:13

Cycle de vie
// Возвращает true, если полностью выполнился OnTick() на последнее событие NewTick в тестере - окончание бэктеста. Иначе - false.
   static bool BACKTEST::IsEnding(void)
     {
      return(::TesterStatistics(STAT_BALANCEMIN) > 0);
     }
 
fxsaber:
Ou au début du OnTester, comme


Et renvoyer le résultat de la mesure comme code de retour de OnTester.
 
Slava:
Et renvoyer le résultat de la mesure comme code de retour de OnTester.

Je n'ai pas encore testéGetTickCount dans le testeur. J'ai supposé que cette fonction sera émulée par le testeur, ce qui peut être logique dans certaines situations.

Au fait, comment comprendre l'heure actuelle dans le testeur à la ms près ? SymbolInfoTick+Tick.time_msc permet de connaître l'heure de l'appel OnTick du symbole principal. Et donc même pour vérifier l'exactitude du mode de glissement du testeur. Mais il semble qu'il n'y ait pas d'autre moyen.


Vraiment, je voulais demander autre chose. Afin d'automatiser un lot dans l'optimiseur avec le rejet des premières et dernières valeurs, je dois agir à travers les cadres (pour passer OnTester-result), ou cela va fausser le résultat ?

 
GetTickCount dans le testeur fonctionne normalement et n'est pas émulé, contrairement à Sleep
 
fxsaber:

Vraiment, je voulais demander autre chose. Afin d'automatiser les bancs dans l'optimiseur avec le rejet de la première et de la dernière valeur, je dois agir à travers les cadres (pour passer le OnTester-result), ou cela va fausser le résultat ?

Elle ne doit pas. Il est envoyé après la mesure. Essayez
 
Slava:
N'utilisez pas de minuterie à microseconde pour les mesures de masse. Utilisez le GetTickCount normal en millisecondes.

Est-ce queGetMicrosecondCount ralentit plus le testeur que GetTickCount (ou est-il émulé) ?

Ou l'échec de EventSetMillisecondTimer était-il intentionnel ?

 
fxsaber:

Est-ce que GetMicrosecondCount ralentit plus le testeur que GetTickCount (ou est-il émulé) ?

Ou l'échec de EventSetMillisecondTimer était-il intentionnel ?

Je voulais dire GetMicrosecondCount. Je ne peux pas dire avec certitude si ça ralentit le serveur. Elle peut avoir un effet indirect. Par conséquent, il est préférable d'utiliser la fonction native GetTickCount du système.

GetMicrosecondCount est utilisé pour mesurer les courtes périodes d'exécution du code. Pour mesurer un grand nombre d'exécutions OnTick, il est préférable d'utiliser GetTickCount.

Essayez d'utiliser GetMicrosecondsCount au lieu de GetTickCount lorsque vous obtenez des résultats stables. Vous m'en parlerez ici. Peut-être que je m'inquiète trop à ce sujet.

 
Il existe deux tableaux d'historique courant dont les données sont accessibles via les fonctions d'historique : le tableau des commandes et le tableau des transactions.

Leur contenu ne peut être influencé que par les fonctions HistorySelect. Et cela se passe comme suit

  • HistorySelect et HistorySelectByPosition - affectent les deux tables simultanément.
  • L'option HistoryDealSelect affecte UNIQUEMENT la table Deals (elle n'a aucun effet sur la table Orders-history actuelle).
  • HistoryOrderSelect affecte UNIQUEMENT la table Orders (n'affecte pas la table Deals-history actuelle).

 
Dans les ordres, il est possible de définir le champ Request.expiration jusqu'à et y compris LONG_MAX + 2. Sa valeur sera entièrement disponible via ORDER_TIME_EXPIRATION si l'ordre est actif (pas dans la table d'historique).
 
L'identifiant de position des transactions de solde est égal à zéro. Il est donc facile d'écrire, par exemple, cette fonction
// Возвращает сумму всех балансовых не торговых операций (начисления + списания)
double GetSumBalanceOperations( void )
{
  double Res = 0;
  
  if (HistorySelectByPosition(0))
    for (int i = HistoryDealsTotal() - 1; i >= 0; i--)
      Res += HistoryDealGetDouble(HistoryDealGetTicket(i), DEAL_PROFIT);
      
  return(Res);
}

DEAL_ENTRY de ces transactions est DEAL_ENTRY_IN (0).