• В разделе форекс имеются хорошие бесплатные торговые роботы для МТ4 терминала. Если вы готовы поддержать ресурс финансово ,то есть возможность приобрести любой робот в исходном коде.

Учимся программировать

coder-ex

Пользователь
Кто проводил тесты в разных компиляторах на предмет скорости обработки условий и ветвлений? Интересуют следующие компиляторы для C++:
1. VC
2. GCC (gcc, ningw, cygwin)
3. mql5 (все же этот компилятор собирает синтаксис С++)
Вопрос возник т.к. для себя еще не выбрал, что оптимальнее и лучше использовать if else или switch в местах, где есть вариант использовать и то и другое. А то постоянно в ступор вхожу когда такие моменты наступают ))
В одних источниках читал, что switch вроде как оптимальнее компилируется, в других, что когда смотришь в ассемблере код, то там это раскладывается одинаково )) Как говорят - где правда брат ...
 

Константин

Администратор
Вопрос по теме обучения программирования :)

Как исправить ошибку выхода за пределы массива

PHP:
bool CreateTwoArrays(MqlBookInfo &glassArray[])
{
   int size=ArraySize(glassArray);
   int NBuysStart=0;
   int a;
   for(int i=0;i<size;i++)                //определим покупки и продажи
   {
     if (glassArray[i].type == BOOK_TYPE_BUY && i>0)
     {
        NBuysStart = i;
        break;
     }
   if(i==size-1)return 0;
   }
  
   for(int i=0;i<NBuysStart;i++)                //создаем массив оферов в стакане
   {
      Offers[i]=glassArray[NBuysStart-1-i];
      a=0;
   }
   for(int i=0;i<size-NBuysStart;i++)           //создаем массив бидов в стакане
   {
      Bids[i]=glassArray[NBuysStart+i];
      a=0;
   }
   return 1;
}
Новый билд терминала стал рукаться на строки с переменной
int NBuysStart=0;
До этого все работало без каких либо ошибок.
 

coder-ex

Пользователь
Вопрос по теме обучения программирования :)

Как исправить ошибку выхода за пределы массива

PHP:
bool CreateTwoArrays(MqlBookInfo &glassArray[])
{
   int size=ArraySize(glassArray);
   int NBuysStart=0;
   int a;
   for(int i=0;i<size;i++)                //определим покупки и продажи
   {
     if (glassArray[i].type == BOOK_TYPE_BUY && i>0)
     {
        NBuysStart = i;
        break;
     }
   if(i==size-1)return 0;
   }

   for(int i=0;i<NBuysStart;i++)                //создаем массив оферов в стакане
   {
      Offers[i]=glassArray[NBuysStart-1-i];
      a=0;
   }
   for(int i=0;i<size-NBuysStart;i++)           //создаем массив бидов в стакане
   {
      Bids[i]=glassArray[NBuysStart+i];
      a=0;
   }
   return 1;
}
Новый билд терминала стал рукаться на строки с переменной
int NBuysStart=0;
До этого все работало без каких либо ошибок.
думаю проблема тут
PHP:
Offers[i]=glassArray[NBuysStart-1-i];
и не могу понять предназначение этого
PHP:
if(i==size-1)return 0;
 

Константин

Администратор
и не могу понять предназначение этого
Сам не понимаю что хотел сказать этой строкой программист который создал эту функцию
А так же не понятно
a=0;
зачем ее обнулять, если она и так объявлена нулем.
 

coder-ex

Пользователь
Сам не понимаю что хотел сказать этой строкой программист который создал эту функцию
А так же не понятно
a=0;
зачем ее обнулять, если она и так объявлена нулем.
она объявлена, но не проинициализирована )) там может быть мусор в процессе исполнения кода, но суть не в этом, это я так понимаю стоп для пошаговой отладки, что бы смотреть что происходит в предыдущей строке, я так же иногда делаю, только на месте объявляю переменную, к примеру тут:
PHP:
   for(int i=0;i<size-NBuysStart;i++)           //создаем массив бидов в стакане
   {
      Bids[i]=glassArray[NBuysStart+i];
      a=0;
   }
если не делать остановку, то не будешь знать, что присваивается в элемент массива Bids
 

coder-ex

Пользователь
В один проект потребовалось сохранять большой объем промежуточных данных, но столкнулся с тем, что даже сбрасывая данные в бинарный файл, сами файлы имели большой размер. В итоге пришел к выводу, что данные нужно сжимать перед сбросом в файл и желательно средствами MQL5, что и было сделано и теперь все данные жмутся в режиме реального времени - "на лету" прямо в памяти. Вчера провел тесты и получил следующие результаты:
photo_2017-12-08_00-44-48.jpg
1. .bin - данные записаны сбросом в бинарный формат по очереди данных из объектов структур и классов
2. .dat - данные сперва сконвертированы в BYTE массив и потом сброшены на диск как бинарные данные
3. .zip - способ 2 + программное сжатие
а это время прохода всех этапов:
photo_2017-12-08_00-44-48_1.jpg
после каждого этапа считывания данных с диска, делается проверка с исходными данными на корректность, ошибок не выявлено. Теперь вместо гигабайтов занимаемого на диске места, этот объем сократится до нескольких мегабайт ))
прим. каждый файл, это минутные кластера за месяц по одному тикеру, представьте какой объем будет по каждому тикеру, если историю увеличить хотя бы на квартал и добавить не только минутные кластера, а еще и другие используемые временные периоды ))
 

coder-ex

Пользователь
Ищу напарника-программиста в совместные проекты со знанием MQL5 и(или) С++. Весь код писать будем только для себя и продажи не будут стоять в приоритете.
 

coder-ex

Пользователь
может кому пригодится ))
в MQL5 нет указателей на массивы и вернуть массивы из методов / функций нельзя кроме как через входные параметры сигнатуры, что не привычно и не всегда удобно тем кто пишет код на Python, C++, C#, Java, где вернуть через возвращаемое значение можно все что угодно - указатель на массив, кортеж и т.д., решил писать врапперы на массивы, которые по указателю можно возвращать как указатели на массивы, ну и обращение к элементам массива через враппер происходит так же как в самом массиве за исключением того, что нужно будет четко следить за разделением типа индекса ( int / unsigned int ), а сам массив будет скрыт от прямого обращения к нему
C++:
/*!
   \brief   враппер - указательна массив COrdPos
   \details объекты в массиве враппера хранятся в виде указателей на объекты
   \details объекты в массиве враппера являются указателями на объекты созданные в другом месте
   \details при уничтожении объекта враппера, данные массива не уничтожаются, а зануляются их указатели
   \details объекты массива враппера уничтожаются в месте их создания
*/
class WrapOP
  {
private:
   int   index;
   int   total;
   COrdPos*  array[];

   void Clear(void) {
      for(int i = 0, _size = ArraySize(this.array); i < _size; ++i)
         delete this.array[i];
   }
  
public:
   WrapOP(void) : total(0) { }
  ~WrapOP(void) {
      for(int i = 0; i < this.total; ++i)
         this.array[i] = NULL;

      ArrayFree(this.array);
   }
   WrapOP(const WrapOP &other) {
      this.Clear();
      this.Resize(other.Size());

      for(int i = 0; i < this.total; ++i)
         this[i] = other[i];

   }
   void operator=(const WrapOP &other) {
      this.Clear();
      this.Resize(other.Size());
      
      for(int i = 0; i < this.total; ++i)
         this[i] = other[i];

   }
   WrapOP* operator[](const int idx) {
      this.index = idx;
      return &this;
   }
   void operator=(COrdPos &value) {
      this.array[this.index] = &value;
   }
   COrdPos* operator[](const uint idx) const {
      return this.array[idx];
   }
   WrapOP* Get(void) { return &this; }
   int Size(void) const { return this.total; }
   void Resize(const int size,const int reserve=100) { this.total = ArrayResize(array, size, reserve); }
  };
можно конечно шаблонный класс забабахать но при отладке будут трудности, да и ME начнет "тупить"
если необходимо объекты в массив складывать не по указателю а по значению, то в объекте делайте перегрузку operator= и создавайте конструктор копирования, а в самом враппере измените перегрузку operator[] возвращая не указатель, а значение на объект
 
Сверху