Skip to content

📄 EA31337 framework (MQL library for writing EAs)

License

Notifications You must be signed in to change notification settings

afcarl/EA31337-classes

 
 

Repository files navigation

About the project

EA31337 framework is designed for writing trading robots for MetaTrader 4 and 5 platforms. It can be also used to convert your MQL4 code into MQL5 with minimum code changes.

Table of contents

Build status

Type Status
Travis CI build Build Status
AppVeyor build Build status

Conversion

MQL4 to MQL5 conversion

This framework can be used to convert your MQL4 code to be compatible with both MQL4 and MQL5.

Here is the table of conversion (replace code on left with right):

MQL4 (original) MQL4 & MQL5 (replace with) Required include file
Day() DateTime::Day() DateTime.mqh
TimeDayOfWeek() DateTime::DayOfWeek() DateTime.mqh
DayOfWeek() DateTime::DayOfWeek() DateTime.mqh
DayOfYear() DateTime::DayOfYear() DateTime.mqh
Hour() DateTime::Hour() DateTime.mqh
Month() DateTime::Month() DateTime.mqh
TimeDay() DateTime::TimeDay() DateTime.mqh
TimeDayOfYear() DateTime::TimeDayOfYear() DateTime.mqh
TimeToStr() DateTime::TimeToStr() DateTime.mqh
Year() DateTime::Year() DateTime.mqh
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/Indi_Bands.mqh
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/Indi_Envelopes.mqh
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/Indi_MA.mqh
iMACD() Indi_MAcD::iMACD() Indicators/Indi_MACD.mqh
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/Indi_RSI.mqh
iRVI() Indi_RVI::iRVI() Indicators/Indi_RVI.mqh
iSAR() Indi_SAR::iSAR() Indicators/Indi_SAR.mqh
iStdDev() Indi_StdDev::iStdDev() Indicators/Indi_StdDev.mqh
iStochastic() Indi_Stochastic::iStochastic() Indicators/Indi_Stochastic.mqh
iWPR() Indi_WPR::iWPR() Indicators/Indi_WPR.mqh
RefreshRates() Market::RefreshRates() Market.mqh
delete object Object::Delete(object) Object.mqh
GetOrderProfit() Order::GetOrderProfit() Order.mqh
OrderClose() Order::OrderClose() Order.mqh
OrderCloseTime() Order::OrderCloseTime() Order.mqh
OrderCommission() Order::OrderCommission() Order.mqh
OrderLots() Order::OrderLots() Order.mqh
OrderMagicNumber() Order::OrderMagicNumber() Order.mqh
OrderOpenPrice() Order::OrderOpenPrice() Order.mqh
OrderOpenTime() Order::OrderOpenTime() Order.mqh
OrderPrint() Order::OrderPrint() Order.mqh
OrderSelect() Order::OrderSelect() Order.mqh
OrderStopLoss() Order::OrderStopLoss() Order.mqh
OrderSymbol() Order::OrderSymbol() Order.mqh
OrderTicket() Order::OrderTicket() Order.mqh
OrderType() Order::OrderType() Order.mqh
OrdersTotal() Orders::OrdersTotal() Order.mqh

Classes

Collection class

This class is for storing various type of objects. Here is the example usage:

// Define custom classes of Object type.
class Stack : Object {
  public:
    virtual string GetName() = NULL;
};
class Foo : Stack {
  public:
    string GetName() { return "Foo"; };
    double Weight() { return 0; };
};
class Bar : Stack {
  public:
    string GetName() { return "Bar"; };
    double Weight() { return 1; };
};
class Baz : Stack {
  public:
    string GetName() { return "Baz"; };
    double Weight() { return 2; };
};

int OnInit() {
  // Define and add items.
  Collection *stack = new Collection();
  stack.Add(new Foo);
  stack.Add(new Bar);
  stack.Add(new Baz);
  // Print the lowest and the highest items.
  Print("Lowest: ", ((Stack *)stack.GetLowest()).GetName());
  Print("Highest: ", ((Stack *)stack.GetHighest()).GetName());
  // Print all the items.
  for (uint i = 0; i < stack.GetSize(); i++) {
    Print(i, ": ", ((Stack *)stack.GetByIndex(i)).GetName());
  }
  // Clean up.
  Object::Delete(stack);
  return (INIT_SUCCEEDED);
}

Indicator class

The purpose of Indicator class is to provide common functionality across all indicators such as storing and searching for values.

This class is used as a base class to handle technical indicator classes which can be found in Indicators/ folder.

It can be used for storing and reading variables as shown below.

Example 1

Example usage for storing values:

IndicatorParams iparams;
Indicator *in = new Indicator(iparams);
in.SetName("MyIndicator");
MqlParam entry;
entry.integer_value = 1;
in.AddValue(entry);
entry.integer_value = 2;
in.AddValue(entry);
Print(in.GetName(), "; ", in.ToString());
delete in;

To change maximum buffer values to keep, initialize IndicatorParams with constructor, e.g.

IndicatorParams iparams(10, INDI_NONE, TYPE_INT);

IndicatorData class

The purpose of IndicatorData class is to store indicator data. It is basically alternative implementation of Indicator class.

For more details, please read: Class to hold indicator values.

For implementation example, check tests/IndicatorDataTest.mq4.

Profiler class

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 1 - Measure execution time of function multiple times

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 2 - Measure execution time of function multiple times

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
}

Timer class

The purpose ofTimer class is to measure time between starting and stopping points.

Example 1 - Single timer

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;

Example 2 - Multiple timers

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;

Support

About

📄 EA31337 framework (MQL library for writing EAs)

Resources

License

Stars

Watchers

Forks

Packages

No packages published

Languages

  • MQL5 95.2%
  • MQL4 4.8%