Сортировка по кастомному условию - страница 2

 
TheXpert:

Без обид, но это не твоя весовая категория.

А почему SetMode? Обычно определяют что-то типа оператора "меньше". С возвращаемым булевским значением, чтобы можно было сравнивать не только простые типы. Не у любого объекта есть перегруженный оператор "-". Ну и на работу с массивом объектов тоже проверить бы.

Вобщем похоже на годно, но требует доработки.

Проше всего ответить примером на массиве объектов (структуры и классы). Доработка не понадобилась:

#property strict

#include <Sort.mqh>

struct STRUCT
{
  double Equity;
  int Subscribers;

  STRUCT( void )
  {
    Equity = MathRand();
    Subscribers = MathRand();
  }
};

void PrintArray( const STRUCT &Array[], string Str = "" )
{
  const int Size = ArraySize(Array);

  for (int i = 0; i < Size; i++)
    Str = Str + " [" + (string)Array[i].Equity + ", " + (string)Array[i].Subscribers + "]";

  Print(Str);

  return;
}

class CompareByEquity : public COMPARE
{
public:
  double Compare( const STRUCT &First, const STRUCT &Second ) const
  {
    return(SetMode(First.Equity - Second.Equity));
  }
};

class CompareBySubscribers : public COMPARE
{
public:
  double Compare( const STRUCT &First, const STRUCT &Second ) const
  {
    return(SetMode(First.Subscribers - Second.Subscribers));
  }

  CompareBySubscribers( const int iMode = MODE_ASCEND ) : COMPARE(iMode)
  {
  }
};


void OnStart( void )
{
  STRUCT Array[5];

  PrintArray(Array, "Not Sorted:");

  SORT::Sort(Array, new CompareByEquity);
  PrintArray(Array, "By Equity (ASCEND):");

  SORT::Sort(Array, new CompareBySubscribers(MODE_DESCEND));
  PrintArray(Array, "By Subscribers (DESCEND):");

  return;
}
 
TheXpert:

ок, пусть буду негоден в данном вопросе, вам виднее - мне однаково, хотя и обидно немного))


(да, удаление динамически созданного объекта не увидел - извините).

 
Ну да, с компиляцией все ок. Только функция SetMode выглядит вырвиглаз. Не надо функтору который отвечает за сравнение вообще знать -- по убыванию сортировка или нет. Это свойство сортировки а не компаратора.
 
TheXpert:
Ну да, с компиляцией все ок. Только функция SetMode выглядит вырвиглаз. Не надо функтору который отвечает за сравнение вообще знать -- по убыванию сортировка или нет. Это свойство сортировки а не компаратора.

Не знаю, мне удобно именно так. Иначе бы надо было плодить доп. вход параметр в функцию сортировки, саму ее усложнять. А так изящно даже получилось. И по скорости почти оптимально.

Изначально думалось гораздо красивее сделать. Но, как оказалось, шаблоны в MQL4++ довольно сильно ограничены. Поэтому облом.


Если кратко о сделанном: вся фишка в вызове оператора new во входных параметрах. Обойти этот вызов (чтобы не создавать заранее фейковый указатель) не сумел - новичек.

 
lob32371:

А так изящно даже получилось. И по скорости почти оптимально.

Я бы не сказал что это изящно :)
 
TheXpert:
Я бы не сказал что это изящно :)
К сожалению, на сейчас это вообще единственный MQL-вариант. Альтернатив не видел. Сам пытался с разных сторон зайти и везде натыкался на ограничения MQL4++. Думаю, лучше варианта не найти. Отличается от C++ только тремя доп. строчками. Остальное по логике фактически идентично. И, вообще, пора меня хвалить! ))
 
По-моему проще в dll писать. Лично мне, не удалось бы скомпилировать свою писанину в mql в принципе (много шаблонной магии). Также непонятно - зачем надо было изобретать mql? Можно реализовать динамическую загрузку пользовательских dll, где есть спец функции (OnStart, ...) и происходит инициализация необходимого окружения. Далее терминал дёргает эти спец функции.
 

Pavlick:
 По-моему проще в dll писать.

По-моему, проще писать робота на полноценных языках программирования в едином своем торговом интерфейсе. И делать прокладки между торговым API платформы и вашим собственным. Например, написать единоразово на чистом MQL отправка/прием торгового окружения/приказов в файл. И на этом полностью забыть про MQL. А свой робот на любом языке принимал бы из файла единого формата торговое окружение и писал туда торговые приказы.

 

Тогда захотел поторговать не на MQL-платформе, написал опять же единоразово прокладку-файл. И все. Свой робот даже менять не придется. Вот это, действительно, проще. А писать на MQL+DLL - извращение. Нельзя что-то полусделать.

Также непонятно - зачем надо было изобретать mql?
Ну это вы просто не подумали, написав. Без своего языка огромное количество сервисов было бы просто недоступно или развивалось с горем пополам. Без своего языка невозможно сейчас завоевать массовый рынок.
 
lob32371:

По-моему, проще писать робота на полноценных языках программирования в едином своем торговом интерфейсе. И делать прокладки между торговым API платформы и вашим собственным. Например, написать единоразово на чистом MQL отправка/прием торгового окружения/приказов в файл. И на этом полностью забыть про MQL. А свой робот на любом языке принимал бы из файла единого формата торговое окружение и писал туда торговые приказы.

В целом, об одно и том же говорим.

lob32371:
 Ну это вы просто не подумали, написав. Без своего языка огромное количество сервисов было бы просто недоступно или развивалось с горем пополам. Без своего языка невозможно сейчас завоевать массовый рынок.

Маркет что ли? Не для трейдеров это, шелуха околорыночная.

 
Pavlick:

Маркет что ли? Не для трейдеров это, шелуха околорыночная.

Маркет, Облако и VPS. Остальное даже упоминать не буду, чтобы не сводить тему в оффтоп.

Шелуха околорыночная - это и есть массовый пользователь. А вы ну никак не вписываетесь в три сигма. Шибко умный вы на фоне дегенератовмассы, к сожалению. А раз такой умный, почему до сих пор мучаетесь с MQL?

Мне лично MQL4++ куда ближе C++, C# и Java. Запустил MetaEditor и с голого листа сразу написал код (а пишу только примитив), что захотел. На C++, C# и Java пока так не получается - тяжело мне там очень. И только по острой необходимости использую их, когда надо робота писать под соответствующее API или тестер простейший.

 

Поэтому так до сих пор и не создал нормальный единый торговый интерфейс для своих роботов на классическом языке программирования. Все недоделки использую.

Причина обращения: