Блог им. 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.

 

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

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

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

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

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

теги блога Dzam

....все тэги



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