Mql5 и списки: CMap, CVector, CStack..

 

Друзья, всем привет. :) Лень писать самому. Поделитесь пожалуйста, кто уже сделал списки: vector, map и другие.

Может проще будет STL сделать стандартной либой в MQL5? Заранее спасибо за все ответы.

 
Ivan Gurov:

Друзья, всем привет. :) Лень писать самому. Поделитесь пожалуйста, кто уже сделал списки: vector, map и другие.

Может проще будет STL сделать стандартной либой в MQL5? Заранее спасибо за все ответы.

Посмотрите Generic библиотеку для примитивов в последней бете:


 
Renat Fatkhullin:

Посмотрите Generic библиотеку для примитивов в последней бете:

Ура! Долгожданное обновление!

Когда сделаете множественное наследование интерфейсов? Сейчас, простите, это фейк в MQL, т.к. интерфейсы описывают контракт и ничего более, и по определению не могут являться еще одной версией наследования, так как это выполнено сейчас в MQL.

 
Renat Fatkhullin:

Посмотрите Generic библиотеку для примитивов в последней бете:

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

Возможно ли выложить папочку generic.zip сюда в ветку? Заранее спасибо.


К слову сказать, подобные вещи интересно было бы выложить в public.

Возможно многие ради интереса закомитят свои 2 кб.

Если вести две ветки по mql5: original и open branch - это позволит интегрироваться и наладить взаимосвязь с командой MQ.

Сообщество само бы толкало развитие в нужную сторону.

Впрочем, это просто мысли вслух.. :))

 
Ivan Gurov:

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

Возможно ли выложить папочку generic.zip сюда в ветку? Заранее спасибо.

Разобрался. Не нужен архив, бета версия доступна через "live update".

Если кому то понадобится, тут всё подробно написано: https://www.mql5.com/ru/forum/221763.

Бета-версия платформы MetaTrader 5 build 1700: Проекты в MetaEditor и синтетические инструменты
Бета-версия платформы MetaTrader 5 build 1700: Проекты в MetaEditor и синтетические инструменты
  • 2017.12.05
  • www.mql5.com
Бета-версия платформы MetaTrader 5 build 1700: Проекты в MetaEditor и синтетические инструменты 6 декабря 2017 года будет выпущена обновленная верс...
 
Renat Fatkhullin:

Посмотрите Generic библиотеку для примитивов в последней бете:



Ренат, безобразно сделаны базовые классы, а архитектура выстроена полностью неверно.


Приведу несколько примеров:

1) CMap базируется на Tree.

Это влияет на всё: на скорость, память, функционал. Мой достаточно мощный ноут при обходе 105 000 нодов тупо крэшит всё(так как используется рекурсия и стек тупо переполняется).

 

2) Когда виснет эксперт нету отклика от MetaTrader5. Только не говорите, что всё висит на одном процессе?

3) Судя по коду ощущение, что код писал Java Developer. А тут нужен полноценный C/C++ инженер(сеньер) с углубленным знаниям stl контейнеров. 

   bool              TryGetMin(T &min);
   bool              TryGetMax(T &max);

Забавно, что подобные конструкции нигде не используются(разве только в Java?) и в поисковых системах мы тут же попадаем на форум mql5.

4) Что за названия такие глупые по всему проекту?

- CRedBlackTreeNode??? Что это такое???

Как насчёт такого CRedBlackBlueYellowAndRedAgain. :)) PS Сарказм.

- Или кусочек кода

return(m_clr==RED_BLACK_TREE_NODE_BLACK &&

RED_BLACK_TREE_NODE_BLACK_BLACK__BLACK__BLACK__BLACK__BLACK. :)) PS Сарказм.

- Или например, метод WalkNextLevel??? Что за...??? 

IGoToWalkInThePark. :)) PS Сарказм.

- CSortedMap? Почему не просто CMap?

5) Зачем такая игра состояниями: insert, delete, linked? А если их 10 вариантов будет? На каждый будем плодить свой балансер? с 50 строчками кода?

   void              BalanceTreeAfterInsert(CRedBlackTreeNode<T>*insert_node);
   void              BalanceTreeAfterDelete(CRedBlackTreeNode<T>*linked_node);

BalanceTree должен быть единственный.

6) Когда я зашёл в код ожидал увидеть, как в stl итераторы begin, end.. А вижу, что CMap состоит из черно-красных деревьев.

7) IsLeaf()?? Что это такое? Что мы хотим этим сделать? Если нужен конец - это iterator end. Проверить пустой или нет -это IsEmpty().

8) А конструктор копирования, тогда зачем?

   int               CopyTo(CKeyValuePair<TKey,TValue>*&dst_array[],const int dst_start=0);
   int               CopyTo(TKey &dst_keys[],TValue &dst_values[],const int dst_start=0);

9)...

10)...

и т.д.


Всё надо переделывать, так точно не пойдет. Если продолжать развивать подобную архитектуру будут появляться "мелкие глюки", которые будет очень сложно отлавливать.

 

1) Приведите код

2) Приведите код

3) Вкусовщина

4) Нейминг правильный, чтобы любой понял.

Это только джедаи, пишущие в одиночку, уверены в приемлемости коротких имен. Автокомплит помогает в наборе длинных имен.

5) Вы понятия не имете, что критикуете. Не зная принципа ребалансировки красно-черного дерева, пытаетесь критиковать две базовые функции процессинга.

6) Мало ли что вы хотели увидеть

7) Не вижу проблемы

8) Не вижу проблемы в наличии таких функций


Язык открытый, возьмите и напишите свою библиотеку. А да, я же забыл - вам лень.

 

Ренат, подобные вопросы активно обсуждались ещё 4 года назад. В стандарте 11, map уже базируется на хэш-таблице.

Какой смысл плодить старые баги? Вообщем как хотите, я высказал всего лишь свое мнение.

Why std::map is red black tree and not hash table ?
Why std::map is red black tree and not hash table ?
  • stackoverflow.com
This is very strange for me, i expected it to be a hash table. Although hash might be not a trivial operation. I think that for most of the types it is pretty simple. when you use map you expect something that will give you amortized O(1...
 
Ivan Gurov:

Ренат, безобразно сделаны базовые классы, а архитектура выстроена полностью неверно.

Приведу несколько примеров:

1) CMap базируется на Tree.

Это влияет на всё

...

С чего Вы взяли, что CHashMap базируется на красно-черном дереве?

Сейчас проверил ядро CHashMap. Коллекция хранит пары ключ-значение в массиве m_entries:

//+------------------------------------------------------------------+
//| Class CHashMap<TKey, TValue>.                                    |
//| Usage: Represents a collection of keys and values.               |
//+------------------------------------------------------------------+
template<typename TKey,typename TValue>
class CHashMap: public IMap<TKey,TValue>
  {
protected:
   int               m_buckets[];
   Entry<TKey,TValue>m_entries[];
   ...
};

Непосредственно ядро функционала находится в методе Insert:

//+------------------------------------------------------------------+
//| Insert the value with the specified key from the map.            |
//+------------------------------------------------------------------+
template<typename TKey,typename TValue>
bool CHashMap::Insert(TKey key,TValue value,const bool add)
  {
   if(ArraySize(m_buckets)==0)
      Initialize(0);
//--- get hash code from key
   int hash_code=m_comparer.HashCode(key)&0x7FFFFFFF;
   int target_bucket=hash_code%ArraySize(m_buckets);
//--- search pair with specified key
   for(int i=m_buckets[target_bucket]; i>=0; i=m_entries[i].next)
      if(m_entries[i].hash_code==hash_code && m_comparer.Equals(m_entries[i].key,key))
        {
         //--- adding duplicate
         if(add)
            return(false);
         m_entries[i].value=value;
         return(true);
        }
   ...
   return(true);
  }

Из кода видно, что делается попытка угадать индекс по его хешу:

for(int i=m_buckets[target_bucket];...)

Если один и тот же хеш имеет несколько элементов, делается их перебор:

for(int i=m_buckets[target_bucket]; i>=0; i=m_entries[i].next)

... и уже каждый из этих элементов сравнивается с образчиком непосредственно:

if(m_entries[i].hash_code==hash_code && m_comparer.Equals(m_entries[i].key,key))

 Т.е. никакого красно-черного дерева здесь нет.

 
Ivan Gurov:

...

- CSortedMap? Почему не просто CMap?

А понял, когда Вы пишите:

1) CMap базируется на Tree. 

имеете в виду CSortedMap (вот видите, сократили имя, и уже понять Вас с первого раза нельзя, а Вы за сокращенный синтаксис ратуете;)

Раз так, Вы здесь тоже не правы. Дело в том, что CSortedMap это коллекция, позволяющая эффективно (за логарифмическое время) вставлять и извлекать элементы из упорядоченной коллекции. Эффективный алгоритм быстрой упорядоченной вставки и извлечения на хеш таблицах не построишь - почему долго объяснять. Для эффективной вставки и извлечения выбор из алгоритмов невелик:

  • Бинарное дерево;
  • Пирамида: тоже бинарное дерево но в проекции на массив, при этом экономится дополнительная память, т.к. не тратится память на узлы;
  • 2-3 деревья.
  • Красно-черные деревья - это 2-3 дерево в проекции бинарного дерева.

Т.е. как не крути, а от дерева с его ограничениями не уйти. Исходя из этого выбор в пользу красно-черных деревьев правильное и взвешенное решение.