êtes-vous sûr que cela fonctionne ? ? ???
Une simple compilation soulève déjà la question suivante

et deuxièmement, qu'est-ce que cette fonction va renvoyer !
CopyClose(symbol,timeframe,start,count,Close); return(ArrayMaximum(Close,start,count));
copie les cours de clôture dans le tableau Klose, copie à partir de la position "start" et le nombre de "kounts" correctement.
et renvoie l'index de l'élément maximum du tableau Klose en partant de la position "start" et en ne regardant que les éléments "count"......
quelle est votre hérésie, désolé pour la franchise.....
Êtes-vous sûr que cela fonctionne ? ? ???
Oui, cela fonctionne.
//+------------------------------------------------------------------+
//|test.mq5 |
//|Copyright DC2008 |
//| http ://www.mql5.com
//+------------------------------------------------------------------+
#property copyright "DC2008"
//--- Tableaux de séries temporelles
double Close[];
double Open[];
double High[];
double Low[];
long Volume[];
datetime Time[];
//+------------------------------------------------------------------+
//| Fonction d'initialisation de l'expert|
//+------------------------------------------------------------------+
int OnInit()
{
//---
ArraySetAsSeries(Close,true);
ArraySetAsSeries(Open,true);
ArraySetAsSeries(High,true);
ArraySetAsSeries(Low,true);
ArraySetAsSeries(Volume,true);
ArraySetAsSeries(Time,true);
ArraySetAsSeries(Low,true);
//---
return(0);
}
//+------------------------------------------------------------------+
//| Fonction de désinitialisation de l'expert|
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
//---
}
//+------------------------------------------------------------------+
//| Fonction de tic-tac expert|
//+------------------------------------------------------------------+
void OnTick()
{
//---
Comment(
"\niHighest",iHighest("EURUSD",PERIOD_M2,0,10,0),
" iLowest ",iLowest("EURUSD",PERIOD_M2,0,10,0)," Open",
"\niHighest",iHighest("EURUSD",PERIOD_M2,1,10,0),
" iLowest ",iLowest("EURUSD",PERIOD_M2,1,10,0)," Low",
"\niHighest",iHighest("EURUSD",PERIOD_M2,2,10,0),
" iLowest ",iLowest("EURUSD",PERIOD_M2,2,10,0)," High",
"\niHighest",iHighest("EURUSD",PERIOD_M2,3,10,0),
" iLowest ",iLowest("EURUSD",PERIOD_M2,3,10,0)," Close",
"\niHighest",iHighest("EURUSD",PERIOD_M2,4,10,0),
" iLowest ",iLowest("EURUSD",PERIOD_M2,4,10,0)," Volume",
"\niHighest",iHighest("EURUSD",PERIOD_M2,5,10,0),
" iLowest ",iLowest("EURUSD",PERIOD_M2,5,10,0)," Time",
"\n",""
);
}
//+------------------------------------------------------------------+
//||
//+------------------------------------------------------------------+
int iLowest(string symbol,
int tf,
int type,
int count=WHOLE_ARRAY,
int start=0)
{
ENUM_TIMEFRAMES timeframe=TFMigrate(tf);
if(type<=0)
{
CopyOpen(symbol,timeframe,start,count,Open);
return(ArrayMinimum(Open,start,count));
}
if(type==1)
{
CopyLow(symbol,timeframe,start,count,Low);
return(ArrayMinimum(Low,start,count));
}
if(type==2)
{
CopyHigh(symbol,timeframe,start,count,High);
return(ArrayMinimum(High,start,count));
}
if(type==3)
{
CopyClose(symbol,timeframe,start,count,Close);
return(ArrayMinimum(Close,start,count));
}
if(type==4)
{
CopyTickVolume(symbol,timeframe,start,count,Volume);
return(ArrayMinimum(Volume,start,count));
}
if(type>=5)
{
CopyTime(symbol,timeframe,start,count,Time);
return(ArrayMinimum(Time,start,count));
}
//---
return(0);
}
//+------------------------------------------------------------------+
//||
//+------------------------------------------------------------------+
int iHighest(string symbol,
int tf,
int type,
int count=WHOLE_ARRAY,
int start=0)
{
ENUM_TIMEFRAMES timeframe=TFMigrate(tf);
if(type<=0)
{
CopyOpen(symbol,timeframe,start,count,Open);
return(ArrayMaximum(Open,start,count));
}
if(type==1)
{
CopyLow(symbol,timeframe,start,count,Low);
return(ArrayMaximum(Low,start,count));
}
if(type==2)
{
CopyHigh(symbol,timeframe,start,count,High);
return(ArrayMaximum(High,start,count));
}
if(type==3)
{
CopyClose(symbol,timeframe,start,count,Close);
return(ArrayMaximum(Close,start,count));
}
if(type==4)
{
CopyTickVolume(symbol,timeframe,start,count,Volume);
return(ArrayMaximum(Volume,start,count));
}
if(type>=5)
{
CopyTime(symbol,timeframe,start,count,Time);
return(ArrayMaximum(Time,start,count));
}
//---
return(0);
}
//+------------------------------------------------------------------+
ENUM_TIMEFRAMES TFMigrate(int tf)
{
switch(tf)
{
case 0: return(PERIOD_CURRENT);
case 1: return(PERIOD_M1);
case 5: return(PERIOD_M5);
case 15: return(PERIOD_M15);
case 30: return(PERIOD_M30);
case 60: return(PERIOD_H1);
case 240: return(PERIOD_H4);
case 1440: return(PERIOD_D1);
case 10080: return(PERIOD_W1);
case 43200: return(PERIOD_MN1);
default: return(PERIOD_CURRENT);
}
}
Dans les cellules des tableaux où il est indiqué "Pas d'analogue", vous devriez donner une brève description de la façon dont ces choses sont résolues dans mql5 avec des références à une section spécifique de la documentation (quelque chose comme, par exemple, ceci: "n'a pas de sens, parce que dans mql5 ceci et cela").
Il faut comprendre que la mise en œuvre est trop compliquée et n'est pas justifiée. Après tout, l'objectif est d'abandonner complètement les fonctions MQL4.
Mais j'essaierai d'en tenir compte si je peux fournir des liens vers les fonctions MQL5 qui peuvent être utilisées pour faire quelque chose de similaire.
Nous reprenons celui du TF m2. D'accord, je comprends, mais il ne fait que nous jeter de la poudre aux yeux.
mais c'est un peu comme si on nous jetait de la poussière dans les yeux. Le TF migrate nous donne
default: return(PERIOD_CURRENT);
à partir de 0 bar. C'est bizarre.
Mais si nous essayons à partir de 20, par exemple.

Vous essayez encore de nous embrouiller.
et de telles absurdités dans chaque fonction.
Et pourquoi faire migrer TF ? ??
si mql5 a tous les TF que mql4 a encore plus......
hérésie complète =))))
Comment vos modérateurs ont-ils pu manquer une telle chose ?
Cher Eugène, j'espère que ce n'est pas vous qui avez vérifié cet article.
hérésie totale =))))
Comment vos modérateurs ont-ils pu manquer cela ?
Cher Eugène, j'espère que vous n'avez pas consulté cet article.
Cher Vasily !
Merci pour vos commentaires, les fonctions de la section 18 ont été mises à jour. Veuillez consulter la version actuelle.
L'auteur a fait beaucoup de travail, il peut y avoir des erreurs, nous les corrigerons ensemble.
La fonction TFMigrate(int tf) est nécessaire pour substituer les valeurs correctes des délais de MQL5. Par exemple, dans MQL4 la valeur numérique de la constante PERIOD_H1 est 60, et dans MQL5 la valeur numérique de PERIOD_H1=16385, c'est-à-dire TFMigrate(60)=16385.
Je pense qu'il y a beaucoup plus d'erreurs.
parce qu'elles se produisent même dans des moments aussi simples, je dirais même les plus simples.
Dans certaines sections, les fonctions sont comparées entre elles.
Dans d'autres, on écrit une analogie.
il n'y a pas un seul exemple réussi de mise en œuvre de l'article,
pour autant que je comprenne, cet article est une tentative de transfert de quelque chose de µl4.....
Votre attitude à l'égard de la vérification est toujours admirable.
Je pense que c'est le désir effréné de l'auteur de vous jeter de la poussière dans les yeux.
Ce qu'il a certainement réussi à faire.
car je connais votre sensibilité à l'égard du matériel vérifié.
Et si vous essayez avec 20, par exemple.
Vous essayez encore de m'embrouiller.
et de telles absurdités dans chaque fonction.
Et pourquoi faire migrer les TF ????
si mql5 a tous les TF que mql4 a encore plus......
hérésie complète =)))))
Merci d'avoir trouvé l'erreur. J'avais oublié que la recherche pouvait être lancée à partir d'un autre endroit que la barre du zéro. Voici les fonctions corrigées :
//+------------------------------------------------------------------+ //|test.mq5 | //|Copyright DC2008 | //| http ://www.mql5.com //+------------------------------------------------------------------+ #property copyright "DC2008" //--- Tableaux de séries temporelles double Close[]; double Open[]; double High[]; double Low[]; long Volume[]; datetime Time[]; //+------------------------------------------------------------------+ //| Fonction d'initialisation de l'expert| //+------------------------------------------------------------------+ int OnInit() { //--- ArraySetAsSeries(Close,true); ArraySetAsSeries(Open,true); ArraySetAsSeries(High,true); ArraySetAsSeries(Low,true); ArraySetAsSeries(Volume,true); ArraySetAsSeries(Time,true); ArraySetAsSeries(Low,true); //--- return(0); } //+------------------------------------------------------------------+ //| Fonction de désinitialisation de l'expert| //+------------------------------------------------------------------+ void OnDeinit(const int reason) { //--- } //+------------------------------------------------------------------+ //| Fonction de tic-tac expert| //+------------------------------------------------------------------+ void OnTick() { //--- Comment(Open[0],Close[0],Open[1],Close[1], "\niHighest",iHighest("EURUSD",PERIOD_M2,0,10,20), " iLowest ",iLowest("EURUSD",PERIOD_M2,0,10,20)," Open", "\niHighest",iHighest("EURUSD",PERIOD_M2,1,10,20), " iLowest ",iLowest("EURUSD",PERIOD_M2,1,10,20)," Low", "\niHighest",iHighest("EURUSD",PERIOD_M2,2,10,20), " iLowest ",iLowest("EURUSD",PERIOD_M2,2,10,20)," High", "\niHighest",iHighest("EURUSD",PERIOD_M2,3,10,20), " iLowest ",iLowest("EURUSD",PERIOD_M2,3,10,20)," Close", "\niHighest",iHighest("EURUSD",PERIOD_M2,4,10,20), " iLowest ",iLowest("EURUSD",PERIOD_M2,4,10,20)," Volume", "\niHighest",iHighest("EURUSD",PERIOD_M2,5,10,20), " iLowest ",iLowest("EURUSD",PERIOD_M2,5,10,20)," Time", "\n","" ); } //+------------------------------------------------------------------+ //|| //+------------------------------------------------------------------+ int iLowest(string symbol, int tf, int type, int count=WHOLE_ARRAY, int start=0) { ENUM_TIMEFRAMES timeframe=TFMigrate(tf); if(type<=0) { CopyOpen(symbol,timeframe,start,count,Open); return(ArrayMinimum(Open,0,count)); } if(type==1) { CopyLow(symbol,timeframe,start,count,Low); return(ArrayMinimum(Low,0,count)); } if(type==2) { CopyHigh(symbol,timeframe,start,count,High); return(ArrayMinimum(High,0,count)); } if(type==3) { CopyClose(symbol,timeframe,start,count,Close); return(ArrayMinimum(Close,0,count)); } if(type==4) { CopyTickVolume(symbol,timeframe,start,count,Volume); return(ArrayMinimum(Volume,0,count)); } if(type>=5) { CopyTime(symbol,timeframe,start,count,Time); return(ArrayMinimum(Time,0,count)); } //--- return(0); } //+------------------------------------------------------------------+ //|| //+------------------------------------------------------------------+ int iHighest(string symbol, int tf, int type, int count=WHOLE_ARRAY, int start=0) { ENUM_TIMEFRAMES timeframe=TFMigrate(tf); if(type<=0) { CopyOpen(symbol,timeframe,start,count,Open); return(ArrayMaximum(Open,0,count)); } if(type==1) { CopyLow(symbol,timeframe,start,count,Low); return(ArrayMaximum(Low,0,count)); } if(type==2) { CopyHigh(symbol,timeframe,start,count,High); return(ArrayMaximum(High,0,count)); } if(type==3) { CopyClose(symbol,timeframe,start,count,Close); return(ArrayMaximum(Close,0,count)); } if(type==4) { CopyTickVolume(symbol,timeframe,start,count,Volume); return(ArrayMaximum(Volume,0,count)); } if(type>=5) { CopyTime(symbol,timeframe,start,count,Time); return(ArrayMaximum(Time,0,count)); } //--- return(0); } //+------------------------------------------------------------------+ ENUM_TIMEFRAMES TFMigrate(int tf) { switch(tf) { case 0: return(PERIOD_CURRENT); case 1: return(PERIOD_M1); case 5: return(PERIOD_M5); case 15: return(PERIOD_M15); case 30: return(PERIOD_M30); case 60: return(PERIOD_H1); case 240: return(PERIOD_H4); case 1440: return(PERIOD_D1); case 10080: return(PERIOD_W1); case 43200: return(PERIOD_MN1); default: return(PERIOD_CURRENT); } }
Je pense qu'il y a beaucoup plus d'erreurs.
parce qu'elles se produisent même dans des moments aussi simples, je dirais même les plus simples.
Dans certaines sections, les fonctions sont comparées entre elles.
Dans d'autres, on écrit une analogie.
il n'y a pas un seul exemple réussi de mise en œuvre de l'article,
pour autant que je comprenne, cet article est une tentative de transfert de quelque chose de µl4.....
Votre attitude à l'égard de la vérification est toujours admirable.
Je pense que c'est le désir effréné de l'auteur de vous jeter de la poussière dans les yeux.
Ce qu'il a certainement réussi à faire.
Je sais que vous êtes sensible au matériel vérifié.
Il peut y avoir des erreurs, la matière est assez vaste.
Le sujet du portage (plus précisément, le sujet de l'écriture d'une classe d'émulateur avec des méthodes MQL4) a été abordé dans un autre article (nous espérons qu'il sera terminé). Dans le processus de lecture du matériel, nous avons demandé à l'auteur d'écrire un article sous la forme d'un livre de référence pour couvrir toutes les fonctions de MQL4 (à l'exception du trading - vous verrez bientôt l'une des solutions pour eux), de fournir un analogue pour chacun d'eux dans MQL5, en général, de mettre tout cela ensemble afin que ceux qui réécrivent des programmes MQL4 puissent rapidement trouver un analogue. En ce qui concerne le désir effréné, si nous parlons du nombre de sections considérées, nous avons insisté pour couvrir toutes les fonctions (qui se sont avérées être plus de 250).
Quant à la comparaison des fonctions dans certaines sections, il ne s'agissait pas exactement d'une comparaison. Il était nécessaire de donner un analogue, même si c'est la même chose. Pour toutes les fonctions. Il semble donc qu'il y ait une comparaison, mais la comparaison permet de dire que, par exemple, les fonctions mathématiques sont les mêmes. D'ailleurs, à titre de recommandation, il serait sans doute utile de le mentionner au début de chaque section, ce qui est un point à surveiller.
Pour cette raison (architecture des fonctions de l'émulateur), l'auteur a mis en œuvre des éléments non évidents (par exemple, pour iLowest/iHighest global Open[]...High[]..., qui étaient auparavant déclarés globalement et transformés en AsSeries dans OnInit), qui étaient implicites comme dans l'émulateur, naturellement, pour l'universalité des fonctions, il est préférable d'utiliser des tableaux locaux.
En ce qui concerne le travail avec les indicateurs techniques, il peut y avoir de nombreuses questions, le travail avec eux ne devrait pas être comme dans MQL4 - il est préférable de les créer manuellement dans OnInit et de se référer aux descripteurs, au lieu de les créer à chaque fois dans les fonctions locales. Mais l'approche proposée par l'auteur fonctionne également, car le terminal ne détruit pas immédiatement les indicateurs. Il y a donc beaucoup de subtilités.
L'important est qu'il y ait maintenant matière à discussion, si vous trouvez des erreurs (y compris celles causées par la structure proposée des fonctions) - proposez vos variantes.
- Applications de trading gratuites
- Plus de 8 000 signaux à copier
- Actualités économiques pour explorer les marchés financiers
Vous acceptez la politique du site Web et les conditions d'utilisation
Un nouvel article Migration de MQL4 vers MQL5 a été publié :
Cet article est un guide rapide des fonctions du langage MQL4, il vous aidera à migrer vos programmes de MQL4 vers MQL5. Pour chaque fonction MQL4 (hors fonctions de trading) la description et l'implémentation MQL5 sont présentées, cela vous permet de réduire considérablement le temps de conversion. Pour plus de commodité, les fonctions MQL4 sont réparties en groupes, similaires à MQL4 Reference.
Dans le graphique MQL5, les constantes de période ont changé et de nouvelles périodes de temps (M2, M3, M4, M6, M10, M12, H2, H3, H6, H8, H12) ont été ajoutées. Pour convertir des cadences de temps MQL4, vous pouvez utiliser la fonction suivante :
Auteur : Sergey Pavlov