Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам - страница 73

 
Alexey Viktorov:
Артём, ты не прав. Массив объявленный на глобальном уровне виден во всех частях программы и передавать его куда-то откуда-то совсем не надо. Просто в одном месте программы он заполняется, в другом сортируется, а в третьем читается, не важно.

Одна и та же функция может с успехом сортировать и/или искать данные в разных массивах. Верно? А раз так, то лучше массив передавать по ссылке - на будущее. Ну и при вызове функции не помешает видеть с каким массивом она будет работать.

Я вот лишь из этих соображений. Где не прав?

 
Artyom Trishkin:

Одна и та же функция может с успехом сортировать и/или искать данные в разных массивах. Верно? А раз так, то лучше массив передавать по ссылке - на будущее. Ну и при вызове функции не помешает видеть с каким массивом она будет работать.

Я вот лишь из этих соображений. Где не прав?

Понял. Твой совет для лего-программистов. Сам-то такими извращениями не занимаешься.

Тогда остаётся одно, не прав в том, что массив должен быть объявлен на глобальном уровне.

Рад что мы друг-друга поняли.

 
Alexey Viktorov:

Понял. Твой совет для лего-программистов. Сам-то такими извращениями не занимаешься.

Тогда остаётся одно, не прав в том, что массив должен быть объявлен на глобальном уровне.

Рад что мы друг-друга поняли.

В данном контексте я веду к чему:

  1. Нам нужно добиться как можно меньшего количества циклов на одном тике.
  2. Нам нужно иметь один постоянный массив с данными рыночных ордеров и позиций и один массив с данными удалённых/закрытых ордеров и позиций
  3. Если иметь массив локально в функции, то повторное к нему обращение требует очередного его заполнения. Я предлагаю его заполнять один раз на новом тике - значит массив глобальный - иначе мы его потеряем при выходе из функции.
  4. Для того, чтобы что-то в нём (в массиве) найти, нам нужен заполненный массив и функции, которые будут возвращать найденные данные. Уже внутри функций можно объявить вспомогательные массивы для необходимых расчётов.

Исходя их этого - массивы всё же лучше иметь глобальные - для закрытых и открытых ордеров и позиций. Один раз на новом тике мы проходим по одному разу по необходимому количеству ордеров/позиций, заполняя ими два массива. А далее уже на этом же тике мы получаем с них все нужные нам данные. Причём у меня рассчитываются не только последний закрытый/открытый ордер/позиция и все их данные, но и ищутся все родительские и дочерние тикеты всех позиций при частичном закрытии. Соответственно, я в любой момент времени могу поглядеть от какого тикета произошла та или иная позиция если она не единожды закрывалась частично - всё это уже работает в одном классе, который работает в таймере. Ну и многие другие необходимые мне данные я имею при небольшом итоговом количестве циклов. Для тестера задаётся нужная глубина истории для массивов.

И т.д., и т.п. ...

 
Artyom Trishkin:

В данном контексте я веду к чему:

  1. Нам нужно добиться как можно меньшего количества циклов на одном тике.
  2. Нам нужно иметь один постоянный массив с данными рыночных ордеров и позиций и один массив с данными удалённых/закрытых ордеров и позиций
  3. Если иметь массив локально в функции, то повторное к нему обращение требует очередного его заполнения. Я предлагаю его заполнять один раз на новом тике - значит массив глобальный - иначе мы его потеряем при выходе из функции.
  4. Для того, чтобы что-то в нём (в массиве) найти, нам нужен заполненный массив и функции, которые будут возвращать найденные данные. Уже внутри функций можно объявить вспомогательные массивы для необходимых расчётов.

Исходя их этого - массивы всё же лучше иметь глобальные - для закрытых и открытых ордеров и позиций. Один раз на новом тике мы проходим по одному разу по необходимому количеству ордеров/позиций, заполняя ими два массива. А далее уже на этом же тике мы получаем с них все нужные нам данные. Причём у меня рассчитываются не только последний закрытый/открытый ордер/позиция и все их данные, но и ищутся все родительские и дочерние тикеты всех позиций при частичном закрытии. Соответственно, я в любой момент времени могу поглядеть от какого тикета произошла та или иная позиция если она не единожды закрывалась частично - всё это уже работает в одном классе, который работает в таймере. Ну и многие другие необходимые мне данные я имею при небольшом итоговом количестве циклов. Для тестера задаётся нужная глубина истории для массивов.

И т.д., и т.п. ...

Значит мы не совсем друг-друга поняли.

Если массив глобальный, зачем его передавать в функцию по ссылке если он и так виден внутри этой функции?

 
Alexey Viktorov:

Значит мы не совсем друг-друга поняли.

Если массив глобальный, зачем его передавать в функцию по ссылке если он и так виден внутри этой функции?

Перегрузка функций - есть такое понятие же ;)

Если нужно делать одинаковые действия с разными массивами в одной функции, то ...

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

 
Artyom Trishkin:

Перегрузка функций - есть такое понятие же ;)

Если нужно делать одинаковые действия с разными массивами в одной функции, то ...

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

Ну, слава Богу, я понял твои мысли. Но они очень похожи на совет лего-программистам.
 
Alexey Viktorov:
Ну, слава Богу, я понял твои мысли. Но они очень похожи на совет лего-программистам.

Было бы очень странно, имея в запасе огромное множество 100%-рабочих функций, каждый раз писать их заново. Это не советы собирателям домиков из кубиков. Это советы накапливать собственные библиотеки функций и классы. И что плохого в том, что одна функция работает с несколькими массивами в зависимости от того, какой из них в неё передан по ссылке? А что плохого в шаблонах функций?

Если есть код для сортировки массива, зачем под каждый тип массива писать отдельную функцию? Ведь можно просто сделать перегрузку и сортировать любой тип. Как думаешь работает ArraySort() ? Ты же туда передаёшь разные типы массивов, а на выходе получаешь отсортированный тот, который передал - или метаквоты тоже лего-кодеры что-ли?

 
Artyom Trishkin:

Было бы очень странно, имея в запасе огромное множество 100%-рабочих функций, каждый раз писать их заново. Это не советы собирателям домиков из кубиков. Это советы накапливать собственные библиотеки функций и классы. И что плохого в том, что одна функция работает с несколькими массивами в зависимости от того, какой из них в неё передан по ссылке? А что плохого в шаблонах функций?

Если есть код для сортировки массива, зачем под каждый тип массива писать отдельную функцию? Ведь можно просто сделать перегрузку и сортировать любой тип. Как думаешь работает ArraySort() ? Ты же туда передаёшь разные типы массивов, а на выходе получаешь отсортированный тот, который передал - или метаквоты тоже лего-кодеры что-ли?

Главное не дойти до такого вот.

https://www.mql5.com/ru/forum/165468/page3#comment_3978059

Простой советник. Проверка размера бара. Покупка/продажа
Простой советник. Проверка размера бара. Покупка/продажа
  • www.mql5.com
Что должен делать советник: на каждом тике проверять размер бара как только размер бара станет равным или превысит заданный размер то: если свеча б...
 
Alexey Viktorov:

Главное не дойти до такого вот.

https://www.mql5.com/ru/forum/165468/page3#comment_3978059

Там бесполезно. У него проверка на проверку и потом проверка а верно ли проверилось. И всё равно криво. Там не этот случай - там профессора нужны.
 

есть переменная

int Level = 0;

В процессе работы программы она постоянно меняется. Помогите написать условие: если Level НЕ изменилось, то ничего не делаем, если Level изменилось (не важно в большую или меньшую сторону) то делать определенное действие { оператор }