Алгоритмы, методы решений, сравнение их производительности

 

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

Добро пожаловать всех желающих обсудить задачи и методы их решений ;)

 

Предлагаю решить задачу:

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

      2. Написать вторую функцию, которая будет обращаться к первой функции псевдо-случайное количество раз и передавать ей (сгенерированный) условный "меджик".

      3. Написать третью функцию, которая будет возвращать номер "меджика" по номеру "сделки" (любой порядковый номер), который передает пользователь.


Требования:

  1. Расход памяти на запись "меджиков" должен быть как можно ближе к количеству "меджиков", количество которых заранее неизвестно.
  2. Функции должны работать быстро.

//--------------------------------------------------------

Я думаю обсуждаемая библиотека имеет инструментарий для решения этой задачи.


ЗЫ. Все три функции имитируют работу с ордерами советника, количество которых заранее неизвестно. Следовательно задача укладывается в нашу тематику.

 
Реter Konow:

Предлагаю решить задачу:

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

      2. Написать вторую функцию, которая будет обращаться к первой функции псевдо-случайное количество раз и передавать ей (сгенерированный) условный "меджик".

      3. Написать третью функцию, которая будет возвращать номер "меджика" по номеру "сделки" (любой порядковый номер), который передает пользователь.

Требования:

  1. Расход памяти на запись "меджиков" должен быть как можно ближе к количеству "меджиков", количество которых заранее неизвестно.
  2. Функции должны работать быстро.

Я думаю обсуждаемая библиотека имеет инструментарий для решения этой задачи.

ЗЫ. Все три функции имитируют работу с ордерами советника, количество которых заранее неизвестно. Следовательно задача укладывается в нашу тематику.

Пётр, я считаю, любая функция должна нести собой какую-то пользу. Я не совсем понимаю, какой положительный эффект приносит любая из этих трёх функций ? 

 
Victor Ziborov:

Пётр, я считаю, любая функция должна нести собой какую-то пользу. Я не совсем понимаю, какой положительный эффект приносит любая из этих трёх функций ? 

Это ответвление темы   https://www.mql5.com/ru/forum/221917

Здесь мы на практике проверяем эффективность решений предложенных библиотекой.

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

Решение этой задачи также есть и в новой библиотеке Generic.

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

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


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

Я попробую решить эту задачу по своему.

Потом сравним производительность.

Библиотека Generic классов - ошибки, описание, вопросы, особенности использования и предложения
Библиотека Generic классов - ошибки, описание, вопросы, особенности использования и предложения
  • 2017.12.07
  • www.mql5.com
С 6 декабря 2017 года в стандартную поставку MetaTrader 5 стали входить так называемые Generic-классы, реализующие эффективные алгоритмы для хранен...
 

Реter Konow, если вы что-то организовываете, то, пожалуйста, делайте это на достойном уровне, а не спонтанно и на от.....станьте.

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

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

1) Зачем выделять жирным не несущий смысловой нагрузки текст?
2) Взятие указателя это уже "обращение" к функции или еще нет? Функцию вызывают.
3) Термин "записать число" обычно применяется при работе с файлами. Это неточность и речь идет про работу с данными в памяти или все-таки требуется сохранение данных между запусками программы?
4) При желании, псевдо-случайное число может быть отрицательным, а magic - нет. Так что у нас: magic или псевдо-случайное в определенном диапазоне? Каком?

 
Sergey Dzyublik:

Реter Konow, если вы что-то организовываете, то, пожалуйста, делайте это на достойном уровне, а не спонтанно и на от.....станьте.

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

1) Зачем выделять жирным не несущий смысловой нагрузки текст?
2) Взятие указателя это уже "обращение" к функции или еще нет? Функцию вызывают.
3) Термин "записать число" обычно применяется при работе с файлами. Это неточность и речь идет про работу с данными в памяти или все-таки требуется сохранение данных между запусками программы?
4) При желании, псевдо-случайное число может быть отрицательным, а magic - нет. Так что у нас: magic или псевдо-случайное в определенном диапазоне? Каком?

Основная задача:

Реализовать быстрый доступ к конкретному магику через номер сделки.

Необходимо записывать магики в "словарь" и получать к ним доступ через номер сделки.

Заранее, количество ордеров неизвестно, следовательно - неизвестен размер словаря.

Однако, доступ должен быть быстрым и количество выделенной памяти - примелемым.

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

Вы можете решить задачу любым удобным вам способом.

 Конкретный номер магика не имеет значения. Может быть любым числом. Это всего лишь имитация.


Добавлено:

Выше поправил "Реализовать быстрый доступ к конкретному магику через номер сделки. " .

 

Если у нас добавляются три magic с номерами: 10, 11, 12
Тогда какие у них номера сделок? 0, 1, 2?

 
Sergey Dzyublik:

Если у нас добавляются три magic с номерами: 10, 11, 12
Тогда какие у них номера сделок? 0, 1, 2?

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

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

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

Вот практическое доказательство:

//+------------------------------------------------------------------+
//|                                                        Magic.mq5 |
//|                                                      Peter Konow |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Peter Konow"
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
//+------------------------------------------------------------------+
string All_magics;
int    order_number;
int    Random_orders_of_strategy;
//+------------------------------------------------------------------+
void Save_magic(int magic)
{
 order_number++;
 //---------------------------------
 //Записываем каждый магик вместе с порядковым номером ордера.
 //---------------------------------
 All_magics +=  "_" + (string)order_number + "_" + (string)magic;
 //---------------------------------
}
//+------------------------------------------------------------------+
void Trading()
{
 Random_orders_of_strategy = MathRand();
 
 //----------------------------------------
 //Имитируем открытие неопределенного количества ордеров стратегии.
 //----------------------------------------
 for(int a1 =  0; a1 < Random_orders_of_strategy; a1++)
   {
    int this_magic = MathRand();
    //----------------------------
    Save_magic(this_magic);
    //----------------------------
   }
 //----------------------------------------
}
//+------------------------------------------------------------------+
int Get_magic(int deal_number)
{
 //--------------------------------------------
 //Получаем начало строки магика.
 //--------------------------------------------
 int Magic_position_start =  StringFind(All_magics,"_" + (string)deal_number + "_",0) + 3;
 //--------------------------------------------
 //Получаем конец строки магика.
 //--------------------------------------------
 int Magic_position_end   =  StringFind(All_magics,"_" + (string)(deal_number + 1) + "_",0);
 //--------------------------------------------
 //Получаем количество цифр из которых состоит магик.
 //--------------------------------------------
 int Magic_lenght         =  Magic_position_end - Magic_position_start;
 //--------------------------------------------
 //Извлекаем магик из общей строки.
 //--------------------------------------------
 string Magic             =  StringSubstr(All_magics,Magic_position_start,Magic_lenght);
 //--------------------------------------------
 //Возвращаем цифровое значение магика.
 //--------------------------------------------
 return((int)Magic);
}
//+------------------------------------------------------------------+


//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
   Trading();
   //--------------------------
   ulong t1 = GetMicrosecondCount();
   Get_magic(1);
   ulong t2 = GetMicrosecondCount();
   //--------------------------
   Print("Время исполнения функции Get_magic() при количестве ордеров ",Random_orders_of_strategy," равно ",t2 - t1);
   //--------------------------
   Print("Random_orders_of_strategy  ",Random_orders_of_strategy);
   Print("magic 1:  ",Get_magic(1),"  magic 2: ",Get_magic(2),"  magic 3: ",Get_magic(3));
   
  }
//+------------------------------------------------------------------+


Может кому то мое решение пригодится...

(Код находит нужный магик из более чем 24 000 магиков за 15 микросекунд!)

(Также не расходуется ни байта лишней памяти.)

Если кто то может сделать быстрее - прошу.
 
Sergey Dzyublik:

Если у нас добавляются три magic с номерами: 10, 11, 12
Тогда какие у них номера сделок? 0, 1, 2?

Нет. Номера сделок должны начинатся с единицы.
 

Такой интересный вопрос по теме:

Например стоит мультивалютный советник в котором следующий лот следующего ордера базируется на результатах уже открытых по разным парам


условие открытия ордера - если есть сигнал на открытие, суммарный лот не более 0.1 и суммарная просадка не более 101% от депо

вариант первый: забить в массив все данные и извлекать их по мере поступления запроса на открытие следующего (не будем же каждый тик открывать новые ордера)


вариант второй - каждый раз проверять при запросе открытия следующего ордера все имеющиеся на текущее время по всем парам



какое решение будет быстрее и менее затратное

 

Жесть )