Ставь лайки и следи за новостями
Поставь на него ссылку - пусть другие тоже оценят
Оцени его работу в терминале MetaTrader 5
- Просмотров:
- 1059
- Рейтинг:
- Опубликован:
- 2018.08.10 11:52
-
Нужен робот или индикатор на основе этого кода? Закажите его на бирже фрилансеров Перейти на биржу
Библиотека для проведения общих методов округления, используемых в разработке MQL-приложений, примитивный класс-оболочка для значений типа double и вектор для объектов CDouble. Совместима с MQL5 и MQL4!
Версия 1.02: (2018.02.18)
- Исправлена ошибка, из-за которой округленный результат отклонялся от ожидаемого результата. Выражаю благодарность AMRALI.
Версия 1.01:
- Исправлена ошибка, из-за которой арифметические операторы не возвращали округленные значения.
- Добавлен метод для установки символа после вызова конструктора.
CDouble
Класс CDouble обертывает значение примитивного типа double в объект. Кроме того, этот класс предоставляет несколько методов и статических методов для округления чисел типа double и массивов/коллекций типа double.
Описание
class CDouble : public CObject
Заголовок
#include <Double.mqh>
Иерархия наследования
- CObject
- CDouble
Виртуальные методы, используемые/переопределенные из класса CObject: Type, Load, Save, Compare.
Объект типа CDouble содержит пять полей данных:
string |
m_symbol |
Символ, назначенный экземпляру класса, используемый для получения шага лота и размера тика для округления. |
double |
m_value |
Исходное значение типа double, присвоенное экземпляру класса. |
uchar |
m_step |
Шаг для округления, представленный в виде значения типа char для снижения потребления памяти. Например, 0.0025 становится 25. |
uchar |
m_digits |
Количество знаков после запятой. |
ENUM_PRECISION |
m_mode |
Режим работы для привязки методов округления к определенному "шагу". |
Прежде чем углубиться в документацию, рассмотрим быстрый практический пример класса оболочки:
MqlTick tick; SymbolInfoTick(_Symbol,tick); CDouble price = tick.ask - 0.0087263487676283476, sl = price - 500*_Point, tp = price + 500*_Point, lots = 5.25 / 3.78789; MqlTradeRequest r={0}; r.symbol= _Symbol; r.price = price.AsRoundedTick(); r.sl = sl.AsRoundedTick(); r.tp = tp.AsRoundedTick(); r.volume= lots.AsRoundedLots();...
Другой пример с использованием статических методов библиотеки:
MqlTick tick; SymbolInfoTick(_Symbol,tick); MqlTradeRequest r={0}; r.symbol= _Symbol; r.price = tick.ask - 0.0087263487676283476, r.sl = price - 500*_Point, r.tp = price + 500*_Point, r.volume= 5.25 / 3.78789; ... CDouble::RoundTradeRequest(r); // автоматически округляет поля цены до размера тика // и объем до шага лота
Краткое описание статических методов
Примечание: для использования этой библиотеки не требуется знание ООП или применение экземпляра класса-оболочки. Все, что нужно сделать, это вызвать статические функции с разрешением контекста CDouble. Синтаксис выглядит следующим образом:
type variable_name = CDouble::Method(args);
Модификатор и тип | Метод | Описание |
---|---|---|
static bool |
IsEqual (double number1, double number2, double step); |
Сравнивает два числа типа double и возвращает логическое значение, вычитая второе число из первого, округляя сумму до "step" и сравнивая с 0. |
static bool |
IsEqual (double number1, double number2, int digits); |
Сравнивает два числа типа double и возвращает логическое значение, вычитая второе число из первого, округляя сумму до "digits" и сравнивая с 0. |
static int |
Compare (double number1, double number2, double step) |
Сравнивает два числа типа double и возвращает целое число:
|
static double |
RoundToStep (const double number, double step) |
Возвращает округленное значение с точностью до step (например, 0.0025). |
static double |
RoundToDigit (const double number, int digits) |
Возвращает округленное значение с точностью до digit (аналогично NormalizeDouble). |
static double |
RoundToStepUp (const double number, double step) |
Возвращает округленное вверх значение с точностью до step. |
static double |
RoundToStepDown (const double number, double step) |
Возвращает округленное вниз значение с точностью до step. |
static double |
RoundToTick (const double number, string symbol=NULL) |
Возвращает округленное значение с точностью до размера тика текущего символа (symbol=NULL) или символа, указанного в параметре symbol. |
static double |
RoundToLots (const double number, string symbol=NULL, bool always_return_valid=true) |
Возвращает округленное значение с точностью до шага лота текущего символа (symbol=NULL) или символа, указанного в параметре symbol. always_return_valid == true: всегда возвращает допустимый объем лота (min_lots <= return_value <= max_lots) |
static void (MQL5) |
RoundTradeRequest (MqlTradeRequest &request) |
Модифицирует поля price, sl, tp, и volume в соответствии с символом, указанным в запросе. Округляет цену, sl и tp с точностью до размера тика. Округляет объем вниз с точностью до шага лота. |
static void |
RoundArrayToStep |
Округляет весь массив с точностью до указанного шага или до размера тика текущего символа, если step==NULL. |
static void |
RoundArrayToStep |
Округляет всю коллекцию CArrayDouble с точностью до указанного шага или до размера тика текущего символа, если step==NULL. |
static int |
GetDigits (double floating_point) |
Возвращает количество знаков до конечных нулей в числе типа double (например, для 0.0002500... будет возвращено значение 5). |
static double |
GetPoint (int digits) |
Возвращает значение типа double с указанным количеством знаков после запятой (например, для 3 будет возвращено значение 0.001). |
static string |
ToString |
Возвращает в виде строки значение числа с плавающей запятой, округленную с точностью до digits, и усекает конечные нули (например, CDouble::ToString(1.23400001, 6) вернет значение "1.234"). |
Примеры:
MqlTick tick; SymbolInfoTick(_Symbol,tick); double rnd_by_step = CDouble::RoundToStep(tick.bid*1.052565465,_Point); double rnd_by_digits = CDouble::RoundToDigit(tick.bid*1.052565465,_Digits); double by_lot_step = CDouble::RoundToLots(0.123423,_Symbol); double by_tick_size = CDouble::RoundToTick(tick.ask-100*_Point,_Symbol); double roundup = CDouble::RoundToStepUp(3.999999999,_Point); double rounddn = CDouble::RoundToStepDown(3.999999999,_Point); int digits = CDouble::GetDigits(0.0000025); double point = CDouble::GetPoint(10); bool equal = CDouble::IsEqual(tick.bid,tick.bid+0.00000009,_Point); string tostr = CDouble::ToString(3.1399999999999999); int compare = CDouble::Compare(tick.ask,tick.bid); #ifdef __MQL5__ MqlTradeRequest r={0}; r.symbol= _Symbol; r.price = tick.ask+0.000089849847658759198199999; r.sl = r.price - 503 * _Point; r.tp = r.price + 503 * _Point; r.volume= 1.127984984; CDouble::RoundTradeRequest(r); #endif
Краткое описание конструктора
Конструктор | Описание |
---|---|
CDouble (const ENUM_PRECISION mode = PRECISION_DEFAULT, const string symbol = NULL) |
Примечание: нет необходимости явно вызывать конструктор, поскольку аргументы инициализируются в вызывающей функции. Также нет необходимости указывать метод определения точности, поскольку методы возвращают округленное значение на основе вызова метода. ENUM_PRECISION:
|
CDouble (const CDouble &other) |
Конструктор копий: копирует все скрытые поля из другого объекта в этот объект. |
Примеры:
CDouble num; CDouble bid(PRECISION_TICK_SIZE, _Symbol); CDouble ask(bid) CDouble ask2 = bid; CDouble lots(PRECISION_LOT_STEP, _Symbol);
Краткое описание присваивания - Перегруженные операторы присваивания
Модификатор и тип | Метод | Описание |
---|---|---|
void |
Set(const double value) |
присваивает исходное значение типа double переменной m_value. |
void |
Set(const CDouble &other) |
присваивает исходное значение объекта типа CDouble переменной m_value. |
void |
Перегруженные операторы =, +=, -=, *=, /= (double ИЛИ CDouble&) | присваивает или модифицирует исходное значение типа double переменной m_value. |
Примечание: оператор присваивания = можно вызывать в той же строке, что и объявление.
Примеры:
CDouble bid; bid.Set(tick.bid); CDouble ask = tick.ask; CDouble pi = 3.14; CDouble factor = 2; pi*=factor; Print(pi.ToString()); //6.28
Краткое описание перегруженных арифметических операторов
Модификатор и тип | Метод | Описание |
---|---|---|
double |
Перегруженные операторы +, -, *, / (double ИЛИ CDouble&) | Может принимать в качестве аргумента значение типа тип double или объект типа CDouble. Возвращает значение типа double после применения арифметической операции, связанной с перегруженным оператором. |
Примечание: В каждой инструкции может использоваться только один арифметический оператор.
Синтаксис для перегруженных арифметических операторов:
type_double_result <-- CDouble_object <-- operator <-- double // объект типа CDouble всегда стоит с левой стороны оператора type_double_result <-- CDouble_object1 <-- operator <-- CDouble_object2 // при использовании двух объектов CDouble порядок не имеет значения.
Примеры:
CDouble foo = 3.14; CDouble bar = 10; CDouble foobar = bar + foo; //13.14 CDouble err = bar + foo + foobar; // ошибка - недопустимое использование оператора double var = bar / foo;
Краткое описание перегруженных операторов сравнения
Модификатор и тип | Метод | Описание |
---|---|---|
bool |
Overloaded operators ==, !=, >, <, >=, <= (double OR CDouble&) |
Может принимать в качестве аргумента значение типа double или объект типа CDouble. Возвращает результат сравнения чисел в виде логического значения. Примечание: для сравнения используется метод <static int>Compare. |
Примеры:
CDouble foo = 3.14, bar = 3.139999999999999999999; Print(foo == bar); //true Print(foo <= bar); //true Print(foo > bar); //false
Краткое описание метода экземпляра
Точность округления (по умолчанию): digits = 8; step = 1e-08
- Имеется три способа контроля точности: Step, Digits или PrecisionMode(ENUM_PRECISION). Вызов любой из этих методов переопределяет предыдущие настройки.
- Step может быть равен _Point, LOT_STEP или TickSize; представлен в виде числа с плавающей запятой (например, 0.00001, 0.025 и т.д.)
- Нет необходимости устанавливать шаг, поскольку RoundToTick и RoundToLot автоматически используют соответствующие значения шага для возврата округленного значения.
Модификатор и тип | Метод | Описание |
---|---|---|
void |
PrecisionMode (const ENUM_PRECISION mode) |
Устанавливает режим по умолчанию для расчетов округления и функции ToString. Переопределяет существующие настройки Step и Digit. Примечание: также можно задать в конструкторе. ENUM_PRECISION:
|
ENUM_PRECISION |
PrecisionMode() |
Возвращает текущий режим определения точности. |
void |
Step (const double step_or_point) |
Устанавливает указанную точность для шага. Переопределяет режим определения точности. |
double |
Step() |
Возвращает текущее значение Step. |
void |
Digits (const int digits) |
Устанавливает точность до указанного количества знаков после запятой. Переопределяет режим определения точности и устанавливает шаг равным 1e-(digits). |
int |
Digits() |
Возвращает текущую точность в виде количества знаков после запятой. |
double |
AsRawDouble() |
Возвращает исходное значение сохраненного числа типа double. |
double |
AsRounded() |
Возвращает округленное значение с точностью до указанного шага. default = 1e-08. Для PRECISION_TICK_SIZE фиксируется шаг в размере тика. Для PRECISION_LOT_STEP фиксируется шаг в размере шага лота. |
double |
AsRoundedUp() |
Возвращает округленное вверх значение с точностью до указанного шага. |
double |
AsRoundedDown() |
Возвращает округленное вниз значение с точностью до указанного шага. |
double |
AsRoundedTick() |
Возвращает округленное значение с точностью до тика - задается размером тика символа. |
double |
AsRoundedLots (bool always_return_valid = true) |
Возвращает округленное значение с точностью до лота - задается шагом лота символа. |
int |
ToInt() |
Возвращает значение int. |
long |
ToLong() |
Возвращает значение long. |
string |
ToStringPrecision() |
Возвращает строку с конечными нулями. |
string |
ToString() |
Возвращает строку с усеченными конечными нулями. |
string |
Symbol() |
Возвращает текущий рабочий символ. |
string |
Symbol(const string symbol) |
Устанавливает указанный символ, отличающийся от символа графика при вызове конструктора, в качестве рабочего. Используется при работе с несколькими символами. |
Примеры:
CDouble pi2 = 3.14159265359; // получение значения в виде... double raw_double = pi2.AsRawDouble(); double round_double_to_step = pi2.AsRounded(); double tick_size_double = pi2.AsRoundedTick(); double lot_step_double = pi2.AsRoundedLots(); double rounded_up = pi2.AsRoundedUp(); double rounded_down = pi2.AsRoundedDown(); int double_to_int = pi2.ToInt(); long double_to_long = pi2.ToLong(); string precision_str = pi2.ToStringPrecision(); pi2 = 3.140000000009; pi2.Digits(8); string truncated_str = pi2.ToString();
Краткое описание виртуальных методов
Методы, переопределенные из CObject:
Модификатор и тип | Метод | Описание |
---|---|---|
virtual int |
Compare (const CObject *node, const int mode=0) |
Используется для сортировки и поиска. Метод Compare сравнивает значение AsRounded текущего объекта со значением AsRounded входящего узла. |
virtual int |
Type() |
Возвращает идентификатор TYPE_DOUBLE в виде int. |
virtual bool |
Save(const int file_handle) |
Сериализует и сохраняет переменные-члены в файл входящего хэндла. |
virtual bool |
Load(const int file_handle) |
Устанавливает переменные-члены в значения, сохраненные в файле входящего хэндла. |
Примеры приведены в разделе CDoubleVector.
CDoubleVector
Класс CDoubleVector представляет собой коллекцию указателей на объекты, предназначенный для динамических экземпляров CDouble.
Описание
class CDoubleVector : public CArrayObj
Заголовок
#include <Double.mqh>
Иерархия наследования
Виртуальные методы, используемые/переопределенные из класса CArrayObj: CreateElement.
Краткое описание метода экземпляра
**Описание унаследованных публичных методов смотрите на странице CArrayObj.
Модификатор и тип | Метод | Описание |
---|---|---|
CDouble* |
operator[] (const int index) |
Перегруженный оператор индекса. Возвращает указатель на объект по индексу n в векторе. |
bool |
Add(const double value) |
Принимает значение примитивного типа double в качество аргумента, преобразует его в объект CDouble и добавляет его в конец вектора. |
bool |
AssignDoubleArray (const double &array[]) |
Принимает массив значений типа double, преобразует их в объекты CDouble и присваивает их вектору. |
bool |
CopyOut(double &arr[]) |
Копирует значения CDouble из вектора в массив значений примитивного типа double. |
bool |
CopyOut(CArrayDouble &arr) |
Копирует значения CDouble из вектора в коллекцию CDoubleArray. |
virtual bool |
Save(const int file_handle) |
Сохраняет вектор в файл, указанный входящим хэндлом файла. |
virtual bool |
Load(const int file_handle) |
Загружает сохраненное состояние вектора из файла, указанного входящим хэндлом файла. |
Примеры:
CDoubleVector *vect = new CDoubleVector; double dubs[]={3.14,1.21,55.555}; vect.AssignDoubleArray(dubs); vect.Add(tick.bid); // вызов объекта CDouble по индексу Print(vect[vect.Total()-1].ToString()); // добавление нового объекта CDouble CDouble *lot = new CDouble(PRECISION_LOT_STEP); lot = 1.22; vect.Add(lot); // сортировка вектора по возрастанию vect.Sort(); int total = vect.Total(); // сохранение вектора в файл, включая состояния и значения объектов CDouble string f = "testdub.bin"; int h = FileOpen(f,FILE_WRITE|FILE_BIN); if(vect.Save(h)) Print("save successful"); FileClose(h); delete vect; // загрузка вектора из файла CDoubleVector vect_reborn; h=FileOpen(f,FILE_READ|FILE_BIN); if(vect_reborn.Load(h)) Print("load successful"); FileClose(h); total = vect_reborn.Total(); Print("Total vector size = ",sizeof(vect_reborn)," bytes"); for(int i=0;i<vect_reborn.Total();i++) Print(vect_reborn[i].ToString()); // копирование в массив double double arr2[]; vect_reborn.CopyOut(arr2); Print(ArraySize(arr2));
Перевод с английского произведен MetaQuotes Ltd.
Оригинальная публикация: https://www.mql5.com/en/code/19727

Индикатор для построения полноценных графиков Ренко с тенями. Размер свечей можно задавать в тиках, пипсах или в пунктах.

Канал линейной регрессии с сохранением своих значений в индикаторных буферах и с цветным фоновым заполнением канала

Экспортирует историю закрытых позиций на хеджинговом торговом счете в CSV-файл.

В этой версии индикатора Accumulative Swing Index добавлены дополнительные функции, что позволяет получить гораздо более сглаженные результаты.