Предлагаю решить задачу:
- Написать функцию, которая на каждом обращении будет принимать и записывать некоторое псевдо-случайное число, которое будет условным "меджиком".
2. Написать вторую функцию, которая будет обращаться к первой функции псевдо-случайное количество раз и передавать ей (сгенерированный) условный "меджик".
3. Написать третью функцию, которая будет возвращать номер "меджика" по номеру "сделки" (любой порядковый номер), который передает пользователь.
Требования:
- Расход памяти на запись "меджиков" должен быть как можно ближе к количеству "меджиков", количество которых заранее неизвестно.
- Функции должны работать быстро.
//--------------------------------------------------------
Я думаю обсуждаемая библиотека имеет инструментарий для решения этой задачи.
ЗЫ. Все три функции имитируют работу с ордерами советника, количество которых заранее неизвестно. Следовательно задача укладывается в нашу тематику.
Предлагаю решить задачу:
- Написать функцию, которая на каждом обращении будет принимать и записывать некоторое псевдо-случайное число, которое будет условным "меджиком".
2. Написать вторую функцию, которая будет обращаться к первой функции псевдо-случайное количество раз и передавать ей (сгенерированный) условный "меджик".
3. Написать третью функцию, которая будет возвращать номер "меджика" по номеру "сделки" (любой порядковый номер), который передает пользователь.
Требования:
- Расход памяти на запись "меджиков" должен быть как можно ближе к количеству "меджиков", количество которых заранее неизвестно.
- Функции должны работать быстро.
Я думаю обсуждаемая библиотека имеет инструментарий для решения этой задачи.
ЗЫ. Все три функции имитируют работу с ордерами советника, количество которых заранее неизвестно. Следовательно задача укладывается в нашу тематику.
Пётр, я считаю, любая функция должна нести собой какую-то пользу. Я не совсем понимаю, какой положительный эффект приносит любая из этих трёх функций ?
Пётр, я считаю, любая функция должна нести собой какую-то пользу. Я не совсем понимаю, какой положительный эффект приносит любая из этих трёх функций ?
Это ответвление темы https://www.mql5.com/ru/forum/221917
Здесь мы на практике проверяем эффективность решений предложенных библиотекой.
В той ветке было высказано мнение, что решение записи меджиков ордеров в строку для последующего помещения их в массив является неэффективным.
Решение этой задачи также есть и в новой библиотеке Generic.
Интересно подтвердить или опровергнуть заявление, что запись в строку является неэффективным решением.
Думаю будет полезно и интересно узнать, что покажет практика.
Все кто хочет, могут попробывать решить эту задачу с помощью инструментария библиотеки.
Я попробую решить эту задачу по своему.
Потом сравним производительность.
![Библиотека Generic классов - ошибки, описание, вопросы, особенности использования и предложения Библиотека Generic классов - ошибки, описание, вопросы, особенности использования и предложения](/i/community/logo_mql5_small.png)
- 2017.12.07
- www.mql5.com
Реter Konow, если вы что-то организовываете, то, пожалуйста, делайте это на достойном уровне, а не спонтанно и на от.....станьте.
Условия должны быть понятны, однозначны и с конкретными примерами....
Вот список вопросов возникший при внимательном чтении всего первого пунка.
- Написать функцию, которая на каждом обращении будет принимать и записывать некоторое псевдо-случайное число, которое будет условным "меджиком".
1) Зачем выделять жирным не несущий смысловой нагрузки текст?
2) Взятие указателя это уже "обращение" к функции или еще нет? Функцию вызывают.
3) Термин "записать число" обычно применяется при работе с файлами. Это неточность и речь идет про работу с данными в памяти или все-таки требуется сохранение данных между запусками программы?
4) При желании, псевдо-случайное число может быть отрицательным, а magic - нет. Так что у нас: magic или псевдо-случайное в определенном диапазоне? Каком?
Реter Konow, если вы что-то организовываете, то, пожалуйста, делайте это на достойном уровне, а не спонтанно и на от.....станьте.
Условия должны быть понятны, однозначны и с конкретными примерами....
Вот список вопросов возникший при внимательном чтении всего первого пунка.
1) Зачем выделять жирным не несущий смысловой нагрузки текст?
2) Взятие указателя это уже "обращение" к функции или еще нет? Функцию вызывают.
3) Термин "записать число" обычно применяется при работе с файлами. Это неточность и речь идет про работу с данными в памяти или все-таки требуется сохранение данных между запусками программы?
4) При желании, псевдо-случайное число может быть отрицательным, а magic - нет. Так что у нас: magic или псевдо-случайное в определенном диапазоне? Каком?
Основная задача:
Реализовать быстрый доступ к конкретному магику через номер сделки.
Необходимо записывать магики в "словарь" и получать к ним доступ через номер сделки.
Заранее, количество ордеров неизвестно, следовательно - неизвестен размер словаря.
Однако, доступ должен быть быстрым и количество выделенной памяти - примелемым.
Предложенная мною задача направлена имитацию работы советника, который выставляет ордера, а потом получает их магики по номеру сделки, для дальнейшей работы с ними.
Вы можете решить задачу любым удобным вам способом.
Конкретный номер магика не имеет значения. Может быть любым числом. Это всего лишь имитация.
Добавлено:
Выше поправил "Реализовать быстрый доступ к конкретному магику через номер сделки. " .
Если у нас добавляются три magic с номерами: 10, 11, 12
Тогда какие у них номера сделок? 0, 1, 2?
Если у нас добавляются три 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 микросекунд!)
(Также не расходуется ни байта лишней памяти.)
Если у нас добавляются три magic с номерами: 10, 11, 12
Тогда какие у них номера сделок? 0, 1, 2?
Такой интересный вопрос по теме:
Например стоит мультивалютный советник в котором следующий лот следующего ордера базируется на результатах уже открытых по разным парам
условие открытия ордера - если есть сигнал на открытие, суммарный лот не более 0.1 и суммарная просадка не более 101% от депо
вариант первый: забить в массив все данные и извлекать их по мере поступления запроса на открытие следующего (не будем же каждый тик открывать новые ордера)
вариант второй - каждый раз проверять при запросе открытия следующего ордера все имеющиеся на текущее время по всем парам
какое решение будет быстрее и менее затратное
Жесть )
![MQL5 - Язык торговых стратегий для клиентского терминала MetaTrader 5](https://c.mql5.com/i/registerlandings/logo-2.png)
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
В данной ветке будем обсуждать разные способы решения тех, или иных задач, сравнивать производительность предложенных решений.
Добро пожаловать всех желающих обсудить задачи и методы их решений ;)