EA31337 framework is designed for writing software for popular trading platforms such as MetaTrader (4 & 5).
It can be also used to convert your MQL4 code into MQL5 with minimum code changes.
The code is compatible with MQL4, MQL5 and C++ programming languages.
- About the project
Projects implementing this framework:
- EA31337: Multi-strategy advanced trading robot.
- EA31337-Libre: Multi-strategy trading robot.
- EA31337-strategies: EA strategies.
- EA31337-indicators-other: 3rd party indicators
- Check EA31337 website for more.
This framework can be used to convert your MQL4 code to be compatible with both MQL4 and MQL5.
Find below the table of conversion (replace code on left with the right one):
MQL4 (original) | MQL4 & MQL5 (replace with) | Required include file |
---|---|---|
WindowRedraw() |
Chart::WindowRedraw() |
Platform/Chart/Chart.h |
Day() |
DateTime::Day() |
Storage/DateTime.h |
TimeDayOfWeek() |
DateTime::DayOfWeek() |
Storage/DateTime.h |
DayOfWeek() |
DateTime::DayOfWeek() |
Storage/DateTime.h |
DayOfYear() |
DateTime::DayOfYear() |
Storage/DateTime.h |
Hour() |
DateTime::Hour() |
Storage/DateTime.h |
Month() |
DateTime::Month() |
Storage/DateTime.h |
TimeDay() |
DateTime::TimeDay() |
Storage/DateTime.h |
TimeDayOfYear() |
DateTime::TimeDayOfYear() |
Storage/DateTime.h |
TimeToStr() |
DateTime::TimeToStr() |
Storage/DateTime.h |
Year() |
DateTime::Year() |
Storage/DateTime.h |
iAC() |
Indi_AC::iAC() |
Indicators/Indi_AC.mqh |
iAD() |
Indi_AD::iAD() |
Indicators/Indi_AD.mqh |
iADX() |
Indi_ADX::iADX() |
Indicators/Indi_ADX.mqh |
iAO() |
Indi_AO::iAO() |
Indicators/Indi_AO.mqh |
iATR() |
Indi_ATR::iATR() |
Indicators/Indi_ATR.mqh |
iBWMFI() |
Indi_BWMFI::iBWMFI() |
Indicators/Indi_BWMFI.mqh |
iBands() |
Indi_Bands::iBands() |
Indicators/PriceRange/Indi_Bands.h |
iBearsPower() |
Indi_BearsPower::iBearsPower() |
Indicators/Indi_BearsPower.mqh |
iBullsPower() |
Indi_BullsPower::iBullsPower() |
Indicators/Indi_BullsPower.mqh |
iCCI() |
Indi_CCI::iCCI() |
Indicators/Indi_CCI.mqh |
iDeMarker() |
Indi_DeMarker::iDeMarker() |
Indicators/Indi_DeMarker.mqh |
iEnvelopes() |
Indi_Envelopes::iEnvelopes() |
Indicators/PriceRange/Indi_Envelopes.h |
iForce() |
Indi_Force::iForce() |
Indicators/Indi_Force.mqh |
iFractals() |
Indi_Fractals::iFractals() |
Indicators/Indi_Fractals.mqh |
iGator() |
Indi_Gator::iGator() |
Indicators/Indi_Gator.mqh |
iIchimoku() |
Indi_Ichimoku::iIchimoku() |
Indicators/Indi_Ichimoku.mqh |
iMA() |
Indi_MA::iMA() |
Indicators/Price/Indi_MA.h |
iMACD() |
Indi_MACD::iMACD() |
Indicators/Oscillator/Indi_MACD.h |
iMFI() |
Indi_MFI::iMFI() |
Indicators/Indi_MFI.mqh |
iMomentum() |
Indi_Momentum::iMomentum() |
Indicators/Indi_Momentum.mqh |
iOBV() |
Indi_OBV::iOBV() |
Indicators/Indi_OBV.mqh |
iOsMA() |
Indi_OsMA::iOsMA() |
Indicators/Indi_OsMA.mqh |
iRSI() |
Indi_RSI::iRSI() |
Indicators/Oscillator/Indi_RSI.h |
iRVI() |
Indi_RVI::iRVI() |
Indicators/Indi_RVI.mqh |
iSAR() |
Indi_SAR::iSAR() |
Indicators/PriceRange/Indi_SAR.h |
iStdDev() |
Indi_StdDev::iStdDev() |
Indicators/Indi_StdDev.mqh |
iStochastic() |
Indi_Stochastic::iStochastic() |
Indicators/Oscillator/Indi_Stochastic.h |
iWPR() |
Indi_WPR::iWPR() |
Indicators/Oscillator/Indi_WPR.h |
RefreshRates() |
Market::RefreshRates() |
Market.mqh |
delete object |
Object::Delete(object) |
Storage/Object.h |
GetOrderProfit() |
Order::GetOrderProfit() |
Platform/Order.h |
OrderClose() |
OrderStatic::Close() |
Platform/Order.struct.h |
OrderCloseTime() |
OrderStatic::CloseTime() |
Platform/Order.struct.h |
OrderCommission() |
OrderStatic::Commission() |
Platform/Order.struct.h |
OrderLots() |
OrderStatic::Lots() |
Platform/Order.struct.h |
OrderMagicNumber() |
OrderStatic::MagicNumber() |
Platform/Order.struct.h |
OrderOpenPrice() |
OrderStatic::OpenPrice() |
Platform/Order.struct.h |
OrderOpenTime() |
OrderStatic::OpenTime() |
Platform/Order.struct.h |
OrderPrint() |
OrderStatic::Print() |
Platform/Order.struct.h |
OrderSelect() |
OrderStatic::Select() |
Platform/Order.struct.h |
OrderStopLoss() |
OrderStatic::StopLoss() |
Platform/Order.struct.h |
OrderSymbol() |
OrderStatic::Symbol() |
Platform/Order.struct.h |
OrderTicket() |
OrderStatic::Ticket() |
Platform/Order.struct.h |
OrderType() |
OrderStatic::Type() |
Platform/Order.struct.h |
OrdersTotal() |
TradeStatic::TotalActive() |
Trade.mqh |
Here are the special predefined variables conversion:
MQL4 (original) | MQL4 & MQL5 (replace with) | Required include file |
---|---|---|
Ask |
SymbolInfo::GetAsk() |
SymbolInfo.struct.static.h |
Bars |
ChartStatic::iBars() |
Platform/Chart/Chart.struct.static.h |
Bid |
SymbolInfo::GetBid() |
SymbolInfo.struct.static.h |
Close[] |
ChartStatic::iClose() |
Platform/Chart/Chart.struct.static.h |
Digits |
SymbolInfo::GetDigits() |
SymbolInfo.struct.static.h |
High[] |
ChartStatic::iHigh() |
Platform/Chart/Chart.struct.static.h |
Low[] |
ChartStatic::iLow() |
Platform/Chart/Chart.struct.static.h |
Open[] |
ChartStatic::iOpen() |
Platform/Chart/Chart.struct.static.h |
Point |
SymbolInfo::GetPointSize() |
SymbolInfo.struct.static.h |
Time[] |
ChartStatic::iTime() |
Platform/Chart/Chart.struct.static.h |
Volume[] |
ChartStatic::iVolume() |
Platform/Chart/Chart.struct.static.h |
The purpose of Mail
class is to provide common functionality for managing e-mails.
Example sending e-mail on trade execution:
int OnInit() { // @see: https://www.mql5.com/en/docs/event_handlers/oninit
Mail *mail = new Mail();
mail.SetSubjectPrefix("Trading");
}
void OnTrade() { // @see: https://www.mql5.com/en/docs/event_handlers/ontrade
if (!Terminal::IsRealtime()) {
mail.SendMailExecuteOrder();
}
}
int OnDeinit() { // @see: https://www.mql5.com/en/docs/event_handlers/ondeinit
delete mail;
}
Collection of indicator base classes used to implement technical indicators.
In Indicators/
folder there is collection of indicator classes.
The purpose of Profiler
class is to profile functions by measuring its time of execution.
The minimum threshold can be set, so only slow execution can be reported.
Example to measure execution time of function multiple times, then printing the summary of all calls which took 5ms or more.
#include "Profiler.mqh"
void MyFunction() {
PROFILER_START
Sleep(rand()%10);
PROFILER_STOP
}
int OnInit() {
for (uint i = 0; i < 10; i++) {
MyFunction();
}
// Set minimum threshold of 5ms.
PROFILER_SET_MIN(5)
// Print summary of slow executions above 5ms.
PROFILER_PRINT
return (INIT_SUCCEEDED);
}
void OnDeinit(const int reason) {
PROFILER_DEINIT
}
Example to measure execution time of function multiple times, then automatically printing all calls which took 5ms or more.
#include "Profiler.mqh"
void MyFunction() {
PROFILER_START
Sleep(rand()%10);
// Automatically prints slow executions.
PROFILER_STOP_PRINT
}
int OnInit() {
// Set minimum threshold of 5ms.
PROFILER_SET_MIN(5);
for (uint i = 0; i < 10; i++) {
MyFunction();
}
return (INIT_SUCCEEDED);
}
void OnDeinit(const int reason) {
PROFILER_DEINIT
}
The class to manage the symbol's information.
SymbolInfo *si = new SymbolInfo();
string symbol = si.GetSymbol();
MqlTick tick = si.GetTick()
double ask = si.GetLastAsk();
double bid = si.GetLastBid();
uint spread = si.GetSpread();
Print("MARKET: ", si.ToString());
delete si;
string symbol = SymbolInfo::GetCurrentSymbol();
MqlTick tick = SymbolInfo::GetTick(symbol)
double ask = SymbolInfo::GetAsk(symbol);
double bid = SymbolInfo::GetBid(symbol);
uint spread = SymbolInfo::GetSpread(symbol);
The purpose ofTimer
class is to measure time between starting and stopping points.
Single timer:
#include "Timer.mqh"
Timer *timer = new Timer("mytimer");
timer.Start();
// Some code to measure here.
timer.Stop();
Print("Time (ms): ", timer.GetSum());
timer.PrintSummary();
delete timer;
Multiple measurements:
#include "Timer.mqh"
Timer *timer = new Timer(__FUNCTION__);
for (uint i = 0; i < 5; i++) {
timer.Start();
Sleep(10); // Some code to measure here.
PrintFormat("Current time elapsed before stop (%d/5): %d", i + 1, timer.GetTime());
timer.Stop();
PrintFormat("Current time elapsed after stop (%d/5): %d", i + 1, timer.GetTime(i));
}
timer.PrintSummary();
delete timer;
- For bugs/features, raise a new issue at GitHub.
- Join our Telegram channel and discussion group for support.