Présentation et utilisation du langage MQL5

 

MQL5 est le nouveau langage de programmation de la plateforme MetaTrader 5.

Voici l’enregistrement, les slides et l’automate du webinaire intitulé: “Présentation et utilisation du langage MQL5“.

Sommaire: Nicolas Vitale et Alexandre Navet du site Trading Automatique, vous présenterons le langage MQL5 et MetaEditor. Ce webinaire vous permettra de vous familiariser avec ce nouveau langage de programmation.

Intervenants: Nicolas Vitale et Alexandre Navet

Cliquez sur l’image pour accéder a l’enregistrement du webinaire. (il faut être connecté)

webinaire ninjatrader

Téléchargez la présentation (il faut être connecté)

Téléchargez l’automate de démonstration (il faut être connecté)

Intégration de MétaTrader 5

Une des bonnes nouvelles qu’apporte MetaTrader 5 (MT5 pour les intimes) avec son langage un peu plus complexe mais plus évolué est la possibilité de réaliser de vraies applications distribuées.

Faire communiquer les terminaux entre eux, avec une base de données, un serveur, une application externe, etc, ne posera plus de problèmes.

Voici donc pour les développeurs une liste d’articles à ce sujet :

Échange de données entre terminaux via Internet

Connexion à une base de données

Publication des statements et signaux sur les réseaux sociaux , e-mails, blogs et sites

Connexion des EAs avec ICQ

Échanger des données via DLL

Communication entre MT5 et application .NET externe via services WCF

Pour ceux qui considèrent tout ça comme du chinois, vous pouvez retenir que MetaTrader 5 va permettre l’apparition de toutes nouvelles applications qui viendront compléter, améliorer et utiliser la plateforme.

Pour en discuter sur le forum…

Documentation MQL5 auto générée

Article original en VO ici venant du blog Metatrader 5 Blog traduit et adapté par Trading Automatique.

Il y a quelques temps, Paul (phampton) a présenté sur son blog la création d’une documentation MQL5 étendue grâce à l’utilisation d’outils comme Doxygen et HTML Help. Cette documentation inclut la hiérarchie des classes et méthodes pour tout le code contenu dans le répertoire de MQL5 comme les indicateurs et les fichiers d’inclusion .mqh

C’est un bon moyen à destination des développeurs habitués à la programmation objet pour apprendre rapidement le MQL5. Vous pourrez en outre la mettre à jour avec vos propres classes et fonctions. Voici quelques captures de la documentation :

mql5 metatrader 5 extended documentation

mql5 metatrader 5 extended documentation

mql5 metatrader 5 extended documentation

mql5 metatrader 5 extended documentation

 

Paul a déjà compilé la documentation et vous pouvez la trouver ici.

Si vou souhaitez apprendre comment réaliser un telle documentation, je vous recommande la lecture du post de Paul.

Transformer MQL4 en MQL5 automatiquement

Article original en VO ici venant du blog Metatrader 5 Blog traduit et adapté par Trading Automatique.

Remarque suites aux nombreuses questions reçues par mails : ce script a pour possibilité d’aider la conversion. Il n’est donc pas suffisant en lui même pour la majorité des EAs et il faudra mettre la main dans le code pour continuer ou finir le travail.

Un script qui convertit du code  MQL4 en MQL5 a été développé par Keiji et Circlesquares sur le forum MQL4.

Tout d’abord, téléchargez les fichiers suivant et placez les dans votre répertoire Metatrader 4 / experts / include :

mt4accountinfo.mqh
mt4string.mqh
mt4datetime.mqh
mt4objects_1.mqh
mt4timeseries_2.mqh

Rewrite MQL 4 to MQL 5 Script

 

Maintenant, téléchargez la dernière version du script de ré écriture et placez le dans votre répertoire Metatrader 4 / experts / scripts :

mq4to5rewrite_sample_v4_2.mq4

La prochaine étape est de placer votre EA, indicateur ou script codé en MQL4 et que vous voulez convertir en MQL5 dans le dossier Metatrader 4 / experts / files.

Ouvrez alors Metatrader 4 et lancez le script. Comme vous pouvez vous en apercevoir vous devez renseigner le nom (sans l’extention) de votre fichier .mq4 et sélectionner si c’est un indicateur (0), un EA (1) ou un script (2).

Rewrite MQL 4 to MQL 5 Script

Dans mon cas, je souhaite convertir un indicateur MQL4 nommé ang_DCT :

Rewrite MQL 4 to MQL 5 Script

Maintenant, pressez le bouton OK et si tout est converti, le message suivant apparait.

 

Rewrite MQL 4 to MQL 5 Script

Ensuite, allez dans votre répertoire  Metatrader 4 / experts / files et récupérez votre fichier .mq5 :

Rewrite MQL 4 to MQL 5 Script

Ouvrez le fichier avec MetaEditor 5 et compilez-le :

Rewrite MQL 4 to MQL 5 Script

Essayez de corriger les erreurs apparaissant avec la table de conversion MQL4 à MQL5 et la dernière version du guide utilisateur traduite par Google MQL5 user guide, ou bien détendez vous et demandez à un professionnel.

 

Les indicateurs personnels en MQL5 – partie 1


Depuis la sortie Beta de Metatrader 5, nous pouvons commencer à tester petit à petit les nouvelles fonctionnalités. Le but de cet article n’est pas de voir tout ce qui a changé entre MQL4 et MQL5, mais seulement de partir sur un exemple particulier: celui des indicateurs personnels. Nous allons donc laisser de coté la programmation orientée objet qui nécessitera plus qu’un simple article. Cet article se veut plus particulièrement à destination de ceux qui ont une certaine expérience de la programmation MQL4 et souhaitent prendre connaissance des nouveautés et différences de la programmation d’indicateur entre MQL4 et MQL5. Etant donné sa taille, l’article est séparé en plusieurs parties.

Source : Step On New rails : Custom indicators in MQL5

I La structure générale

La structure générale des indicateurs n’a pas changé par rapport à MQL4. Comme auparavant, il y a 3 fonctions : pour l’initialisation, le traitement des données et la fermeture.

De la même manière que précédemment, beaucoup de propriétés des indicateurs peuvent être définies avec le mot clé #property. Les propriétés et les paramètres d’entrée sont comme autrefois définies dans un contexte global.

Prenons comme exemple l’implémentation de l’indicateur coloré RSI. Voici la version tronquée dont la versions entière peut se trouver dans le fichier Color_RSI.mq5 disponible sur l’article original.

Voyons les diverses parties du code :

{xtypo_code}//+——————————————————————+
//|                                                    Color_RSI.mq5 |
//+——————————————————————+

// information properties
#property copyright “TheXpert”
#property link      “theforexpert@gmail.com”
#property version   “1.00”

// Indicator description — the total length should not exceed 511 characters with CR symbols

#property description “Indicator programming demo in MQL5”
#property description “RSI indicator custom painting”{/xtypo_code}

 

Les propriétés spécifiées dans le code sont aussi accessibles via le le panel d’information de l’indicateur (l’onglet “common” de la table de propriétés). Cela ressemble à cela :

 

 

 

Ces propriétés sont celles des indicateurs classiques. Les autres peuvent être trouvées dans l’aide.

{xtypo_code}// the indicator properties
#property indicator_separate_window // indicator will be displayed in the separate subwindow

//#property indicator_minimum 0
//#property indicator_maximum 100

#property indicator_buffers 2 // buffers used
#property indicator_plots 1 // buffers displayed

#property indicator_color1 DarkSalmon, DeepSkyBlue // we use 2 colors
#property indicator_type1 DRAW_COLOR_LINE // and special color style{/xtypo_code}

 

Voici les paramètres d’entrée de l’indicateur (le mot clé input remplace le mot clé extern) et les variables golbales (à ne pas confondre avec les variables globales du terminal client). Les paramètres d’entrée sont donc spécifiés par le mot clé input.

Désormais il est possible de créer des énumérations pour les paramètres d’entrée ce qui est utile pour empêcher l’utilisateur de rentrer des données incorrectes.

Par exemple, le paramètre appelé AppliedPrice sera affiché dans une liste déroulante proposant les différentes valeurs possibles.

 

Par exemple, l’énumération suivante :

{xtypo_code}//…
enum DayOfWeek
{
Monday,
Tuesday,
Wednesday,
Thursday,
Friday,
Saturday,
Sunday
};

input DayOfWeek Day;

//…{/xtypo_code}

 

sera affichée de la manière suivante :

 

{xtypo_code}int OnInit()
{

// set the indicator buffers
// set Values as a buffer for displaying
SetIndexBuffer(0, Values, INDICATOR_DATA);
// set ValuesPainting as buffer for colors
SetIndexBuffer(1, ValuesPainting, INDICATOR_COLOR_INDEX);

// Set beginning of Values buffer drawing
PlotIndexSetInteger(0, PLOT_DRAW_BEGIN, RSIPeriod);
// Set indicator name
IndicatorSetString(INDICATOR_SHORTNAME, “Color RSI(” + string(RSIPeriod) + “)”);
// Set empty value for Values buffer
PlotIndexSetDouble(0, PLOT_EMPTY_VALUE, EMPTY_VALUE);
// Set colors for the buffer
PlotIndexSetInteger(0, PLOT_LINE_COLOR, 0, Down);
PlotIndexSetInteger(0, PLOT_LINE_COLOR, 1, Up);

RSIHandle = iRSI(NULL, 0, RSIPeriod, AppliedPrice);

ArrayResize(BufferForCopy, 3);

// Set the indexation order for buffers (as series)
ArraySetAsSeries(Values, true);
ArraySetAsSeries(ValuesPainting, true);
ArraySetAsSeries(BufferForCopy, true);

return(0);
}{/xtypo_code}


OnInit est la fonction d’initialisation de l’indicateur. Ici on configure les buffers et leurs propriétés ainsi que les variables qui ne peuvent être définies dans les propriétés générales ou qui doivent être allouées dynamiquement. Il y a aussi une initialisation des données initiales, incluant l’assignement des “handle” qui sont nécessaires aux indicateurs.

{xtypo_code}// Function for data calculation
// note that the function parameters can be renamed
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 toCount = (int)MathMin(rates_total, rates_total – prev_calculated + 1);

if (prev_calculated < 0 || prev_calculated > rates_total)
{
toCount = rates_total;
}

int copied = CopyBuffer(RSIHandle, 0, 0, toCount, Values);
if (copied == -1)
{
Print(“Error while data copying. Error ?”, GetLastError());
return 0;
}

// Coloring. Yes, now it became so simple
for (int i = toCount – 2; i >= 0; –i)
{

if (Values[i + 1] != EMPTY_VALUE &&
Values[i] > Values[i + 1])   ValuesPainting[i] = 1;
else                             ValuesPainting[i] = 0;
}

return rates_total;
}{/xtypo_code}

 

OnCalculate est la fonction qui traite et calcule les données. Cette fonction peut être de deux types. Ici nous avons la forme standard. Les détails sont ci-dessous.

Fonction:

{xtypo_code}// the function is not obligatory in a code
/*
void
OnDeinit()
{}
*/{/xtypo_code}


OnDeinit est la fonction de fermeture de l’indicateur. Souvent il est nécessaire de libérer les ressources comme par exemple les “handles” vers des fichiers.

 

II Deux concepts d’indicateurs

Le premier est le standard, c’est à dire celui que nous connaissions de MQL4, avec seulement une petite différence. C’est la fonction OnCalculate qui est appelée en lieu et place de la fonction Start. Pour la forme standard, cela ressemble à :

{xtypo_code}int OnCalculate(const int rates_total, // Arrays size
const int prev_calculated, // Bars processed on the previous call
const datetime& time[], // Data for the current chart and timeframe
const double& open[],
const double& high[],
const double& low[],
const double& close[],
const long& tick_volume[],
const long& volume[],
const int& spread[])
{
return rates_total;
}{/xtypo_code}

 

Afin de réduire la quantité de code nécessaire à la copie de données, les données du graphique sont passées directement en tant que tableau dans les paramètres de la fonction. En outre, le nombre de bougies disponibles est passé en premier paramètre et le nombre de bougies traitées après le dernier appel (ou 0) est le second paramètre.

La valeur 0 peut être passée au premier appel de l’indicateur, ainsi que lorsque de nouvelles valeurs sont chargées ou en cas de manque de données. Ce paramètre est un remplacement (alternative ou équivalent, à vous d’en juger) de la fonction IndicatorCounted() qui était pratique pour de nombreux développeurs.

Le second concept est le remplacement et l’expansion des fonctions de type  i<…>OnArray de MQL4. Il y a un indicateur de ce type dans l’exemple forunir mar Metaquotes “Custom Moving Average”. Ce type d’indicateurs est destiné au traitement des données dépendant des choix de l’utilisateur, incluant donc les indicateurs personnels.

La fonction pour le traitement des données des indicateurs de ce type est la suivante :

{xtypo_code}int OnCalculate (const int rates_total, // the size of the price[] array
const int prev_calculated, // bars calculated in the previous call
const int begin, // where notional data start from
const double& price[] // data array for calculation
);
{
return rates_total;
}{/xtypo_code}

Le dernier paramètre de la fonction correspond aux données sélectionnées par l’utilisateur pour traitement. Si vous souhaitez réaliser un inidcateur avec de nombreux buffers, le premier buffer sera passé pour le traitement des données.

 

 

La valeur First Indicator’s Data de l’énumération signifie que l’indicateur sera appliqué sur le premier indicateur attaché à la fenêtre sélectionnée du graphique.

La valeur Previous Indicator’s Data signifie que l’indicateur sera appliqué sur le dernier indicateur attaché à la fenêtre sélectionnée du graphique.

Ces indicateurs peuvent être utilisés pour assembler des piles entières. Par exemple, l’indicateur Custom Moving Average a la possibilité de réaliser un triple lissage des cours en appliquant le premier indicateur sur les données du graphique, le second sur le premier et le troisième sur le second :

Il y a de nombreux indicateurs standards qui mettent en oeuvre ce concept particulier. C’est pourquoi, lorsque vous apercevez la demande de paramètre applied_price_or_handle :

cela signifie que l’indicateur en question peut traiter les données de l’utilisateur. Le handle de ces données doit être passée en paramètre applied_price_or_handle.

En utilisant la même méthode il est possible d’organiser le traitement des données directement dans le code de l’indicateur :

{xtypo_code}{
// …
RSIHandle = iRSI(NULL, 0, RSIPeriod, AppliedPrice);
SmoothHandle = iMA(NULL, 0, SmoothPeriod, 0, MODE_EMA, RSIHandle);
// …
}{/xtypo_code}

 

Il y a  une nouvelle application de ce concept : la possibilité d’écrire des indicateurs en tant que service unniversel. Un exemple d’un tel type est attaché dans le fichier Direction_Brush.mq5.

 

les résultats sont présentés dans le graphique ci dessus. La coloration de la direction est dans ce cas séparé comme une entité indépendante et implémentée dans un autre indicateur.

Leur universalité est certainement limitée dans la mesure où ils ne sont applicables seulement sur le buffer 0 de l’indicateur sur lequel ils sont attachés. Toutefois je pense qe ceci restera très utile.

Par conséquent, lorsque vous écrivez un indicateur personnel, vous devriez désormais le prendre en compte en mettant les données principales de l’indicateur dans le buffer 0 afin de le rendre compatible avec les services universels et vous permettre d’une certaine manière de ne plus avoir besoin de les recoder dans chaque indicateur. Outre les traitements propres de l’indicateur, la plupart des opérations externes pourront être réalisées les indicateurs universels.

L’étendue des applications n’est pas si faible que ce qu’il peut paraître :

  • colorier les caractéristiques des indicateurs (tops, directions, lniveaux, segments, etc.);
  • différent signaux dans différentes conditions;
  • collecter et afficher des statistiques – par exemple la distribution de données;
  • la construction d’indicateurs universels qui peuvent être calculés pour un buffer comme par exemple les moyennes mobiles, zigzag, etc.

 

Ceci n’est évidemment pas une liste exhaustive de toutes les possibilités mais seulement celles qui me viennent immédiatement à l’esprit. De nombreuses autres mises en oeuvre devraient voir le jour grâce à l’imagination collective de la communauté.

La suite dans la partie 2 de cet article si cela vous intéresse (commentaires…).

 

Traduction et Adaptation: Nicolas Vitale
“MQL5 and Metatrader  are trade marks of MetaQuotes Software Corp. and all related materials are reserved for MetaQuotes”

Tableau de conversion MQL4 à MQL5

 

Nous avions promis de vous tenir au courant au niveau de la conversion MQL4 à MQL5, et donc voici quelques nouvelles. Tout d’abord, nous avons désormais la confirmation que les programmes écris en MQL4 ne pourront pas fonctionner sur la plateforme MQL5. Toutefois le style de programmation MQL4 (c’est à dire non objet) pourra être employé par ceux qui le souhaitent sur Metatrader 5 et MQL5. Reste dans tous les cas à apprendre les équivalences de fonctions et de variables prédéfinies.

Fai que nous remercions (cf son site japonais…) nous propose donc à ce propos une table de conversion pour obtenir les équivalences entre MQL4 et MQL5. Cliquez ici pour obtenir la version mise à jour de la table.

A noter que certains travaillent déjà à permettre une réutilisation des fonctions classiques. C’est déjà chose faite pour les fonctions des séries temporelles comme iClose, iLow, iOpen, iClose, iTime, iVolume, iHighest, iLowest, iBarShift, and iBars grâce au fichier suivant: mt4timeseries.mqh.

Pour les fonctions correspondantes aux objets graphiques vous pouvez utilisez le fichier de compatibilité: mt4objects.mqh .

Pour les fonctions correspondantes aux infos du compte vous pouvez utilisez le fichier de compatibilité: mt4accountinfo.mqh .

Pour les fonctions correspondantes aux fonctions temporelles vous pouvez utilisez le fichier de compatibilité: mt4datetime.mqh .

Pour les fonctions correspondantes aux manipulations des strings vous pouvez utilisez le fichier de compatibilité: mt4string.mqh .

A noter que ces  fichiers sont proposés gracieusement par Circlesquares ici.

 

Table de conversion de MQL4 à MQL5

MQL4

MQL5

Ask SymbolInfoDouble(Symbol(),SYMBOL_ASK);
Bid SymbolInfoDouble(Symbol(),SYMBOL_BID);
Bars Bars(Symbol(),PERIOD_CURRENT);
Digits _Digits or Digits()
Point _Point or Point()
Close[]
High[]
Low[]
Open[]
Time[]
Volume[]
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 &Volume[],
const long &Real_Volume[],
const int &Spread[])
{
ArraySetAsSeries(Open,true);
ArraySetAsSeries(High,true);
ArraySetAsSeries(Low,true);
ArraySetAsSeries(Close,true);
ArraySetAsSeries(Time,true);
ArraySetAsSeries(Volume,true);
ArraySetAsSeries(Spread,true);
in EA/script
use CopyClose,CopyHigh,CopyLow,CopyOpen,CopyTime,
CopyTickVolume
AccountBalance() AccountInfoDouble(ACCOUNT_BALANCE);
AccountCredit() AccountInfoDouble(ACCOUNT_CREDIT);
AccountCompany() AccountInfoString(ACCOUNT_COMPANY);
AccountCurrency() AccountInfoString(ACCOUNT_CURRENCY);
AccountEquity() AccountInfoDouble(ACCOUNT_EQUITY);
AccountFreeMargin() AccountInfoDouble(ACCOUNT_FREEMARGIN);
AccountFreeMarginCheck() read AccountFreeMarginCheck
AccountFreeMarginMode() ???
AccountLeverage() AccountInfoInteger(ACCOUNT_LEVERAGE);
AccountMargin() AccountInfoDouble(ACCOUNT_MARGIN);
AccountName() AccountInfoString(ACCOUNT_NAME);
AccountNumber() AccountInfoInteger(ACCOUNT_LOGIN);
AccountProfit() AccountInfoDouble(ACCOUNT_PROFIT);
AccountServer() AccountInfoString(ACCOUNT_SERVER);
AccountStopoutLevel() AccountInfoDouble(ACCOUNT_MARGIN_SO_SO);
AccountStopoutMode() AccountInfoInteger(ACCOUNT_MARGIN_SO_MODE);
ArrayBsearch() read ArrayBsearch
ArrayCopyRates() read CopyRates
ArrayCopySeries() read CopyClose/CopyHigh/CopyLow/CopyOpen/CopyTickVolume/CopyTime
ArrayDimension() ????
ArraySort() // MQL4 ArraySort(SortInt, 0, 0, MODE_ASCEND);
ArraySort(SortInt);

//MQL4 ArraySort(SortInt, 0, 0, MODE_DESCEND);
ArraySetAsSeries(SortInt,true);
ArraySort(SortInt);

GetLastError() you need to call ResetLastError() before use.
IsConnected() (bool)TerminalInfoInteger(TERMINAL_CONNECTED)??
IsDemo() bool IsDemo(){

ENUM_ACCOUNT_TRADE_MODE tradeMode=(ENUM_ACCOUNT_TRADE_MODE)
AccountInfoInteger(ACCOUNT_TRADE_MODE);

if(tradeMode == ACCOUNT_TRADE_MODE_DEMO) return(true);
// tradeMode is ACCOUNT_TRADE_MODE_CONTEST or ACCOUNT_TRADE_MODE_REAL
return(false);

}

IsDllsAllowed()
IsLibrariesAllowed()
(bool)MQL5InfoInteger(MQL5_DLLS_ALLOWED)???
IsOptimization() (bool)MQL5InfoInteger(MQL5_OPTIMIZATION)???
IsTesting() (bool)MQL5InfoInteger(MQL5_TESTING)???
IsTradeAllowed() (bool)MQL5InfoInteger(MQL5_TRADE_ALLOWED) &&
(bool)TerminalInfoInteger(TERMINAL_TRADE_ALLOWED)??
IsExpertEnabled() (bool)TerminalInfoInteger(TERMINAL_EXPERTS_ENABLED)??
IsTradeContextBusy() LOST????
IsVisualMode() (bool)MQL5InfoInteger(MQL5_VISUAL_MODE)???
UninitializeReason() _UninitReason
TerminalCompany() TerminalInfoString(TERMINAL_COMPANY)
TerminalName() TerminalInfoString(TERMINAL_NAME)
TerminalPath() TerminalInfoString(TERMINAL_PATH)
TerminalInfoString(TERMINAL_DATA_PATH)
TerminalInfoString(TERMINAL_COMMONDATA_PATH)
Alert() LOST????
MarketInfo() read SymbolInfoInteger/Double/String
CharToStr() CharToString()
DoubleToStr() DoubleToString()
StrToDouble() StringToDouble()
StrToInteger() StringToInteger()
StrToTime() StringToTime()
TimeToStr() TimeToString()
IndicatorBuffers() #property indicator_buffers 7
#property indicator_plots 7
IndicatorCounted() const int prev_calculated
IndicatorDigits() IndicatorSetInteger(INDICATOR_DIGITS,_Digits);
IndicatorShortName() IndicatorSetString(INDICATOR_SHORTNAME,name);
SetIndexArrow() PlotIndexSetInteger(0,PLOT_ARROW,213);
SetIndexBuffer() SetIndexBuffer(0,MABuffer,INDICATOR_DATA); // or INDICATOR_CALCULATIONS
SetIndexDrawBegin() PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,KPeriod);
SetIndexEmptyValue() PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,0.0);
SetIndexLabel() PlotIndexSetString(0,PLOT_LABEL,”Moving Average”);
SetIndexShift() PlotIndexSetInteger(0,PLOT_SHIFT,26);
SetIndexStyle() PlotIndexSetInteger(0,PLOT_LINE_STYLE,STYLE_SOLID);
PlotIndexSetInteger(0,PLOT_LINE_WIDTH,2);
PlotIndexSetInteger(0,PLOT_LINE_COLOR,DeepPink);
SetLevelStyle() IndicatorSetInteger(INDICATOR_LEVELSTYLE,STYLE_DOT);
SetLevelValue() IndicatorSetInteger(INDICATOR_LEVELS,2);
IndicatorSetDouble(INDICATOR_LEVELVALUE,0,20);
IndicatorSetDouble(INDICATOR_LEVELVALUE,1,80);
Day()
DayOfWeek()
DayOfYear()
Hour()
Minute()
Month()
Seconds()
Year()
MqlDateTime tm;
TimeCurrent(tm);
int Day=tm.day;
int DayOfWeek=tm.day_of_week;
int DayOfYear=tm.day_of_year;
int Hour=tm.hour;
int Minute=tm.min;
int Seconds=tm.sec;
int Year=tm.year;
TimeDay()
TimeDayOfWeek()
TimeDayOfYear()
TimeHour()
TimeMinute()
TimeMonth()
TimeSeconds()
TimeYear()
datetime TargetTime = D’2003.12.31′;
MqlDateTime tm;
TimeToStruct(TargetTime,tm);
int Day=tm.day;
int DayOfWeek=tm.day_of_week;
int DayOfYear=tm.day_of_year;
int Hour=tm.hour;
int Minute=tm.min;
int Seconds=tm.sec;
int Year=tm.year;
FileOpenHistory() LOST????
FileSeek() read FileSeek
ObjectCreate() ObjectCreate(0,…
ObjectDelete() ObjectDelete(0,name);
ObjectDescription() ObjectGetString(0,name,OBJPROP_TEXT);
ObjectFind() ObjectFind(0,name);
ObjectGet() read ObjectGetIngeger/Double/String
ObjectGetFiboDescription() ObjectGetString(0,name,OBJPROP_LEVELTEXT,int level);
ObjectGetShiftByValue() ObjectGetTimeByValue(0,string name,double value,int line_id);
ObjectGetValueByShift() ObjectGetValueByTime(0,string name,datetime time, int line_id);
ObjectMove() ObjectMove(0, string name, int point, datetime time1, double price1)
ObjectName() ObjectName(0,int pos,int nwin=-1,int type=-1);
ObjectsDeleteAll() ObjectsDeleteAll(0,int window=EMPTY, int type=EMPTY)
ObjectSet() read ObjectSetIngeger/Double/String
ObjectSetFiboDescription() ObjectSetString(0,string name,OBJPROP_LEVELTEXT,int level,string newstring);
ObjectSetText() ObjectSetString(0,string name,OBJPROP_LEVELTEXT,string newstring);
ObjectsTotal() ObjectsTotal(0,int nwin=-1,int type=-1);
ObjectType() ObjectGetInteger(0,name,OBJPROP_TYPE);
StringConcatenate() int StringConcatenate(string& string_var,void arg1,void arg2….);
StringGetChar() StringGetCharacter()
StringSetChar() StringSetCharacter()
iBars() Bars()
iBarShift()
iClose()
iHigh()
iHighest()
iLow()
iLowest()
iOpen()
iTime()
iVolume()
use mt4timeseries.mqh (http://forum.mql4.com/26550/page14)
iTime() datetime iTime(string symbol,ENUM_TIMEFRAMES timeframe,int index)
{
datetime Times[];
datetime tm=0;
ArraySetAsSeries(Times,true);
int copied=CopyTime(symbol,timeframe,0,Bars(symbol,timeframe),Times);
if(copied>0 && index<copied) tm=Times[index];
return(tm);
}// My Simple code..
HideTestIndicators() LOST????
Period() PeriodSeconds(Period())/60
RefreshRates() LOST????
WindowBarsPerChart() ChartGetInteger(0,CHART_VISIBLE_BARS)
WindowExpertName() MQL5InfoString(MQL5_PROGRAM_NAME)???
WindowFind()
WindowFirstVisibleBar() ChartGetInteger(0,CHART_FIRST_VISIBLE_BAR)
WindowHandle() *ChartGetInteger(0,CHART_WINDOW_HANDLE)
WindowIsVisible() ChartGetInteger(0,CHART_WINDOW_IS_VISIBLE)
WindowOnDropped() ChartWindowOnDropped()
WindowPriceMax() ChartGetDouble(0,CHART_PRICE_MIN,0);
WindowPriceMin() ChartGetDouble(0,CHART_PRICE_MAX,0);
WindowPriceOnDropped() ChartPriceOnDropped()
WindowRedraw() ChartRedraw()
WindowScreenShot() read ChartScreenShot
WindowTimeOnDropped() ChartTimeOnDropped()
WindowsTotal() ChartGetInteger(0,CHART_WINDOWS_TOTAL)
WindowXOnDropped() ChartXOnDropped()
WindowYOnDropped() ChartYOnDropped()

 

Apercu de MQL5 et Metatrader 5


Cet article est la traduction d’un post officiel du Forum MQL4 que vous trouverez en VO ici dont l’auteur fait partie des rares chanceux à participer aux beta tests. Il fait suite d’un premier article présentant la plateforme Metatrader 5 que vous trouverez ici, d’un article parlant de MQL5 et encore un autre évoquant le nouveau système de gestion et de passage des ordres de Metatrader 5.

Non ceci n’est pas un montage photoshop… c’est Metatrader 5.

undefined


MQL5 ou l’arrivée d’un langage de haut niveau

 

Le changement fondamental avec MQL5 est l’apparition de la Programmation Orienté Objet (POO), ce qui donne plus de possibilités aux programmeurs expérimentés (NDLR: En effet tousl les langages informatiques modernes sont des langages orientés objets). Pour ceux qui aimaient MQL4 et ne connaissent rien à la programmation orientée objet, les développeurs ont laissé la possibilité d’écrire du code MQL5 en conservant le style sans objets de MQL4. La différence est dans les fonctionnalités qui doivent être apprises à nouveau.

Prenons un exemple simple, les variables Ask et Bid n’existent plus (NDLR: bel exemple de ce qui ne faut pas faire…). Afin d’obtenir les valeurs Bid, la fonction suivant doit être appelée:

{xtypo_code}SymbolInfoDouble(Symbol(),SYMBOL_BID);{/xtypo_code}

 

Il n’y a plus non plus les Low[0] ou iLow ( Symbol(), PERIOD_D1, 0 ) mais on peut facilement les reconstruire. Les nouvelles fonctions travaillant avec des données historiques donnent la possibilité de lire des données de l’histo d’un point à un autre , d’un certaine barre  à une autre , ou du temps selectionné au suivant. Avant, lire des séries de données nécessitait de toutes les charger en mémoire. Que l’on en ai besoin ou pas, c’était lu, et si vous avez besoin de de lire M1, le système partait de 1999 (dans le acs ou l’historique était disponible) jusqu’à la date courante, heure et minute.

Désormais, seulement l’ensemble nécessaire peut être lu, ce qui fera gagner du temps et de la mémoire.

{xtypo_code}MqlRates rates_arrayG[];
Int Bar=30; // read only 30 bars stating from the zero one
iCopBar=CopyRates(Symbol(),PERIOD_M1,0,Bar,rates_arrayG);{/xtypo_code}

 

Un tel changement de fonctionnalité n’est pas effrayant. Nous aurons simplement besoin de passer un peu de temps pour apprendre les nouvelles fonctions analogues.

Quelques innovations fonctionnelles que j’attendais de MQL

 

  • OnTimer() – fonction permettant de traiter les évènement de timer (il n’est désormais plus nécessaire de mettre tout l’EA dans une boucle pour le faire fonctionner pendant une certaine pèriode indépendante de celles liées à l’arrivée du prochain tick).
  • OnTrade() – fonction traitant les évènements liés aux trades (ouverture, fermeture, changement de volume, etc).
  • OnChartEvent() – fonction traitant les évènements engendrés par la souris ou le clavier.

 

Creusons un petit peu tout ça.

La fonction OnTimer()  est appelée si le timer est pré initialisé dans la fonction OnInit qui traite les évènements d’initialisation.

Exemple:

{xtypo_code}//+——————————————————————+
//|                                                                  |
//+——————————————————————+
int OnInit()
{
EventSetTimer(1); //eà chaque seconde on apelle OnTimer()
}
//+——————————————————————+
//|                                                                  |
//+——————————————————————+
void OnDeinit()
{
//l’annulation de la référence au timer doit être faite à la sortie
EventKillTimer();
}
//+——————————————————————+
//|                                                                  |
//+——————————————————————+
void OnTimer()
{
MqlDateTime str1;
TimeGMT(str1); // nouvelle fonction pour obtenir temps GMT
Comment(str1.hour
,str1.min
,str1.sec
,str1.day
,str1.mon
,str1.year
,str1.day_of_year
,OrdersTotal()
,PositionsTotal()
);
}{/xtypo_code}

 

Le contrôle peut donc être obtenu non seulement à la réception d’un tick comme c’était le cas autrefois, mais aussi par le timer ce qui autorise à écrire des programmes temps réels gérables. Avec cette possibilité, des systèmes plus élaborés peuvent être créés.

J’ai aimé la fonction OnTrade(). Cette fonction est appelée au moment où un des évènements suivant se produit: placement d’ordre, activation de StopLoss ou de TakeProfit, changement de StopLoss ou de niveau de TakeProfit, placement ou suppression de pending order, etc.

Désormais, c’est beaucoup plus facile de contrôler les évènements connectés aux opérations de trading. Il n’y a désormais plus besoin de boucles vérifiant l’état des ordres au niveau des ticks ou barres. De telles bocles étaient utilisées dans MQL4, ce qui réduisait considérablement les performances des EAs et leur optimisation.

Concentrons nous sur la fonction OnChartEvent(). L’appel de la fonction est réalisé pour de nombreux évènements. je ne suis pas parvenu à tester chacun d’entre eux, mais la liste est impressionnante :

  • CHARTEVENT_KEYDOWN — évènement d’appuie de bouton;
  • CHARTEVENT_OBJECT_CLICK — évènement d’un clic de souris sur un objet graphique appartenant à la fenêtre.
  • CHARTEVENT_OBJECT_DRAG — évènement de déplacement d’un objet graphique par la souris.
  • CHARTEVENT_OBJECT_ENDEDIT — évènement de fin d’édition d’un texte.
  • CHARTEVENT_CUSTOM+n — identifiant d’un évènement sur mesure.
  • CHARTEVENT_CUSTOM_LAST — le dernier.

 

La possibilité de gérer le trading et les graphiques sur une nouvelle base plus fonctionnelle était une des promesses des développeurs

 

Des nouveaux objets graphiques, des boutons et des champs d’entrées sont apparus. Le management des fenêtres est devenu fantastique, et l’on peut même insérer des images à partir de fichiers (cette option offre de nombreuses possibilités pour ceux qui aiment les designs spéciaux. Ce n’est pas Photoshop mais le résultat des possibilités de MQL5 et Metatarder 5. Parmi les nouvelles fonctionnalités, il est à noter que l’on put désormais créer ses propres boutons et champs d’entrées. par exemple un bouton qui ferme tous les ordres ouverts ou un quick Buy ou Sell configuré avec les valeurs des paramètres (stops et TP) par défauts.

undefined

Fig. 2. Les objets graphiques permettent de créer un espace informationnel.

Il y a un point qui me gêne cependant: les objets ne peuvent pas être créés à partir des indicateurs. Ceci a été fait intentionnellement dans  le but d’accélérer les performances des indicateurs. La bonne nouvelle est qu’ils l’ont compris et vont probablement implémenter la fonctionnalité pour démarrer plusieurs EAs dans une seule fenêtre. Nous serons capables de créer des EA-Indicateurs avec des objets et sans trader. De tels indicateurs peuvent être créer maintenant. Pour le moment le problème est résolu en ouvrant un EA dans une fenêtre et l’EA créant les objets dans une seconde fenêtre et puis ensuite implémenter les échanges entre eux.

Par exemple, je suis parvenu à transformer mon “breakthrough” indicateur de MQL4 à MQL5 en plusieurs heures. La plupart du temps a concerné l’apprentissage des fonctions et le debuggage. En MQL5 le code est devenu plus concis.

 

Pour parler du terminal en lui même, j’ai été impressionné par le nombre de timeframe. D’après moi, il n’y en a même trop, bien que l’abondance de timeframes minute peut être utile à certains traders. Bien, désormais il n’y a plus qu’un pas à faire pour arriver à la création d’un ensemble de timeframe libre. Désormais toutes les données de l’historique sont sauvegardées sous formes de minutes, et il n’y a donc pas de problèmes de synchronisation des différents timeframe (ceci est une solution technologique importante).

 

Désormais il n’y a plus de fichiers différents pour chaque timeframe dans le répertoire de l’historique.

undefined

Fig. 3. Tout l’historique est sauvé dans un seul fichier

Une autre nouveauté utile est la possibilité d’effacer les logs.

undefined

Fig. 4. Utilisez un bouton pour effacer tous les journaux de l’EA et supprimer les messages inutiles.

Ceci est juste un aperçu rapide de MetaTrader 5. Je ne peux décrire toutes les nouvelles caractéristiques en si peu de temps puisque les tests n’ont commencé que le 9 septembre. Je n’ai pas pu pour le moment tout essayer mais je suis déjà impressionné.

[…]

Yuriy Zaytsev
Skype: yurazyuraz
yzh@mail.ru

 

Traduction: Nicolas Vitale
“MQL5 and Metatrader  are trade marks of MetaQuotes Software Corp. and all related materials are reserved for MetaQuotes”

Comment convertir du code MQL4 en MQL5

 

metatrader 5 mql5Alors que la sortie de MQL5 et de sa plateforme Metatrader 5 approche, il est temps de commencer à s’intéresser à la conversation de nos programmes MQL4 en MQL5. Or il a été annoncé par Metaquotes que les évolutions réalisées étaient trop importantes pour rendre compatibles les programmes MQL4 avec l’environnement Metatrader 5, laissant de nombreux traders perplexes et bien embêtés.

Voici la déclaration de Metaquotes :

Vous devez comprendre que notre but n’est pas de vous faire refaire les développements des  EAs à chaque fois que nous lançons une nouvelle plateforme. Depuis le début du développement de Metatrader 5 nous avons pensé que nous serons en mesure de garder la compatibilité. Et nous nous sommes exprimés à ce sujet à plusieurs reprises. Mais les nombreuses demandes des développeurs et des traders nous ont fait changer d’avis. Nous avons compris que nous ne pouvons faire ce nouveau langage compatible. Dans le même temps, nous avons fait MQL5 plus puissant et de cette façon, nous vous avons procuré, à vous développeurs ou traders, plus de capacités (ce qui était notre objectif principal dans le développement de l’IDE MQL5). D’un côté nous avons un nouveau langage avec des nouvelles capacités et de l’autre côté – la compatibilité entre MQL4 et MQL5. Malheureusement, ces deux objectifs ne peuvent être atteints en même temps.

Le but de cet article est donc de recenser les diverses solutions pour transformer vos EAs, indicateurs ou scripts MQL4 en MQL5. Il sera donc développé au fur et à mesure que nous obtenons des informations par Metaquotes et la communauté MQL5. En effet, bien que j’en doute malheureusement, des outils seront peut être proposés pour transformer automatiquement du code MQL4 en MQL5.

Une seule chose est donc certaine pour l’instant, Trading Automatique fournira un service professionnel d’assistance pour adapter ou reprogrammer en toute sécurité vos EAs ou indicateurs MQL4 à MQL5. Vous pouvez réserver dès à présent nos prestations. Les premiers arrivés étant les premiers servis.

Deux files ont été ouvertes sur le forum de Trading Automatique pour discuter de MQL5 ici et de Metatrader 5 là.

Mise à jour 1 : Voici un tableau présentant les équivalences MQL4 et MQL5 réalisé par Fai.

Mise à jour 2 : A noter que certains travaillent déjà à permettre une réutilisation des fonctions classiques. C’est déjà chose faite pour les fonctions des séries temporelles comme iClose,iLow, iOpen, iClose, iTime, iVolume, iHighest, iLowest, iBarShift, and iBars grâce au fichier suivant: mt4timeseries.mqh proposé par Circlesquares ici.

Mise à jour 3 : Pour les fonctions correspondantes aux objets graphiques vous pouvez utilisez le fichier de compatibilité: mt4objects.mqh .

Mise à jour 4 : Pour les fonctions correspondantes aux infos du compte vous pouvez utilisez le fichier de compatibilité: mt4accountinfo.mqh .

Pour les fonctions correspondantes aux fonctions temporelles vous pouvez utilisez le fichier de compatibilité: mt4datetime.mqh .

Pour les fonctions correspondantes aux manipulations des strings vous pouvez utilisez le fichier de compatibilité: mt4string.mqh .

A noter que ces  fichiers sont proposés gracieusement par Circlesquares ici.

A noter que ces deux fichiers sont proposés gracieusement par Circlesquares ici.

Caractéristiques de MQL5

 

La nouvelle plateforme, MetaTrader 5, est en développement depuis plusieurs mois. Un nouveau langage de programmation des stratégies de trading a été aussi développé.  Stanislav Starikov, le développeur en chef du langage nous explique par cet interview les nouvelles caractéristiques de MQL5 et en quoi elles diffèrent de MQL4 :

 

 

Pour rappel, la sortie de cette plateforme et de son nouveau langage sont prévus pour cette année. Voici la traduction de l’entretien :

Q: Stanislav, il y a plusieurs sujets dans le forum à propos du développement de la nouvelle plateforme MetaTrader 5 et du langage MQL5. Pourrais-tu un peu nous en parler?

A: En effet, le développement de la nouvelle plateforme de trading avance. Et le développement de MQL5 est à son étape terminale. Comme avec MQL4, nous allons mettre sur le marché MQL5 avant le terminal client, afin que les trades s’habituent des nouvelles possibilités deu langage.

Q: Et quelles sont les nouvelles possibilitées?

A: Avant tout, MQL5 incorpore de nouveaux types de données, de nouvelles structure, classes et à ce propos la programmation orientée objet. Nous avons également introduits les projets et considérablement augmenté la rapidité d’exécution des programmes.

Q: Parlez-nous s’il vous plait des nouveaux types de données. Dans quel objectifs sont-ils introduits dans MQL5?

A: En MQL4, nous avions trois types de données principaux: INT, DOUBLE et STRING. Désormais, nous avons ajouté les types: CHAR, SHORT, LONG, FLOAT, STRINGS devient Unicode. Nous avons aussi ajouté les STRUCTURES et les CLASSES. Pourquoi faisons-nous cela? Dans les langages de programmation tels que C++, ces types de données existent déjà. Et maintenant, il est plus facile de transférer des codes sources écrits en C++ dans MQL5.

Par exemple, le gagnant du championnat 2007 a raconté dans son interview qu’il avait développé son EA en C++ et après débuggage a transféré le code en MQL4. Maintenant, tout cela sera beaucoup plus facile à faire. De plus, déjà en MQL4 nous avons inclut la possibilité d’utiliser les fonctions de l’API Windows ou celles d’autres DLL. Très souvent de telles fonctions peuvent être de ces structures de données. Et maintenant, nous faisons de tels appels plus facilement, c’est à dire que nous les faisons marcher avec MQL5 plus facilement.

Q: Qu’est ce que sont les CLASSES et la Programmation Orientée Objet?

A: Une CLASSE est identique à une STRUCTURE, mais avec des fonctions ajoutées pour traiter les données de cette STRUCTURE. Cela permets de cacher la fonctionnalité, i.e. toutes ces FONCTIONS à l’intérieure d’une CLASSE. Un programme peut alors être construit avec des CLASSES OBJETS comme un bâtiment avec des briques. Premièrement, cela simplifie la programmation. Il devient plus facile d’écrire de tels programmes, de les lire et de les modifier dans le future. Considérez la situation où un programme devient toujours plus grand. Dans cette situation, les CLASES seront d’une grande aide.

Q: Pourriez vous nous parler des PROJETS?

A: Comme je l’ai déjà dit, les programmes deviennent de plus ne plus compliqués. Dans cette perspective, il est raisonnable de diviser un code source en plusieurs fichiers. Par exemple, un fichier pour chaque CLASSE. Les PROJETS introduits dans MQL5 permettent d’assembler un programme à partir de ces fichiers. C’est aussi une grande aide dans l’écriture des programmes.

Q: Stanislav, vous avez dit que vous avez augmenté la vitesse d’exécution des programmes MQL5. Comment y êtes vous parvenus? Avec MQL4, la vitesse était déjà élevée.

A: Pour vous dire la vérité, nous avions des réserves. En fait, en MQL4, un compilateur obtient du code binaire interprétable. En MQL5, nous obtenons aussi un code binaire, mais comme en .NET durant l’uploading du code, le code binaire est transformé en code x86 natif, c’est à dire en commandes du processeur. Par conséquent, le programme en langage natif fonctionne beaucoup plus rapidement que n’importe quel code bianire. En outre, nous avons investi beaucoup de temps et d’efforts au niveau de l’optimisation du code. Nous avons donc réussi à accélérer l’exécution des programmes.

Q: Pouvez-vous nous dire de combien la vitesse d’exécution des programmes a été accélérée en MQL5 par rapport à MQL4?

A: Non, je ne peux vous donner une réponse maintenant car nous n’avons pas encore réalisé de tests objectifs. Mais je peux déjà vous dire que la vitesse sera plusieurs fois plus élevée…

Pour information, la plateforme Metatrader 5 est attendue pour cet automne. Pour en savoir plus, lisez cet article sur Metatrader 5.

Traduction de l’interview: Nicolas Vitale
“MQL5 and Metatrader  are trade marks of MetaQuotes Software Corp. and all related materials are reserved for MetaQuotes”