Блог им. Dzam

Расширения классов в MQL4, MQL5. Или как получить Queue, List, Vector в Metatrader.

    • 09 мая 2015, 14:08
    • |
    • Dzam
  • Еще

Для написания индикатора мне потребовался массив типа очередь. Т.е. чтобы не было необходимости задавать размерность массива, можно было добавлять значения без указания индекса в конец и так далее. В C# и C++ есть такая удобная штука как Queue (с разными методами, но с общим смыслом), а вот в MT4 такого нет. Я подумал, что уже не первый раз сталкиваюсь с необходимостью такой очереди. Решил дописать несколько функций, которые мне нужны и из простого массива сделать очередь. Когда несколько функций было написано, я вынес все в файл *.mqh и думал куда бы поместить его, чтобы использовать в дальнейшем во всех своих работах. И тут я обнаружил, что в папке MQL4 (в MT5 все аналогично) уже есть папка Include, которая УЖЕ вкючает в себя расширения для массивов (и не только).

Расширения классов в MQL4, MQL5. Или как получить Queue, List, Vector в Metatrader.

Разобрав все, что связано с массивами я  не расстроился, так как тех методов, что мне нужны, я не нашел. Я вынес их отдельно в файлик ArrayDouble_ext.mqh. Добавил три новых функции: нахождение суммы всего массива, поиск максимального и минимального значений массива. Зачем нужны две последние спросите вы? Поясню. Есть стандартная фунция ArrayMaximum, например:

 int  ArrayMaximum(

   const void&   array[],             // массив для поиска

   int           count=WHOLE_ARRAY,   // количество проверяемых

   int           start=0              // с какого индекса начинаем поиск

   );

Как видно из описания, она использует в качестве параметров с какого элемента искать, количество проверяемых. В моем случае это всегда 0 и WHOLE_ARRAY. Еще, стандартная функция не удобна тем, что она возвращяет индекс найденного элемента, а не его значение. А зачем мне нужен индекс? Чтобы после его нахождения получать значение элемента по индексу? Вот я и создал свои функции, которые можно использовать без параметров и которые выдают конечное значение. В стандартном расширении ArrayDouble.mqh уже были функции для поиска максимума и минимума и они возврашали значение, а не индекс, но они также требовали два параметра: с какого элемента искать и сколько элементов проверять. Кроме того, в этом расширении содержалась ошибка.

//+------------------------------------------------------------------+

//| Find maximum of array                                            |

//+------------------------------------------------------------------+

int CArrayDouble::Maximum(const int start,const int count) const
{

   return(ArrayMaximum(m_data,start,count));

}

Если внимательно посмотреть на значение, которое возвращает функция, то мы увидим, что перепутаны параметры. ArrayMaximum вторым параметром принимает количество элементов для поиска, а третьим — с какого элемента искать. Я потратил очень много времени, не понимая, почему у меня максимум ищется не правильно.

А теперь немного примеров, с использованием расширений (файл-скрипт теста).

Код:

#include "..\Include\Arrays\ArrayDouble_Ext.mqh"

void OnStart()

{

   CArrayDoubleExt arr;

   //Adding

   arr.Add(10);

   arr.Add(11);

   arr.Add(13);

   arr.Add(16);

   arr.Add(9);

   

   //Deleting

   arr.Delete(0); //Delete first element from the left

   printf(«Size = %d, Max = %f, Min = %f, Summ = %f», arr.Total(), arr.MaxValue(), arr.MinValue(), arr.Summ());

Результат:

 Size = 4, Max = 16.000000, Min = 11.000000, Summ = 49.000000

 Расширений написано уже очень много. Прежде чем искать то, чего вам не хватает, а тем более писать, загляните в папку Include.

 

Удачной торговли!

Оригинал статьи

Данная публикация является личным мнением автора. Мнение владельца сайта может не совпадать с мнением автора.
834 | ★13
10 комментариев
Юрий Романов, Всегда пожалуйста. :)
avatar
такие страшные вещи пишите… а что сайт-то такой, как у пятиклассника?
avatar
Алексей Перов, Что именно вас напугало? Сайт развивается по мере необходимости.
avatar
Ну очень специфическая «разработка». Сам раньше на Java писал, и то читаю, и сложновато «переваривать».

>>Для написания индикатора
Я думал сейчас будет «hello world», но закончилось тем что «чем искать то, чего вам не хватает, а тем более писать, загляните в папку Include».

А про сайт… ну свои услуги с таким сайтов будет сложно продавать.
avatar
Алексей Перов, в JAVA есть такая штука, как ArrayList. А в MQL такого нет. Вот и приходится изобретать вилосипед и допиливать простой Array. Что конкретно вам не понравилось в сайте? Дизайн, функциональность? Информативность? Может еще что?
avatar
Дизайн, функциональность, информативность… могу конечно свои услуги предложить, но это уже оффтоп)
avatar
Алексей Перов, Спасибо, пока нет необходимости. Даже с таким сайтом загружен до 5 июня. :)
А то сделаете так что в день по 100500 человек будут заказы оформлять, куда мне тогда деваться.
avatar
пытаюсь найти вас в скайпе, Испания?
avatar
Алексей Перов, Да, все верно.
avatar

Читайте на SMART-LAB:
Фото
Календарь первички ВДО и розничных облигаций (Л-Старт YTM 32,53% | Идель Нефтемаш YTM 30,6% | БИЗНЕС АЛЬЯНС YTM 26,22% | РДВ Технолоджи YTM 26,92%)
📌 На 22 мая запланировано размещение облигаций разработчика и производителя оборудования для нефтегазовой отрасли Л-Старт  ( B.ru , 100 млн...
Фото
Лучше поздно чем никогда: краткие итоги мозгового штурма в понедельник
Доброе утро! Вчера болел зуб, поэтому я «зажал» конспект. Сегодня возвращаюсь с темами, к-е обсуждали. Напоминаю, каждый понедельник мы проводим...
Фото
Акции ЭсЭфАй — что осталось после огромных дивидендов?
Очередные большие выплаты и новый глубокий дивгэп на графике курса. Есть ли основания для закрытия техразрывов? Снова дивгэп
Фото
Банк Санкт-Петербург: мультипликатор балансовой стоимости выглядит низким, пришло ли время покупать?
Банк Санкт-Петербург представил финансовые результаты по МСФО за 1-й квартал 2026 года. Чистая прибыль в 1К26 составила 10,9 млрд руб.,...

теги блога Dzam

....все тэги



UPDONW
Новый дизайн