Смотри, как бесплатно скачать роботов
Ищи нас в Facebook!
Ставь лайки и следи за новостями
Интересный скрипт?
Поставь на него ссылку - пусть другие тоже оценят
Понравился скрипт?
Оцени его работу в терминале MetaTrader 5
Библиотеки

CDouble & CDoubleVector - библиотека для MetaTrader 5

Просмотров:
936
Рейтинг:
(25)
Опубликован:
2018.08.10 11:52
\MQL5\Scripts\CDoubleDebug\
Нужен робот или индикатор на основе этого кода? Закажите его на бирже фрилансеров Перейти на биржу

Библиотека для проведения общих методов округления, используемых в разработке 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: 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 и возвращает целое число:
  • 0, если числа равны.
  • 1, если первое число больше второго.
  • -1, если первое число меньше второго.
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

(double &arr[], double step = NULL)

Округляет весь массив с точностью до указанного шага или до размера тика текущего символа, если step==NULL.
static void
RoundArrayToStep

(CArrayDouble &arr, double step = NULL)

Округляет всю коллекцию 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

(double number, int digits)

Возвращает в виде строки значение числа с плавающей запятой, округленную с точностью до 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:

  • PRECISION_DEFAULT - устанавливает точность по умолчанию на шаг 1 и 8 знаков после запятой, которые могут быть переопределены вызовом Step() или Digits().
  • PRECISION_TICK_SIZE - устанавливает точность до размера тика указанного символа для всех методов округления.
  • PRECISION_LOT_STEP - устанавливает точность до шага лота указанного символа для всех методов округления.
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:

  • PRECISION_DEFAULT - устанавливает точность по умолчанию на шаг 1 и 8 знаков после запятой, которые могут быть переопределены вызовом Step() или Digits().
  • PRECISION_TICK_SIZE - устанавливает точность до размера тика указанного символа для всех методов округления.
  • PRECISION_LOT_STEP - устанавливает точность до шага лота указанного символа для всех методов округления.
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

Renko 2.0 Renko 2.0

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

LinearRegressionChannel_Cloud LinearRegressionChannel_Cloud

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

Export Positions History Export Positions History

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

Accumulative Swing Index Smoothed Accumulative Swing Index Smoothed

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