Ошибка изменения размера массива в бета-версии сборки 530 - страница 6

 
ubzen:
***Пс: (Я не хочу забывать об этом). Конечно, большинству из нас не нравится не_знать, что содержится в кодах, которые мы используем. Или же мы поглощены попытками понять чужие коды, иначе мы, вероятно, не стали бы их использовать. Однако, большинство нативных функций (пример OrderSend()) в mql4 являются объектами с нашей точки зрения. Мы не видим их коды, однако мы принимаем их. Я считаю, что принятие чужих библиотек - это то, что профессиональный_oop_программист, работающий над большими проектами, должен принимать и развивать. В противном случае вы застрянете в повторном создании колеса.
Да, если так рассуждать, мы все постоянно изобретаем колесо в mql4.
 
ubzen:

Я полагаю, что вы описываете поток программы. Я не думаю, что это большая идея, стоящая за ООП. (имо) ООП пытается решить следующие проблемы. Я ноб в ООП, но я формирую свое мировоззрение по этому поводу.

1) Являются ли ваши функции независимыми от глобальных переменных? Другими_словами, являются ли ваши функции самостоятельными объектами? Инкапсуляция

2) Скрывает ли ваша функция такие детали, как локальные_имена_переменных? Упрощает ли она объем кода на экране? Абстракция

3) Имеет ли она возможность создавать дубликаты самой себя для модификации? Например, возможность создавать собственные типы данных? Наследование.

4) Имеет ли она возможность изменяться на лету? Пример: может ли функция обрабатывать integer_array, а также double_arrays? Полиморфизм.

Способы, которыми ООП может помочь в построении_ea, похожи на то, как ea_builder помогает не_программисту построить эксперта. Вы просто берете свою любимую функцию Order_Accounting_Function -> Data_Function -> Event Tracking Function -> Volume Defining Function -> Trading Criteria Defining Function -> Trade Functions -> Error Processing Function. И бум, у вас есть Expert_Advisor. Все ваши функции определения торговых критериев, которые вы разрабатывали годами, могут быть легко заменены на другие.

Например, если вы захотите изменить мой советник, вам нужно будет изучить, где применяются мои глобальные переменные и какая другая функция зависит от них (как в массивах состояний или статусов). ООП делает это так_просто_как Accounting(Option_3); Display(Option_1); Caption(Option_5); TradingSys(Option_7); VolumeSize(Option2); OrderType(Option_2) и это весь эксперт.

Это облегчает другим людям использование вашего набора библиотек, и обычно то, что работает для кого-то другого, работает и для вас в будущем. Если ничего другого нет, просто представьте себе отдельные объекты на конвейере :)

Спасибо, что описали это так кратко ubzen, я искал это раньше, и они обычно вдавались в такой длинный роман обо всем этом, я никогда не понимал сути.
 
SDC: Спасибо, что описали это так кратко ubzen, я искал это раньше, и они обычно вдавались в такой длинный роман обо всем этом, я никогда не понимал сути.
Пожалуйста.
 
RaptorUK: Есть разница... У меня нет другого выбора, кроме как использовать OrderSend(), если я хочу разместить ордер. ... У меня есть выбор использовать чужую библиотеку или нет ... Даже когда источник уважаем, я все равно пытаюсь понять его, прежде чем пытаться использовать его, вот как некоторые ошибки найдены и исправлены: https://www.mql5.com/en/forum/133792/page3 "И моя поправка к комментариюRaptorUK :"
Здесь нет аргументов. ООП не решает проблему ошибок в кодах и не заставляет вас использовать чужие библиотеки.
 
RaptorUK:
Я немного побаловался с mql5, и мне не понадобилось использовать ООП в написанном мной коде.

Классы и ООП являются в MQL5 в значительной степени необязательным дополнением. Сам фреймворк платформы их не использует. Например, можно было бы ожидать, что в платформе есть что-то вроде коллекции Orders, содержащей список объектов Order, что позволило бы вам написать код, подобный следующему:

for (int i = 0; i < Orders.length; i++) {
  Order O = Orders.getByIndex(i);
  if (O.symbol == "EURUSD" && O.magicNumber = 12345) {
  }
}

Но это не так. Вместо этого способ, которым вы это делаете, практически идентичен для MQL4 и MQL5:

for (int i = 0; i < OrdersTotal(); i++) {
  if (OrderGetTicket(i)) {
    if (OrderGetString(ORDER_SYMBOL) == "EURUSD" && OrderGetInteger(ORDER_MAGIC) == 12345) {
    }
  }
}

(Вы также можете ожидать, что любой советник, который вы напишете, будет классом, производным от класса ExpertAdvisor, который имеет такие вещи, как виртуальные функции OnTick и OnInit в своем объявлении. Но это тоже не тот случай. Фреймворк MQL5 остается принципиально не ООП, но с возможностью для вас самостоятельно использовать ООП для любых задач, где это полезно).

В результате вы можете продолжать использовать код MQL4 на MQL5 с помощью ряда вспомогательных функций, таких как string OrderSymbol() {return OrderGetString(ORDER_SYMBOL);}. Единственной областью, где это не работает, является доступ к временным рядам, поскольку в MQL5 это организовано совсем по-другому. Функция, подобная iOpenMQL4() в https://www.mql5.com/en/articles/81, действительно работает, но она ужасно медленная и неэффективная для многократного использования.

 

(Если кому-то все еще интересно, сообщение об ошибке, с которого началась эта тема, все еще применимо в билде 535. Также как и https://forum.mql4.com/56885/page20#861740, хотя похоже, что MetaQuotes предприняла неудачную попытку исправить эту ошибку).

 
Извините за поздний ответ, но иногда я должен спать и работать

.

Я согласен с RaptorUK, документация на mql5.com по ООП по крайней мере несовершенна. Но, к сожалению, я не знаю хорошего справочника по ООП. Все, что я читал, либо слишком абстрактно, либо слишком просто, беря грушу и яблоко как пример объектов, а фрукты как класс.

Программирование ООП полезно только в том случае, если у вас большой проект. Большой проект - это не обязательно 1 советник, ваш проект может состоять из серии советников с индикаторами и т.д... Тогда хорошо повторно использовать код, а ООП в основном связано с повторным использованием кода, оно помогает вам создать структуру, которая может быть легко использована в других программах. К сожалению, сейчас у меня нет времени углубляться в это. Но в моих планах написать несколько статей об этом.

Одним из примеров большого проекта является MQL5 Wizard, созданный компанией Metaquotes. Он позволяет создать советника за 5 минут с небольшим количеством пользовательских данных. Он основан на mql5 Standard Libray, который предоставляет все необходимые элементы для создания советника. Тот же мастер, вероятно, можно сделать процедурным способом, но это, на мой взгляд, будет намного сложнее. И потом, вам придется поддерживать этот код. Но эти Standard libray трудно понять, так как они не очень хорошо документированы и описаны. Я создал эту тему для централизации всего, что существует по этой теме (mql5 wizard не oop).

 
ubzen:

Я полагаю, что вы описываете поток программы. Я не думаю, что это большая идея, стоящая за ООП. (имо) ООП пытается решить следующие проблемы. Я ноб в ООП, но я формирую свое мировоззрение по этому поводу.

1) Являются ли ваши функции независимыми от глобальных переменных? Другими_словами, являются ли ваши функции самостоятельными объектами? Инкапсуляция

2) Скрывает ли ваша функция такие детали, как локальные_имена_переменных? Упрощает ли она объем кода на экране? Абстракция

3) Имеет ли она возможность создавать дубликаты самой себя для модификации? Например, возможность создавать собственные типы данных? Наследование.

4) Имеет ли она возможность изменяться на лету? Пример: может ли функция обрабатывать integer_array, а также double_arrays? Полиморфизм.

Способы, которыми ООП может помочь в построении_ea, похожи на то, как ea_builder помогает не_программисту построить эксперта. Вы просто берете свою любимую функцию Order_Accounting_Function -> Data_Function -> Event Tracking Function -> Volume Defining Function -> Trading Criteria Defining Function -> Trade Functions -> Error Processing Function. И бум, у вас есть Expert_Advisor. Все ваши функции определения торговых критериев, которые вы разрабатывали годами, могут быть легко заменены на другие.

Например, если вы захотите изменить мой советник, вам нужно будет изучить, где применяются мои глобальные переменные и какая другая функция зависит от них (как в массивах состояний или статусов). ООП делает это так_просто_как Accounting(Option_3); Display(Option_1); Caption(Option_5); TradingSys(Option_7); VolumeSize(Option2); OrderType(Option_2) и это весь эксперт.

Это облегчает другим людям использование вашего набора библиотек, и обычно то, что работает для кого-то другого, работает и для вас в будущем. Если ничего другого не остается, просто представьте себе отдельные объекты на конвейере :)

Это хороший обзор, за исключением полиморфизма. Когда вы сказали "Может ли функция обрабатывать integer_array, а также double_arrays", речь идет не о полиморфизме, а о перегрузке функций. В mql5 вы также можете иметь перегрузку операторов (ошибочно переведенную как перегрузка операций). ООП и полиморфизм - это нечто большее. У меня нет времени подробно рассказывать (особенно на английском), поэтому я предлагаю вам прочитать mql5 introduction to polymorphism.
 
cyclops993:

Классы и ООП являются в MQL5 в значительной степени необязательным дополнением. Сам фреймворк платформы их не использует. Например, можно было бы ожидать, что в платформе есть что-то вроде коллекции Orders, содержащей список объектов Order, что позволило бы вам написать код, подобный следующему:

Но это не так. Вместо этого способ, которым вы это делаете, практически идентичен для MQL4 и MQL5:

(Вы также можете ожидать, что любой советник, который вы напишете, будет классом, производным от класса ExpertAdvisor, который имеет такие вещи, как виртуальные функции OnTick и OnInit в своем объявлении. Но это тоже не тот случай. Фреймворк MQL5 остается принципиально не ООП, но с возможностью для вас самостоятельно использовать ООП для любых задач, где это полезно).

В результате вы можете продолжать использовать код MQL4 на MQL5 с помощью ряда вспомогательных функций, таких как string OrderSymbol() {return OrderGetString(ORDER_SYMBOL);}. Единственной областью, где это не работает, является доступ к временным рядам, поскольку в MQL5 это организовано совсем по-другому. Функция, подобная iOpenMQL4() в https://www.mql5.com/en/articles/81, действительно работает, но она ужасно медленная и неэффективная для многократного использования.

Согласитесь. Я бы добавил, что mql5 предоставляет больше функций "низкого" уровня, чем mql4. Например, многие люди жалуются на отсутствие iBarShift() в mql5. Но mql5 предоставляет более детальные функции, так что вы можете построить свой собственный iBarShift(), а также предоставляет oop, так что вы можете легко использовать его в любом проекте (конечно, oop не обязателен для повторного использования). Не уверен, что мои объяснения понятны, так как мой английский пока несколько примитивен.
 
Ovo:

В настоящее время ООП довольно распространено, и это привлечет к MQL больше настоящих кодеров. Но редактор, похожий на блокнот, оттолкнет большинство из них, я уверен.

Пробовали ли вы метаредактор mql5 (или новый редактор mql4, который является тем же самым)? Там много улучшений.
Причина обращения: