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

 
fxsaber:

А чего конкретнее-то? Контрпример к своей реализации придумать не могете? Пояснить, что такое массивы и структуры?

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

В общем, какое-то невежество. И оно не у новичка, а потому непростительно. Позор ресурсу, если кто-то сторонний приведет эту ветку в виде примера "посмотрите, какой уровень программеров на MQL!".

А как Вы определяете уровень?
По многим вопросам я тоже новичек, но Петр, похоже, воинствующий невежа.
И не только в тесторе или ООП.
К МетаЕдитору у него ваще нет замачаний..
Может юзает его редко?
И где хоть один код в библиотеке? Или в продуктах продукт?
(

 
Реter Konow:
Вы свое решение предоставьте. Иначе это просто пустые слова. Как и прежде.

Вы готовы?

 
Sergey Dzyublik:

Вы готовы?


ЧТД.
 
/+------------------------------------------------------------------+
//|                                                        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;   // Тут как бы не рационально особенно для скорости - в данном случае будет происходить поочередное сложение т.е. сперва стрин увеличиться на один знак и ему выделеиться дополнительно 1 чарт, потом увоичиться на количество символов в (string)order_number.... и каждый раз будет происходить выделение памяти... 
 //---------------------------------
}
//+------------------------------------------------------------------+
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;  // поиск происходит слушающим образом... наш string разбирается на масив чартов и мы начинаем искать среди них номер чарта равный номеру символа  "_" путем перебора, если произошло совпадение то будем сравнивать второй символ... даже банально исключив последний  + "_" скорость возрастет
 //--------------------------------------------
 //Получаем конец строки магика.
 //--------------------------------------------
 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);  // Мы же на скорость проверяем так что давайте исполняемые функции брать в цикл с повтором в 10 000 раз... хотябы лучше с изменяющими входными параметрами
   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));
   
  }
//+------------------------------------------------------------------+
 
Реter Konow:

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

Я такого мрака даже даже в ветке "вопросы новичков" не видел. Ребята, это просто жесть какая-то! Что тут можно комментировать?

з.ы. Не, ну а че вы Get_magic(1) пишите, пишите Get_magic(23999).

 
Mikhail Dovbakh:

А как Вы определяете уровень?
По многим вопросам я тоже новичек, но Петр, похоже, воинствующий невежа.

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

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

Единственная польза - получается один из лучших мотиваторов все же создания на ресурсе Черного списка.

 
Vasiliy Sokolov:

Я такого мрака даже даже в ветке "вопросы новичков" не видел. Ребята, это просто жесть какая-то! Что тут можно комментировать?

з.ы. Не, ну а че вы Get_magic(1) пишите, пишите Get_magic(23999).

Решение работает?

 
Реter Konow:

Решение работает?

Нет, не работает, потому что StringFind может найти номер меджика вместо номера сделки.

 
Vasiliy Sokolov:

Нет, не работает, потому что StringFind может найти номер меджика вместо номера сделки.

StringFind сначала находит номер сделки ("_" + номер сделки + "_").

Потом прибавляем 3 и получаем начало мегика.

Потом  StringFind ищет начало следующей сделки.

Потом вычитает от начала следующей сделки начало мегика.

Потом StringSubstr получает строку мегика.

Далее, преобразуем его в int и возвращаем.


Что здесь не работает?

 
Реter Konow:

Что здесь не работает?


Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

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

Sergey Dzyublik, 2017.12.10 16:10

Реter Konow, ваш уровень знаний "структур данных" - 0.

1. Ваш код не рабочий. 
Неправильный паттерн "_index_magic". Возможное решение "|index_magic"

2. Ваш алгоритм имеет скорость O(n) при этом аж трижды идет проход про string значению All_magics

3. Ваш замер производительности абсолютно некорректный:

- ни среднего результата в серии
- ни серий с поиском последних значений индекса



Вместо написания бреда - пожалуйста изучите хоть что-то по теме, например, https://habrahabr.ru/post/310794/
А далее научитесь применять CArrayList из <Generic\ArrayList.mqh>
Удачи.


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