Questions des débutants MQL5 MT5 MetaTrader 5 - page 987

 

Bonjour, grand respect à tous ceux qui m'aident à comprendre les fonctionnalités de MT5. Sans vous, il est très difficile de le faire... stupeur, hoquet, course en rond. Alors, RESPECT et bravo à vous.


Question. Quelle est la meilleure façon de connecter lestaux_total et les limites des barres d'historique ? L'ai-je relié correctement dans le code ? Merci pour la réponse, indice, indice.

//--- Проверка количества доступных баров
   if(rates_total<24) return 0;
//--- Проверка и расчёт количества просчитываемых баров
   int limit=rates_total-prev_calculated;
   if(limit>1)
     
      limit=rates_total-1;

//Показать историю за CountPeriods недель барах по Н1

int bars=PeriodSeconds(PERIOD_W1)/PeriodSeconds(PERIOD_H1)*CountPeriods;  //  CountPeriods=4; В глобальных переменных

//РЕШИЛ ТАК НО ПО-МОЕМУ ЧУШЬ...

int lm=iBarShift(NULL,PERIOD_H1,iTime(NULL,PERIOD_CURRENT,limit));      //rates_total-1 в днях
int start=lm-(lm-bars);

Comment(start,"    bars    ",bars);  //Равенство значений есть

JE REGARDAIS JUSTEMENT LA NOUVELLE HEURE. TOUT SEMBLE FONCTIONNER CORRECTEMENT.

Alors une question : mon code était-il correct en ce qui concerne les taux_total ?

 

Lisez attentivement l'aide de la fonction Bars :

"

Si les paramètres start_time et stop_time sont spécifiés, la fonction renvoie le nombre de barres dans la plage de dates. Si ces paramètres ne sont pas spécifiés, la fonction renvoie le nombre total de barres.

"

L'aide ne précise pas si les dates de début ou de fin doivent être incluses ou non, ce qui fait que vous ne savez pas ce que vous pouvez attendre de la fonction.

Ce qui est surprenant, c'est le fonctionnement de cette fonction :

   datetime         StartDt=StringToTime("2018.01.04 10:00");
   datetime         StopDt=StringToTime("2018.01.03 23:49");
//datetime         StopDt=StringToTime("2018.01.04 10:00");
//datetime         StopDt=StringToTime("2018.01.04 10:01");
   int              BarsGo=Bars(Symbol(),PERIOD_CURRENT,StartDt,StopDt);
   Print("BarsGo=",BarsGo);

Avec n'importe laquelle des options, y compris celles qui sont commentées, StopDt obtient une valeur de 2 !

L'option est particulièrement surprenante lorsque la date de début (2018.01.04 10:00) est postérieure à la date de fin (2018.01.03 23:49) dans la deuxième expression - pourquoi aucune erreur ou au moins 1 est donnée ?

Si la date de début et la date de fin sont identiques, il est logique de donner un 1 et non un 2 à nouveau !

Je vérifie Si instrument sur FORTS, graphique en une minute.

 

S'il vous plaît aidez, un morceau d'indicateur

//+------------------------------------------------------------------+
//|  OnCalculate function                                            |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {

   ArraySetAsSeries(time,true);

   datetime Fp=0,Ep=0,pFp=0,pEp=0,Arr[];
   int Count=0,bars=0,dt=0;

   int limit;
   if(prev_calculated==0 || prev_calculated<0 || prev_calculated>rates_total)
      limit=Nbar;
   else
      limit=rates_total-prev_calculated;

   for(int i=limit;i>=0;i--)
     {

      if(CopyTime(NULL,TimeFrame,time[i],1,Arr)>0)Ep=Arr[0]-1*PeriodSeconds(PERIOD_CURRENT);
      else return(0);

Parfois, le tableau time[i] déborde, par exemple la nuit lorsque le marché est fermé.

2019.01.25 00:06:35.191 i-Regr4_05i (Si Splice,H1)      array out of range in 'i-Regr4_05i.mq5' (134,38)

Comment résoudre ce problème ?

 

Un indice après une déclaration comme celle-ci.

double Price[]; 

La taille du tableau est-elle toujours égale à 0 ?

 
pivomoe:

Un indice après une déclaration comme celle-ci.

La taille du tableau est-elle toujours égale à 0 ?

Oui.

 
Artyom Trishkin, en tant que modérateur professionnel et responsable, j'aimerais beaucoup vous entendre, surtout en ce qui concerne le manuel, la justification du comportement de la fonction Bars, plutôt que des suppositions !
 
Aleksey Vyazmikin:

S'il vous plaît aidez, un morceau d'indicateur

Parfois, le tableau time[i] déborde, par exemple la nuit lorsque le marché est fermé.

Comment résoudre ce problème ?

Par exemple pour calculer correctement le paramètreNbar:

   if(prev_calculated==0 || prev_calculated<0 || prev_calculated>rates_total)
      limit=Nbar;
 
Aleksey Vyazmikin:

Lisez attentivement l'aide de la fonction Bars :

"

Si les paramètres start_time et stop_time sont spécifiés, la fonction renvoie le nombre de barres dans la plage de dates. Si ces paramètres ne sont pas spécifiés, la fonction renvoie le nombre total de barres.

"

L'aide ne précise pas si les dates de début ou de fin doivent être incluses ou non, ce qui fait que vous ne savez pas ce que vous pouvez attendre de la fonction.

Ce qui est surprenant, c'est le fonctionnement de cette fonction :

Avec n'importe laquelle des options, y compris celles qui sont commentées, StopDt obtient une valeur de 2 !

L'option est particulièrement surprenante lorsque la date de début (2018.01.04 10:00) est postérieure à la date de fin (2018.01.03 23:49) dans la deuxième expression - pourquoi aucune erreur ou au moins 1 est donnée ?

Si la date de début et la date de fin sont identiques, il est logique de donner un 1 et non un 2 à nouveau !

Je vérifie Si instrument sur FORTS, c'est un graphique en minutes.

Avant de discuter des incohérences, nous devons montrer qu'il y a plus de barres sur le graphique que celles renvoyées par la fonction.

Je travaille souvent avec cette fonction et je ne rencontre aucun problème. Je suis très surpris de la raison pour laquelle iBarShift et d'autres fonctions similaires ont été incluses dans mql5.

Le fait que la fonction permute les heures "de" et "à" si le programmeur se trompe soudainement est inclus dans la notion de "infaillible".

Et un conseil : pour que la fonction fonctionne plus rapidement, mettez-y une heure de début de barre. Quelques lignes supplémentaires assureront la rapidité. C'est particulièrement important pour un testeur.

 
Vladimir Karputov:

Par exemple, calculer correctement le paramètreNbar:

J'ai déjà fait une vérification pour moi-même, mais cette vérification sert à contourner l'erreur de cette fonction, l'aide ne parle pas du tout de la nécessité d'une vérification, ce qui signifie qu'elle devrait être intégrée.

Et puis, vous parlez de la vérification de l'indicateur, alors que j'utilise Bars pour calculer l'heure correcte de début de barre, comme iBarShift est dans mon esprit et seulement approprié pour le forex, où il n'y a pas de défaillances fréquentes avec l'historique en raison de la compensation et des sessions de négociation pas pour toute la journée.

 
Alexey Viktorov:

Avant de parler d'incohérences, vous devez montrer qu'il y a plus de barres sur le graphique que ce que la fonction renvoie.

Je travaille souvent avec cette fonction et je ne rencontre aucun problème. J'ai été très surpris de voir pourquoi ils ont mis iBarShift et des fonctions similaires dans mql5.

Le fait que la fonction change les heures "de" et "à" à certains endroits si le programmeur les confond soudainement fait également partie de la notion de "Foolproof".

Je voudrais également vous conseiller : pour que la fonction fonctionne plus rapidement, mettez l'heure de début des barres. Quelques lignes supplémentaires permettront de gagner en rapidité. C'est particulièrement important pour un testeur.

Ce n'est pas une protection mais un obstacle à la détection d'une erreur de code !

En outre, il n'est pas du tout logique de renvoyer le numéro 2 si les dates coïncident - quelle est la logique ici ?

L'heure de début d'une barre sur FORTS peut ne pas coïncider, ce qui entraîne des erreurs de calcul, par exemple, une barre n'ouvre pas à 14h00, mais à 14h05 - j'en ai souffert aussi.