Самообучение языку MQL5 с полного нуля - страница 86

 
Valeriy Yastremskiy #:

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

А так, конечно динамический массив правильней, но громоздко для меня, ресайз, сайз, ресайз)))

В общем неправильно делаю, где можно объявляю стат массив размера побольше, и иницилизирую нулем перед записью от мусора, а гоняю цикл на заведомо меньшем размере.

В общем с массивами вы не дружите, а зря.

Есть такая примочка как копирование массива «сам в себя»…

Допустим имеем массив из 3 элементов и при появлении нужного значения надо нулевой удалить, а новый записать в последний индекс.

/********************Script program start function*******************/
void OnStart()
 {
  double open[3];
  CopyOpen(_Symbol, PERIOD_D1, 1, 3, open);
  ArrayPrint(open);
  ArrayCopy(open, open, 0, 1);
  open[2] = iOpen(_Symbol, PERIOD_D1, 0);
  ArrayPrint(open);
  DebugBreak();
 }/******************************************************************/

результат

2023.09.06 15:51:29.671 !!0 (GBPUSD,H1) 1.26728 1.25900 1.26208
2023.09.06 15:51:29.671 !!0 (GBPUSD,H1) 1.25900 1.26208 1.25623
 
Alexey Viktorov #:

В общем с массивами вы не дружите, а зря.

Есть такая примочка как копирование массива «сам в себя»…

Допустим имеем массив из 3 элементов и при появлении нужного значения надо нулевой удалить, а новый записать в последний индекс.

результат

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

Спасибо за пример)))
 
Valeriy Yastremskiy #:

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

Спасибо за пример)))

Думаю не цикл. Мне кажется, там всё на области памяти построено.

 
Да цикл, цикл там, только не такой же. 
 

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

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

Горячие клавиши в окне редактирования кода

Горячие клавиши

Описание

Ctrl + Z

Отменить последнее действие.

Ctrl + Y

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

Ctrl + X

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

Ctrl + C

Скопировать выделенный фрагмент в буфер обмена.

Ctrl + V

Вставить вырезанный или скопированный фрагмент в текущем положении курсора.

Delete

Удалить выделенный фрагмент.

Ctrl + A

Выделить весь текст редактируемого файла.

Ctrl + F

Вызвать окно поиска.

F3

Найти следующий элемент по текущему поисковому запросу.

Shift + F3

Найти предыдущий элемент по текущему поисковому запросу.

Ctrl + H

Вызвать окно поиска с заменой.

Ctrl + F2

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

F2

Перейти к следующей закладке.

Shift + F2

Перейти к предыдущей закладке.

Ctrl + Shift + F2

Убрать все закладки из текущего файла.

Ctrl + Space

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

Ctrl + Shift + Space

Показать сигнатуру текущей функции: порядок и типы параметров, задаваемых в функции, а также подсветка текущего редактируемого параметра.

F8

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

Shift + F8

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

Alt + G

Перейти к объявлению или определению текущей выбранной функции или переменной.

Alt + M

Открыть список всех функций, объявленных в коде текущей программы.

Ctrl + '

Вставить комментарии "//" в начале каждой выделенной строки.

Ctrl + ;

Убрать комментарии "//" из начала каждой выделенной строки.

Ctrl + /

Вставить в указанную позицию символы однострочного комментария.

Ctrl + .

Вставить в указанную позицию заготовку для комментария к функции.

Ctrl + ,

Запустить стилизатор для оформления кода текущего редактируемого файла.

Ctrl + цифра 0-9

Установить именованную закладку.

Alt + цифра 0-9

Перейти к именованной закладке.

Ctrl + - или

Alt + Стрелка влево

Перейти к предыдущей строке, в которой находился курсор. Переход возможен только в пределах открытых в данный момент файлов.

Ctrl + Shift + - или

Alt + Стрелка вправо

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

Tab

Вставить три пробела (символ табуляции) перед выделенными строками.

Tab + Shift

Убрать три пробела (символ табуляции) перед выделенными строками.

Ctrl + Shift + U

Перевести буквы выделенной фразы в верхний регистр.

Ctrl + U

Перевести буквы выделенной фразы в нижний регистр.

Ctrl + Tab

Переключиться на предыдущее открытое окно редактирования кода.

Ctrl + Shift + Tab

Переключиться на следующее открытое окно редактирования кода.


Горячие клавиши д
ля отладки

Горячие клавиши

Описание

F5

Начать отладку текущей выбранной программы.

Break

Временно прервать отладку.

Shift + F5

Прекратить процесс отладки.

F11

Шаг с заходом: пройти один шаг выполнения программы с заходом в вызываемые функции.

F10

Шаг с обходом: пройти один шаг выполнения программы без захода в вызываемые функции.

Shift + F11

Шаг наружу: переход к выполнению одного шага программы на один уровень выше по стеку вызовов.

F9

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

Shift + F9

Добавить выделенное в коде программы выражение в наблюдение.


Общие действия в MetaEditor

Горячие клавиши

Описание

Ctrl + N

Открыть окно "Мастер MQL4/MQL5".

Ctrl + O

Открыть файл.

Ctrl + S

Сохранить изменения в текущем редактируемом файле.

Ctrl + F4

Закрыть текущий редактируемый файл.

F7

Компилировать текущий редактируемый файл.

Ctrl + F7

Компилировать все файлы, открытые в данный момент на редактирование.

Ctrl + Break

Отменить компиляцию.

Ctrl + P

Открыть окно печати текущего файла.

Ctrl + Shift + F

Открыть окно поиска в файлах.

Ctrl + D

Скрыть или показать окно "Навигатор".

Ctrl + T

Скрыть или показать окно "Инструменты".

F4

Переключиться к торговой платформе.

F1

Вызвать справку по MetaEditor.

Ctrl + F1

Поиск по сайту MQL4.community/MQL5.community.

F12

Включить/выключить полноэкранный режим.


Горячие клавиши в
окне "Навигатор"

Горячие клавиши

Описание

Enter

Открыть выбранный файл.

Insert

Создать папку в текущей выбранной.

F2

Переименовать выбранный файл или папку.

Delete

Удалить выбранный файл или папку.

F5

Обновить окно "Навигатор".


Горячие клавиши в окне "Инструменты"

Горячие клавиши

Описание

Enter

Перейти к строке, найденной ошибке или элементу поиска по файлам, просмотреть выбранную статью или MQL4/MQL5-программу.

Ctrl + C

Скопировать строку ошибки в буфер обмена.

F2

Редактировать название наблюдаемого выражения на вкладке "Отладка" в разделе наблюдений.

Insert

Добавить новое выражение на вкладке "Отладка" в разделе наблюдений.

Delete

Удалить выделенное выражение на вкладке "Отладка" в разделе наблюдений.

D

Загрузить выбранную MQL4/MQL5-программу из библиотеки.

R

Включить или выключить отображение категорий статей.

G

Включить или выключить сетку, разделяющую поля.

A

Включить или выключить автоматический выбор размера столбцов.

S

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


С уважением, Владимир.

 
Alexey Viktorov #:
Допустим имеем массив из 3 элементов и при появлении нужного значения надо нулевой удалить, а новый записать в последний индекс.

В таком случае, особенно, если массив подлиннее, применяю кольцевой буфер.

 
JRandomTrader #:

В таком случае, особенно, если массив подлиннее, применяю кольцевой буфер.

Я же не говорил, что это единственный или самый правильный вариант… Кому-то нравится поэлементно переносить значения индексов массива Х-тысяч элементов…

 
JRandomTrader #:

В таком случае, особенно, если массив подлиннее, применяю кольцевой буфер.

можно код? или алгоритм?

 
Valeriy Yastremskiy #:

можно код? или алгоритм?

Основная идея - https://ru.wikipedia.org/wiki/Кольцевой_буфер , имеем массив и указатели (индексы) на голову и хвост (или только один - например, если используем для вычисления среднего, добавляя новый элемент на место самого старого, вот как в этом примере:)

class pack(8) cAvrBase
  {
private:
   double   Sum;
   int      Head;
   void     InitSum(double NewVal);
   int      Per;
   double   A[];

protected:
   void     Init(const int AvrPer=30, const double InitVal=1.0);
   double   GetAvr(){return Sum/Per;};
   double   GetLast(){return A[Head];};
   double   GetNewAvr(const double NewVal);

public:
            cAvrBase(){};
           ~cAvrBase(){};
  };

void cAvrBase::Init(int AvrPer, double InitVal)
  {
   Per=AvrPer;
   ArrayResize(A,Per,0);
   ArrayInitialize(A,InitVal);
   InitSum(InitVal);
  }

double cAvrBase::GetNewAvr(double NewVal)
  {
   if(++Head>=Per) // Reset any cumulative error
      InitSum(NewVal);
   else
     {
      Sum-=A[Head]; Sum+=NewVal;
      A[Head]=NewVal;
     }
   return Sum/Per;
  }

void cAvrBase::InitSum(double NewVal)
  {
   int i;

   Head=0;
   A[0]=NewVal;
   for(i=0, Sum=0.0;i<Per;i++)
      Sum+=A[i];
  }
 
JRandomTrader #:

Основная идея - https://ru.wikipedia.org/wiki/Кольцевой_буфер , имеем массив и указатели (индексы) на голову и хвост (или только один - например, если используем для вычисления среднего, добавляя новый элемент на место самого старого, вот как в этом примере:)

В связи с тем, что данная тема предназначена в основном для начинающих программистов, то желательно коды сопровождать подробными комментариями, чтобы они понимали о чём идёт речь. Подчеркиваю, не ОБЯЗАТЕЛЬНО, а ЖЕЛАТЕЛЬНО. Всем за ранее спасибо!

С уважением, Владимир.

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