Erreurs, bugs, questions - page 2180

 
A100:

Et je ne comprends pas comment vous faites la différence entre les barres zéro dans une période donnée et ce zéro:

Extrait de la documentation : Si les données d'une série chronologique avec les paramètres spécifiés au moment de l 'appel de la fonction Bars() n'ont pas encore été générées dans le terminal, ou si les données de la série chronologique ne sont pas synchronisées avec le serveur de négociation au moment de l'appel de la fonction, celle-ci renvoie zéro.

L'origine du zéro n'est pas importante dans cette question, ce qui est important c'est que ce zéro est engendré par la fonction Bars pour toujours sous la forme de quelques dizaines de secondes.

 
A100:

Ce que je ne comprends pas, c'est comment vous faites la distinction entre les barres zéro dans un intervalle de temps donné et ce zéro:

Extrait de la documentation : Si les données d'une série chronologique avec les paramètres spécifiés lors de l'appel de la fonction Bars() n'ont pas encore été générées dans le terminal, ou si les données de la série chronologique au moment de l'appel de la fonction ne sont pas synchronisées avec le serveur de négociation, la fonction renvoie zéro.

En d'autres termes, comment puis-je faire la différence entre un résultat nul et une erreur nulle ?

Pensez-y. Si vous aviez la tâche de créer un analogue de la fonction Bars et qu'on vous donnait un tableau datetime, dont les valeurs des éléments diminuent avec un nombre croissant, en d'autres termes, le tableau est trié.

Pensez-vous qu'il serait difficile d'implémenter un algorithme recherchant le nombre d'éléments d'un tel tableau trié dans un intervalle de temps donné ? Et s'il n'y a pas une seule barre dans l'intervalle donné ou si le tableau n'a pas encore été initialisé, nous devons retourner zéro.

Non, l'algorithme est assez simple. Qu'est-ce qu'il peut faire fonctionner pendant 22 secondes ?

 
Nikolai Semko:

Dans cette question, l'origine du zéro n'est pas importante, ce qui est important c'est que ce zéro est né de la fonction Bars depuis des lustres, sous la forme de quelques dizaines de secondes.

L'origine précise est importante, car si ::Bars() retournait -1 au lieu de 0 (comme maintenant) en cas d'erreur d'histoire, aucun retard ne se produirait. Mais maintenant, 0 est interprété comme une erreur et le retard est dû aux répétitions internes https://www.mql5.com/ru/forum/1111/page2200#comment_6955559.

De plus, supposons que nous introduisions une vérification supplémentaire et que le retard disparaisse. Alors que s'est-il passé ? Vous avez zéro. S'agit-il d'un résultat ou d'une erreur ?

Ошибки, баги, вопросы
Ошибки, баги, вопросы
  • 2018.03.31
  • www.mql5.com
Общее обсуждение: Ошибки, баги, вопросы
 
Vitaly Muzichenko:

Cela est probablement dû au chargement historique

Ce qui est amusant, c'est que la première impression est traitée sans délai, c'est-à-dire que l'historique par H4 est déjà chargé.

Et si vous changez CopyTime H4 en W1, il n'y aura pas de retard du tout. Cela signifie que l'historique pour W1 est déjà chargé aussi.

C'est juste que Bars est inhibé par l'intervalle de temps entre CurrentTime() et l'heure d'ouverture de la barre zéro.

 
A100:

C'est l'origine qui compte, car si ::Bars() renvoyait -1 au lieu de 0 (comme c'est le cas maintenant) en cas d'erreur d'historique, il n'y aurait pas de retard du tout. Mais maintenant, 0 est interprété comme une erreur et un retard se produit en raison des répétitions internes https://www.mql5.com/ru/forum/1111/page2200#comment_6955559.

De plus, supposons qu'un contrôle supplémentaire soit introduit et que le retard disparaisse. Alors que s'est-il passé ? Vous avez zéro. S'agit-il d'un résultat ou d'une erreur ?

Dans tous mes algorithmes, il importe peu que le résultat de zéro soit une barre qui ne tombe pas dans l'intervalle donné ou l'absence de tableau en tant que tel.

Vous vous éloignez du problème.

 
Nikolai Semko:

Tu t'éloignes du problème.

J'expose l'essence du problème, vous êtes fixé sur votre cas particulier. À en juger par votre message précédent, vous ne comprenez toujours pas quand un retard se produit (c'est d'ailleurs la cause), bien que la page précédente explique tout en détail.

Peut-être que ce script peut vous aider à comprendre

void OnStart()
{
        Print( "begin" );
        ::Bars( _Symbol, PERIOD_W1, D'2018.03.20', D'2018.03.23' );
        Print( "end" );
}
 
A100:
J'expose l'essence du problème, tandis que vous vous concentrez sur votre cas particulier. À en juger par votre message précédent, vous ne comprenez toujours pas quand un retard se produit (c'est d'ailleurs la raison), bien que la page précédente l'explique en détail.

J'ai déjà formulé mon opinion ci-dessus quant au moment où le retard se produit.

Encore une fois :
Bars raccroche si start_time est dans l'intervalle entre l'heure d'ouverture de la barre zéro du TF demandé et TimeCurrent(). (Juste une hypothèse, mais vérifiée en pratique)
Oui, l'erreur se produit dans un cas particulier. Mais les affaires privées ne devraient pas se trouver dans les fonctions intégrées standard du langage de programmation.

Et votre "point" n'est pas le point, car vous ne faites que citer la référence du commandement des barreaux, que je connais parfaitement. Il n'y a pas de code d'erreur dans la fonction Bars car elle n'est pas nécessaire.

D'autant plus que dans le cas présent, nous avons affaire à des tableaux complets de séries chronologiques.

Ceci peut être clairement vu dans le code légèrement modifié de mon script :

void OnStart()
  {
   datetime Arr[];
   if(CopyTime(_Symbol,PERIOD_W1,0,1,Arr)<0) Print("Ошибка");
   Print("Время открытия нулевого бара W1 = "+TimeToString(Arr[0]));
   ArraySetAsSeries(Arr,true);
   if(CopyTime(_Symbol,PERIOD_H4,0,100,Arr)<0) Print("Ошибка");
   Print("1 "+"CurrentTime = "+TimeToString(TimeCurrent()));
   int Res=Bars(_Symbol,PERIOD_W1,Arr[99],TimeCurrent());  // выполняется быстро   
   Print("2 Время открытия 99 бара H4 = "+TimeToString(Arr[99])+"  Номер бара W1= " +IntegerToString(Res)); 
   Res=Bars(_Symbol,PERIOD_W1,Arr[0],TimeCurrent());       // выполнение происходит более 10 секунд!!!   
   Print("3 Время нулевого бара H4 = "+TimeToString(Arr[0])+"  Номер бара W1= " +IntegerToString(Res));
  }

Résultat :

2018.03.30 23:39:31.079 BagBars (EURUSD,H4)     Время открытия нулевого бара W1 = 2018.03.25 00:00
2018.03.30 23:39:31.079 BagBars (EURUSD,H4)     1 CurrentTime = 2018.03.30 23:54
2018.03.30 23:39:31.079 BagBars (EURUSD,H4)     2 Время открытия 99 бара H4 = 2018.03.08 20:00  Номер бара W1= 3
2018.03.30 23:39:47.176 BagBars (EURUSD,H4)     3 Время нулевого бара H4 = 2018.03.30 20:00  Номер бара W1= 0
 
A100:

Peut-être que ce script aidera à comprendre

Votre script démontre ce problème - la suspension.

parce que l'intervalle de temps start_time - stop_time se trouve dans la barre hebdomadaire.

Si vous sortez de la barre hebdomadaire, alors il n'y a pas de gel :

Bars( _Symbol, PERIOD_W1, D'2018.03.12', D'2018.03.23' );

Merci pour cet exemple plus clair

 

Dans les fonctions MT4 CopyHigh, CopyLow (n'a pas regardé les autres) a causé une erreur critique quand il n'y avait pas d'historique dans le testeur. EA a été testé sur H1 et la demande provenait de M1.

1 15:14:35.410 2017.01.04 19:54:24  Access violation read to 0x0A971FE8 in 'C:\Users\Halyna\AppData\Roaming\MetaQuotes\Terminal\287469DEA9630EA94D0715D755974F1B\MQL4\Experts\____________.ex4'

3 15:14:35.465 2017.01.04 19:54:24 La passe de test a été interrompue en raison d'une erreur critique dans l'EA.

 
Définir le niveau de transparence des tampons indicateurs - quand ?