Discussion de l'article "Migration de MQL4 vers MQL5" - page 4

 
Interesting :

J'ai commencé à douter de la fonctionnalité de cette conception. J'ai eu beau essayer de comprendre la logique du bloc, je n'y suis pas parvenu (et j'ai bien essayé)....

Qu'est-ce que le doute ? Il compte correctement.

//+------------------------------------------------------------------+
//|test.mq5 |
//+------------------------------------------------------------------+
#include <InitMQL4.mqh>
double   close[];
int      total,count;
datetime time[];
//+------------------------------------------------------------------+
//||
//+------------------------------------------------------------------+
void OnStart()
  {
   count=Bars(_Symbol,_Period);
   total=CopyClose(_Symbol,_Period,0,count,close);
   total=CopyTime(_Symbol,_Period,0,count,time);
   ArraySetAsSeries(time,true);
   ArraySetAsSeries(close,true);
   int N=7;
   int shift=iBarShiftMQL4(_Symbol,_Period,time[N]);
   Print("TIME",time[N],"BAR=",shift," CLOSE=",close[shift]);
  }
//+------------------------------------------------------------------+
int iBarShiftMQL4(string symbol,
                  int tf,
                  datetime time,
                  bool exact=false)
  {
   if(time<0) return(-1);
   ENUM_TIMEFRAMES timeframe=TFMigrate(tf);
   datetime Arr[],time1;
   CopyTime(symbol,timeframe,0,1,Arr);
   time1=Arr[0];
   if(CopyTime(symbol,timeframe,time,time1,Arr)>0)
      return(ArraySize(Arr)-1);
   else return(-1);
  }
//+------------------------------------------------------------------+
[Supprimé]  
DC2008 :

Quel est le problème ? Il compte correctement.

Et maintenant, le tour de passe-passe


1. Dans MT4, nous écrivons cette ligne et exécutons le code sur H4

Print(iBarShift(Symbol(),Period(),1274356800,false)); //date 20.05.2010 12:00 pm

Ensuite, nous faisons la même chose avec MT5 et la chaîne.

int shift=iBarShiftMQL4(_Symbol,_Period,StringToTime("20.05.2010 12:00"),false);

Le résultat est 8.


2. Ensuite, nous faisons exactement la même opération, mais avec D1.

Le résultat est le suivant : MT4 renvoie - 1 et MT5 renvoie 0.

Maintenant, qui peut me dire dans quelle mesure cette implémentation de iBarShiftMQL4 correspond à ce qui est nécessaire...

int iBarShiftMQL4(string symbol,
                  int tf,
                  datetime time,
                  bool exact=false)
  {
   if(time<0) return(-1);
   ENUM_TIMEFRAMES timeframe=TFMigrate(tf);
   datetime Arr[],time1;
   CopyTime(symbol,timeframe,0,1,Arr);
   time1=Arr[0];
   if(CopyTime(symbol,timeframe,time,time1,Arr)>0)
      return(ArraySize(Arr)-1);
   else return(-1);
  }
 

Essayez celui-ci :

int iBarShiftMQL4(string symbol,
                  int tf,
                  datetime time,
                  bool exact=false)
  {
   if(time<0) return(-1);
   ENUM_TIMEFRAMES timeframe=TFMigrate(tf);
   datetime Arr[],time1;
   CopyTime(symbol,timeframe,0,1,Arr);
   time1=Arr[0];
   if(CopyTime(symbol,timeframe,time,time1,Arr)>0)
     {
      if(ArraySize(Arr)>2) return(ArraySize(Arr)-1);
      if(time<time1) return(1);
      else return(0);
     }
   else return(-1);
  }
 

Encore une fois, avez-vous lu la fonction sur laquelle vous écrivez ????

Sur mcl4, elle est écrite exactement comme suit

double iClose( string symbol, int timeframe, int shift)
Renvoie la valeur du prix de clôture de la barre du graphique correspondant(symbole, période) spécifié par le paramètre shift. En cas d'erreur, la fonction renvoie 0. Pour obtenir plus d'informations sur l'erreur, appelez la fonction GetLastError().
Pour le graphique actuel, les informations sur les prix de clôture se trouvent dans le tableau prédéfini Close[].

et vous avez....

return(-1);

que regardent les modérateurs...

 

Merci, CoreWinTT.

Fonctions corrigées : iClose, iLow, iHigh, iOpen, iTime, iVolume. Elles renvoient 0 au lieu de -1 en cas d'erreur.

 

et quand seront-ils dans la bibliothèque ? ???

pour qu'ils soient au moins

Parce que si vous l'ouvrez, la question se pose, et la signification de ce qui est écrit ci-dessus ????.

et aussi au moins collecter les fonctions pour lesquelles toutes les questions sont résolues et procéder à l'étude des erreurs dans le reste.

 
bool  SetIndexBuffer(
   int                    index,         // index de la mémoire tampon
   double                 buffer[],      // tableau
   ENUM_INDEXBUFFER_TYPE  data_type      // ce que nous allons stocker
   );

l'autre jour, quelqu'un a suggéré un moyen astucieux de créer un environnement μl4

en utilisant des tableaux de

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[])

mais il sera difficile de les utiliser car ils ont un état constant.

Vous ne pouvez pas créer de tampons globaux

car ils doivent être déclarés à l'aide de

SetIndexBuffer

Associe le tampon indicateur spécifié à un tableau dynamique unidimensionnel de type double déclaré globalement.

Les tampons globaux ne peuvent être déclarés qu'avec le type double, et les volumes et les tableaux de type date-heure ne passeront pas.

Il ne reste plus qu'à initier ces tableaux à l'intérieur du module mql4.

ce qui revient pratiquement à réécrire l'indicateur....

 
CoreWinTT:

et quand seront-ils dans la bibliothèque ? ???

Ils le sont déjà.
 
c'est vide et c'était vide et seulement un tas de définitions et rien d'autre....
[Supprimé]  
CoreWinTT:

et quand seront-ils dans la bibliothèque ? ???

pour qu'ils soient au moins

Parce que si vous l'ouvrez, la question se pose, et la signification de ce qui est écrit ci-dessus ????.

et aussi au moins collecter les fonctions pour lesquelles toutes les questions sont résolues et procéder à l'étude des erreurs dans le reste.

Il y a beaucoup de solutions sur ce sujet dans les bibliothèques privées depuis longtemps.

Moi, par exemple, j'utilise IsTesting() et des choses similaires depuis le tout début, et tout a été résolu avec la date et l'heure depuis longtemps (bien sûr, il y a d'autres solutions)....

Une autre chose est la présence de telles "solutions dépassées" dans MT5 lui-même...