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

 
-Aleks-:

Aidez-moi ! (MQL4)

J'ai besoin d'obtenir l'heure d'ouverture de la journée sur le graphique M15 en tenant compte de chaque barre - pour l'indicateur.

J'ai décidé de calculer en secondes, en tenant compte de la barre actuelle (0), mais je dois me tromper.

D_Shift=(Open_time-pos*15*60-(Open_time-Open_timeTF))/1440*60;

Si pour l'indicateur, alors :

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[])
  {
   int            temp_day;
   MqlDateTime    dt_struct;
   TimeToStruct(time[0],dt_struct);
   temp_day=dt_struct.day;

   for(int i=0;i<rates_total-1;i++)
     {
      TimeToStruct(time[i],dt_struct);
      if(dt_struct.day<temp_day)
        {
         Print("Start day ",time[i-1]);
         break;
        }
     }

//--- done
   return(rates_total);
  }

Mais : ce code sera exécuté à chaque fois que OnCalculate() est entré - selon vos besoins, vous pouvez ajouter un drapeau bool ou placer le code dans une fonction séparée.

 
Karputov Vladimir:

Si pour l'indicateur, alors :

Mais : ce code sera exécuté à chaque fois que OnCalculate() - selon vos besoins, ou ajouter un drapeau bool ou placer le code dans une fonction séparée.

Merci, mais à chaque tic-tac faire un nouveau calcul n'est pas bon - je dois analyser votre code, cependant, alors que je veux comprendre pourquoi mon code ne fonctionne pas, dans le journal sont retournés des chiffres étranges

Open_timeTF 1454715900
Heure d'ouverture 1454284800
Delta_1S 431100
Delta_M15 479

il s'avère qu'il y a une différence de 479 barres entre la première barre du jour et la barre actuelle - pourquoi ?

 
-Aleks-:

Merci, mais recalculer à chaque tick n'est pas bon - je dois réfléchir à votre code, cependant, alors que je cherche à comprendre pourquoi mon code ne fonctionne pas, le log renvoie des chiffres étranges

Open_timeTF 1454715900
Heure d'ouverture 1454284800
Delta_1S 431100
Delta_M15 479

il s'avère qu'il y a une différence de 479 barres entre la première barre du jour et la barre actuelle - pourquoi ?

J'ai indiqué que je ne suis pas médium et que c'est pour ça :

Mais : ce code sera exécuté chaque fois que OnCalculate() est entré- ici, selon vos besoins, vous pouvez ajouter un drapeauboolou mettre le code dans une fonction séparée.

 
Karputov Vladimir:

J'ai précisé que je ne suis pas médium et c'est pour ça :

Pourquoi la capacité psychique est-elle requise ici ? Il y a des variables dans le code ci-dessus, j'ai montré ce que ces variables retournent en chiffres et j'ai demandé pourquoi c'est le cas et pas l'inverse - selon le code.
 
Karputov Vladimir, je ne comprends pas votre code - parce que je suis un débutant dans ce domaine, je n'ai jamaisutilisé la fonctionOnCalculate avant, donc je ne peux pas comprendre ce querates_totalest calculé ici, et surtout, où le retourner ? Je ne comprends pas non plus comment faire pour que tout cela soit une fonction séparée... c'est difficile à comprendre sans commentaires.
 
-Aleks-:
Karputov Vladimir, je ne comprends pas votre code - je suis un débutant dans ce domaine et je n'ai jamaisutilisé la fonctionOnCalculate auparavant, donc je n'arrive pas à comprendre ce que letaux_totalest calculé ici et, plus important encore, où il doit être renvoyé ? Je ne comprends pas non plus comment faire pour que tout cela soit une fonction séparée... c'est difficile à comprendre sans commentaires.

Voici le code complet de l'indicateur MQL4 :

//+------------------------------------------------------------------+
//|                                                    Start day.mq4 |
//|                        Copyright 2016, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
#property indicator_chart_window
//--- input parameters
input int      timer=10; // seconds
//--- parameter
bool           IsDefineTime=true; // true -> you can define time
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   EventSetTimer(timer);
//---
   IsDefineTime=true;
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration 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[])
  {
//---
   int            temp_day;
   MqlDateTime    dt_struct;
   TimeToStruct(time[0],dt_struct);
   temp_day=dt_struct.day;

   if(IsDefineTime)
     {
      for(int i=0;i<rates_total-1;i++)
        {
         TimeToStruct(time[i],dt_struct);
         if(dt_struct.day<temp_day)
           {
            Print("Start day ",time[i-1]);
            IsDefineTime=false;
            break;
           }
        }
     }
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+
//| Timer function                                                   |
//+------------------------------------------------------------------+
void OnTimer()
  {
//---
   IsDefineTime=true; // true -> you can define time
  }
//+------------------------------------------------------------------+

Algorithme de son fonctionnement : Lorsque vous démarrez l'indicateur, vous définissez l'intervalle de temps de la minuterie (par exemple, 10 secondes) - cela signifie que toutes les 10 secondes, la minuterie sera déclenchée :

//+------------------------------------------------------------------+
//| Timer function                                                   |
//+------------------------------------------------------------------+
void OnTimer()
  {
//---
   IsDefineTime=true; // true -> you can define time
  }

et la variableIsDefineTime reçoit la valeur true. A quoi ça sert ? Lorsque IsDefineTime=true, nous pouvons, dans OnCalculate(), entrer dans une boucle pour déterminer l'heure de début de la journée :

   if(IsDefineTime)
     {
      for(int i=0;i<rates_total-1;i++)
        {
         TimeToStruct(time[i],dt_struct);
         if(dt_struct.day<temp_day)
           {
            Print("Start day ",time[i-1]);
            IsDefineTime=false;
            break;
           }
        }
     }

Dans cette boucle, nous commençons à parcourir le tableau time[] (ce tableau stocke les valeurs du temps d'ouverture) à partir de la barre la plus à droite (son index est "0"). Lorsque le début de la journée est trouvé, nous annulons sa valeur et attribuons à la variableIsDefineTime la valeurfalse - de cette façon, nous nous protégeons pour ne plus entrer dans le cycle de détermination de l'heure de début de la journée, jusqu'à ce que la minuterie s'exécute à nouveau.

Dossiers :
Start_day.mq4  3 kb
 

Karputov Vladimir , merci pour cette précision, cependant, comment cela résout-il le problème ?

En gros, nous devons connaître la barre de l'unité de temps actuelle qui correspond à la barre du début de la journée. Nous devons savoir sur chaque barre et calculer et dessiner l'indicateur en conséquence.

 
-Aleks-:

Karputov Vladimir , merci pour cette précision, cependant, comment cela résout-il le problème ?

En gros, nous devons connaître la barre de l'unité de temps actuelle qui correspond à la barre du début de la journée. Vous devez le connaître sur chaque barre et calculer et dessiner l'indicateur en conséquence.

C'est ainsi que vous avez demandé et c'est ainsi qu'on vous a répondu :) . Et si vous voulez non pas l'heure de la première barre de ce jour, mais l'index de cette barre - c'est ici, lorsque vous imprimez le début de la journée :

.
.
.
Print("Start day ",time[i-1]);
.
.
.

Vous utilisez l'indice [i-1] - c'est le numéro de la première barre du jour.

 
Karputov Vladimir:

Comme vous l'avez demandé, vous avez obtenu votre réponse :) . Et si vous n'avez pas besoin de l'heure de la première barre de la journée, mais de l'index de cette barre, c'est ici, lorsque vous imprimez le début de la journée :

Vous utilisez l'indice [i-1] - c'est le numéro de la première barre du jour.

Je suis d'accord - j'ai demandé de manière confuse.

Il y a un indicateur dans l'application que j'ai créée, mais il ne compte pas correctement. Je suis terriblement bête et ne comprends pas, même après vos explications, comment lui faire déterminer correctement l'indice correspondant à la première barre du début de journée.

Je m'excuse pour l'insolence, mais peut-être pouvez-vous me montrer comment combiner votre code et le mien ?

 

-Aleks-:

Comment faire pour qu'il détecte correctement l'indice correspondant à la première barre du début de journée ?

C'est un peu le bazar :

datetime Day00=86400*(TimeCurrent()/86400);//начало дня
int bar_shift=iBarShift(_Symbol,PERIOD_CURRENT,Day00);//индекс первого бара текущего дня
Raison: