Обсуждение статьи "Рецепты MQL5 - Реализуем ассоциативный массив или словарь для быстрого доступа к данным" - страница 2

 
BmC:

Я извиняюсь! 

Я только разбираюсь со списками и созданием объектов

Когда я начал тестировать и копаться в вашем коде нашел ошибку незначительную, но могу и ошибаться.

замер скорости в сравнении библиотек вашей и стандартной кто быстрей вы в описание говорите про одно, а на графике показываете другое. Это вы не заметили или я неправильно читаю график.?? 

П.П. 4.3 

В начале написал, что это действительно ошибка, но потом посмотрел график внимательней: нет, все правильно. На оси Y указано время, чем оно больше - тем медленнее работает добавление элемента. На графике видно, что добавление миллиона элементов в CArrayObj занимает 5 секунд, тогда как добавление этого же количества элементов в CDictionary занимает 1 секунду. Т.е. конкретно в задачах с большим последовательным добавлением элементов, модель перераспределения памяти у CDictionary выигрывает по сравнению со стандартной моделью перераспределения в CArrayObj, что и требовалось показать.

 
Vasiliy Sokolov:

В начале написал, что это действительно ошибка, но потом посмотрел график внимательней: нет, все правильно. На оси Y указано время, чем оно больше - тем медленнее работает добавление элемента. На графике видно, что добавление миллиона элементов в CArrayObj занимает 5 секунд, тогда как добавление этого же количества элементов в CDictionary занимает 1 секунду. Т.е. конкретно в задачах с большим последовательным добавлением элементов, модель перераспределения памяти у CDictionary выигрывает по сравнению со стандартной моделью перераспределения в CArrayObj, что и требовалось показать.

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

цитата:   Он использует макрос TEST_ARRAY. Если он определен, тест выполняет операции над CArrayObj, если нет - над CDictionary. Первый тест на добавление новых элементов выигрывает CDictionary.Его модель перераспределения памяти в данном конкретном случае оказалась лучше:

ДОЛЖНО БЫТЬ: Он использует макрос TEST_ARRAY. Если он "НЕ" определен, тест выполняет операции над CArrayObj, если "ДА" - над CDictionary. Первый тест на добавление новых элементов выигрывает CDictionary.Его модель перераспределения памяти в данном конкретном случае оказалась лучше:

Вся ошибка непосредственно в коде с начало идет заполнение списка через CDictionary, а потом если не определен макрос TEST_ARRAY идет CArrayObj вот здесь и получилась ошибка . Это от усталости над работой над одним материалом.

НО ОТЛИЧНЫМ И ТРУДОЕМКИМ. МНЕ ОЧЕНЬ ПОМОГ РАЗОБРАТЬСЯ. В УКАЗАТЕЛЯХ И СОЗДАНИЯХ ОБЪЕКТОВ. НУ ОЧЕНЬ ТЯЖЕЛО ВЪЕЗЖАЛ. А НУЖНО ЗА КОРОТКИЙ СРОК......

 

BmC:

МНЕ ОЧЕНЬ ПОМОГ РАЗОБРАТЬСЯ. В УКАЗАТЕЛЯХ И СОЗДАНИЯХ ОБЪЕКТОВ.

В MQL4 и MQL5 нет указателей, есть дескрипторы, это совсем другой компот.
 
Alexey Volchanskiy:
В MQL4 и MQL5 нет указателей, есть дескрипторы, это совсем другой компот.
Alexey Volchanskiy
:

В MQL4 и MQL5 нет указателей, есть дескрипторы, это совсем другой компот.

 Вы хотите сойти за умного или просто набираете себе рейтинг. Если у Вас нет времени прочитать и статью и то что я написал, то прошу Вас так больше не делать, а писать создателям MetaQuotes Software Corp., что у них есть или что должно быть, Но не сюда умным людям. Для таких будущих желающих как вы: www.mql5.com/ru/docs/basis/types/object_pointers. 

У вас наверно рейтинг только на таких глупых высказываниях набран. То тогда чем вы занимаетесь писать чушь 3000 раз. не устали. пройдите по ссылке если вам все ровно делать нечего прочитайте еще раз справку по MQL . Еслт вам так нужен рейтинг на глупых высказываниях то пишите создателям свои ГЛУПЫЕ идеи они там деньги за вас получают. 

Если вы не поняли, что я хотел сказать этим, то для примера Вам сообщаю, что вы еще глупого можете написать создателям: "Прошу Вас разработчиков MetaQuotes переименовать главу про "Указатели объектов" в главу "Дескрипторы объектов""

Дальше вы указываете причину тому: "Так как я на столько глуп и хочу что бы все мое глупое стало правдой и разумным высказыванием спаси меня "создатель".

на месте "создателя", а  бы вам посоветовал достать цветок "цветик семи-цветик". Но вам это не важно вы уже написали аж 3 высказывания. 3093+3=3096. Я вам помог теперь помогите мне не пишите больше здесь.

Я на форуме уже давно и ваши высказывания вижу они как всегда глупы и постоянны. Вы по теме пишите всегда отрывками и всегда поправляете всех, вот такими глупыми высказываниями. Я почему на вас так зол, потому-что, я тоже такой же пользователь начинающий который лезет на форум для пополнения знаний и когда такой "гуру" с 3000 рейтингом, что то пишет ему прислушиваешься. А ОН просто глупец который задался целью набить рейтинг себе. Он даже не задумывается, что своим высказыванием направляет читателя ветки в другую сторону.

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

 

Уже сентябрь, а данного класса в стандартной библиотеке нет :)

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

#define FOREACH_DICT(dict) for(CObject* node = (dict).GetFirstNode(); node != NULL; node = (dict).GetNextNode())
ведь ни где в примерах он даже не используется...
 
Konstantin Karpov:

Уже сентябрь, а данного класса в стандартной библиотеке нет :)

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

ведь ни где в примерах он даже не используется...
Используется. В параграфе 5.3: "Методы для перебора элементов в словаре". Перебор словаря скорее напоминает перебор списка, поэтому операция перебора не совсем стандартная и содержимое for отличается от содержимого при классическом переборе массива. Дабы облегчить себе и пользователям жизнь и не вспоминать мучительно перебор узлов и был введен данный макрос. 
 

Решил применить данный класс в своем советнике как контейнер стратегий вида (StrategyGUID, Strategy), где StrategyGUID - идентификатор типа ulong; Strategy - стратегия, созданная на основе класса с наследованием от CObject.

Соответственно  объявляю необходимые переменные, в т.ч. CDictionary   StrategyBook - книгу активных стратегий; создаю нужные стратегии Strategy01, Strategy02, которые в функции OnInit() советника инициирую различными параметрами, в т.ч. присваивая им уникальные GUID. В самом конце  OnInit() решаю сохранить стратегии в  StrategyBook путем вызова кода

StrategyBook.AddObject(Strategy01.strGUID,Strategy01);

StrategyBook.AddObject(Strategy02.strGUID,Strategy02); 

И тут получаю по обеим строкам ошибку "StrategyХХ - parameter conversion not allowed".

Исходя из моего опыта с C# все сделано правильно. Но на MQL5 вот такая ошибка.

С чем она может быть связана? 

 
Сергей Лебедев:

Решил применить данный класс в своем советнике как контейнер стратегий вида (StrategyGUID, Strategy), где StrategyGUID - идентификатор типа ulong; Strategy - стратегия, созданная на основе класса с наследованием от CObject.

Соответственно  объявляю необходимые переменные, в т.ч. CDictionary   StrategyBook - книгу активных стратегий; создаю нужные стратегии Strategy01, Strategy02, которые в функции OnInit() советника инициирую различными параметрами, в т.ч. присваивая им уникальные GUID. В самом конце  OnInit() решаю сохранить стратегии в  StrategyBook путем вызова кода

StrategyBook.AddObject(Strategy01.strGUID,Strategy01);

StrategyBook.AddObject(Strategy02.strGUID,Strategy02); 

И тут получаю по обеим строкам ошибку "StrategyХХ - parameter conversion not allowed".

Исходя из моего опыта с C# все сделано правильно. Но на MQL5 вот такая ошибка.

С чем она может быть связана? 

Причин может быть несколько. Скорее всего либо несовместимость типов, либо неправильная работа с указателями. Также нельзя исключать особенности работы с шаблонными методами (там тоже свои нюансы).

А вообще лучше воспользоваться готовым торговым движком, много времени и нервом сэкономите: https://www.mql5.com/ru/articles/2166

Универсальный торговый эксперт: Торговые режимы стратегий (Часть 1)
Универсальный торговый эксперт: Торговые режимы стратегий (Часть 1)
  • 2016.01.07
  • Vasiliy Sokolov
  • www.mql5.com
Каждый экспертописатель, независимо от уровня своей подготовки, ежедневно сталкивается с одними и теми же торговыми задачами и алгоритмическими проблемами, которые так или иначе приходится решать для организации надежного торгового процесса. Данная статья описывает возможности торгового движка CStrategy, способного взять на себя решение этих задач и предоставить пользователю удобные механизмы для описания своей торговой идеи.
 

Да, в конечном итоге так и решил сделать.

 
Vasiliy Sokolov:

Причин может быть несколько. Скорее всего либо несовместимость типов, либо неправильная работа с указателями. Также нельзя исключать особенности работы с шаблонными методами (там тоже свои нюансы).

А вообще лучше воспользоваться готовым торговым движком, много времени и нервом сэкономите: https://www.mql5.com/ru/articles/2166

Доброго времени суток! А не подскажете как циклом пройти по всему словарю, удаляя при этом пары по определенному условию, что-то не могу догнать. Вот пример такой задачи.

#include <Dictionary.mqh>

class CInt : public CObject
  {
public:
   int               value;
                     CInt(int _value = 0) : value(_value) {}
  };
  
CDictionary d;
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int OnInit()
  {
   d.FreeMode(true);
   for(int i = 0; i < 10; ++i)
     {
      CInt *int_value = new CInt(i);
      d.AddObject(i, int_value);
     }
   for(CInt *node = d.GetFirstNode(); node != NULL;)
     {
      if(node.value % 2 == 0)
         // d.DeleteCurrentNode() или d.DeleteObjectByKey(node.value);
         
      // Как дальше итерироваться по словарю??? 
     }
     
   return(INIT_SUCCEEDED);
  }
Причина обращения: