Как присвоить в ArrayList объект нормально?

 

Есть массив мэджиков. Я думал, как мне будет удобнее им пользоваться. Решено создать ArrayList в который я помещу эти мэджики. Но, оказалось, что как я обычно пишу в других языках, здесь не работает. Приходится писать на порядок больше, и, соответственно, производительность и читабельности кода будет не та. Поэтому хочется обсудить этот вопрос.

Обычно, любые современные языки могут порождать объекты из примитивов вот так:

String name = new String("objName");    // Для строки
Integer obj = new Integer(5);    // Для целого

Здесь в мкл такого нет. И по этой причине возникает костыль. опишу задачу, которую я бы решил компактно, на Java или C#, а здесь пока что не придумал.

Вот скрипт:

input  ENUM_TIMEFRAMES    i_TF = PERIOD_H1;       // Таймфрейм, на котором торгует совок
input  string             i_symbolsList = "EURUSD, XRPUSD, GBPAUD, EURJPY";    // Символ торгового инструмента
input  ulong              i_magic = 3333021;      // Магик

#import   "ArraysHandling.ex5"
  int    lineToArray(string line, string& arrayToReturn[], string delimiter = ",");
#import   "DataTypeRepresentation.ex5"
  string dToS(const double valueToTransform);
  string iToS(const int valueToTransform);
#import   "MagicListControl.ex5"
   ulong generateMagicNumber(ulong initialMagic, string symbolName, ENUM_TIMEFRAMES TF);
#import

#include  <Arrays\ArrayString.mqh>
#include  <Arrays\List.mqh>
string  symbolNames[];    // Массив торговых инструментов

CList *ptrMagicList;
//+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
//|                                                                                Script program start function                                                                   |
//+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
void OnStart() {
//---
  lineToArray(i_symbolsList, symbolNames, ",");    // Заполняем массив торговых инструментов из input-строки i_symbolsList
  ptrMagicList = new CList;
  for (int i = 0; i < ArraySize(symbolNames); i++) {
    ulong curMagic = generateMagicNumber(i_magic, symbolNames[i], i_TF));
    ptrMagicList.Add(curMagic);
  }  
  delete ptrMagicList;
}

Выделенное жёлтым не возможно реализовать, как я писал выше. Можно было бы сделать типа:

ptrMagicList.Add(new Double(curMagic));

Но в мкл такого комфорта нет. Как поступить?

Стилизатор - Работа с исходным кодом - MetaTrader 5
Стилизатор - Работа с исходным кодом - MetaTrader 5
  • www.metatrader5.com
Данная функция предназначена для оформления исходного кода в соответствии с рекомендуемым стандартом. Это позволяет сделать код более читаемым, выглядящем профессионально. Грамотно оформленный код гораздо проще анализировать в последующем как его автору, так и другим пользователям. Для того чтобы запустить стилизатор, необходимо выполнить...
 
hoz:

Есть массив мэджиков. Я думал, как мне будет удобнее им пользоваться. Решено создать ArrayList в который я помещу эти мэджики. Но, оказалось, что как я обычно пишу в других языках, здесь не работает. Приходится писать на порядок больше, и, соответственно, производительность и читабельности кода будет не та. Поэтому хочется обсудить этот вопрос.

Обычно, любые современные языки могут порождать объекты из примитивов вот так:

Здесь в мкл такого нет. И по этой причине возникает костыль. опишу задачу, которую я бы решил компактно, на Java или C#, а здесь пока что не придумал.

Вот скрипт:

Что мешает использовать CArrayLong ?
Если хотите хранить в списке именно объекты, то вам нужен CArrayObj. Но в этом случае ваш объект должен быть унаследован от CObject
 
Artyom Trishkin:
Что мешает использовать CArrayLong ?
Если хотите хранить в списке именно объекты, то вам нужен CArrayObj. Но в этом случае ваш объект должен быть унаследован от CObject

Я к тому, что для того, что бы передать в ArrayList объект мне нужно создать динамический массив объектов. Логика в чём? Для передачи одного объекта, создаём массив объектов.. Странно как-то.

Тем более, загонять в класс input-значение списка магиков не резон. Представьте себе, есть класс, где пару переменных есть. А смысл какой? Мне это не нужно. Нужно лишь при инициализации распределить по ArrayList'у магики, которые будут потом использоваться уже без пересчётов и всё! Зачем мне их наследовать и как я их унаследую в самом боте? Не в класс.. Никак..
 
А почему не использовать CHashMap? Ведь идеальный класс для такой задачи.
 
hoz:

Я к тому, что для того, что бы передать в ArrayList объект мне нужно создать динамический массив объектов. Логика в чём? Для передачи одного объекта, создаём массив объектов.. Странно как-то.

Тем более, загонять в класс input-значение списка магиков не резон. Представьте себе, есть класс, где пару переменных есть. А смысл какой? Мне это не нужно. Нужно лишь при инициализации распределить по ArrayList'у магики, которые будут потом использоваться уже без пересчётов и всё! Зачем мне их наследовать и как я их унаследую в самом боте? Не в класс.. Никак..

Честно говоря, вообще не понял задачу. От слова "совсем". Много букв, эмоций, и в разные стороны ...

 
Alexey Volchanskiy:
А почему не использовать CHashMap? Ведь идеальный класс для такой задачи.

Зачем? Ведь CHashMap для хранения и доступа к большим объёмам данных, а тут магики всего-лишь... две-три-тридцать три штуки и больше не меняются. Ну это я так понял из потока мыслей выше.

 

Очередной раз hoz пользуется MQL "через одно место", и объявляет, что MQL - это отстой. Поскольку в других языках "так можно"... У меня очередное сомнение в его утверждении, что он имеет большой опыт в "программировании на других языках", его ошибки - типичные ошибки новичка.  Ну и отлично. Поможем новичку.

Лист (СList) - это связный список объектов. Понятное дело, "просто добавить" число туда нельзя - он не предназначен для "просто чисел", их же невозможно связать друг с другом !

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

Насчет CHashMap - согласен Artyom Trishkin - данный класс слишком наворочен для списка магиков. Даже в моей ЛигеТС - только 400 магиков. Городить ради списка хешмэп - это из пушки по воробьям.

 

 
Georgiy Merts:

Очередной раз hoz пользуется MQL "через одно место", и объявляет, что MQL - это отстой. Поскольку в других языках "так можно"... У меня очередное сомнение в его утверждении, что он имеет большой опыт в "программировании на других языках", его ошибки - типичные ошибки новичка.  Ну и отлично. Поможем новичку.

Лист (СList) - это связный список объектов. Понятное дело, "просто добавить" число туда нельзя - он не предназначен для "просто чисел", их же невозможно связать друг с другом !

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

Насчет CHashMap - согласен Artyom Trishkin - данный класс слишком наворочен для списка магиков. Даже в моей ЛигеТС - только 400 магиков. Городить ради списка хешмэп - это из пушки по воробьям.

 

У меня в классе COrderManager Хеш-таблицы используются для хранения не просто магиков, а всей информации о позициях и сделках, при этом ключом является тикет.

 
Artyom Trishkin:

Зачем? Ведь CHashMap для хранения и доступа к большим объёмам данных, а тут магики всего-лишь... две-три-тридцать три штуки и больше не меняются. Ну это я так понял из потока мыслей выше.

А я мало чего понял ))

 
Alexey Volchanskiy:

У меня в классе COrderManager Хеш-таблицы используются для хранения не просто магиков, а всей информации о позициях и сделках, при этом ключом является тикет.

Ну так и сравни свою структуру, и простой список магиков, который наверняка использует hoz.

У меня - класс CTradePosition - использует CObjArray - есть возможность сортировать по любому полю, но она ни разу не потребовалась. Всегда используется только сортировка по тикету.

 
Georgiy Merts:

Ну так и сравни свою структуру, и простой список магиков, который наверняка использует hoz.

У меня - класс CTradePosition - использует CObjArray - есть возможность сортировать по любому полю, но она ни разу не потребовалась. Всегда используется только сортировка по тикету.

И что ты делаешь с дырками, когда Позиция переходит в сделку? Или так ее и оставляешь, только меняя какое-то поле, отвечающее за признак позиция/сделка?