Очень странный глюк тестера MT4 - страница 2

 
Vitaly Murlenko:

Речь шла не о выделении памяти для блоков программы, речь шла о том, что подпрограмма не должна вмешиваться в работу основной программы.

Это зависит не от хотелок программиста, а от того, как написана программа. 

У меня цикл основного кода вызывает другой цикл подпрограммы, которая лежит в библиотеке (читай, совершенно в другом файле).

Физическое расположение кода никак не влияет на разделение программы. Это все равно одна и та же программа.


Из цикла советника вызывается цикл, расположенный в подпрограмме. Подпрограмма не является блоком основной программы!!! Она ОТДЕЛЬНАЯ штука. Можно вызывать, можно не вызывать.

Если функция вызывается из библиотеки, то она выполняется контексте вызвавшей программы, в ее же потоке. С многопоточными приложениями имели дело? Там как раз следует четко разделять,в каком потоке будет работать одна и та же функция.

Вот представьте ситуацию, Вы написали аудиоплеер. Он просто воспроизводит музыку. Но Вам понадобилось воткнуть в него кнопку, которая считывает некое значение трека и передаёт его в одну из API-функций Windows-а. Там происходит обработка введённых данных и возврат в виде обычного текстового сообщения с результатами обработки. Эта апи-функция будет ПОДПРОГРАААМОЙ для Вашего плеера. И она должна выполняться в ОТДЕЛЬНОМ сегменте оперативной памяти. И вот эта подпрограмма взяла да и ни с того ни с сего вмешалась в основную программу - взяла и до максимума увеличила Вам громкость воспроизведения. А у Вас глубокая ночь и домашние спят. Это же ненормально, если Вы не запрашивали увеличение громкости.

Не нужно производить обращение к глобальным переменным внутри функции, которая не должна ни на что влиять. Если же функция такое делает, то вот и результат - неправильная работа. Здесь не функция виновата, а программист.


Вернемся к функции OrderSelect(). По отношению к любой MQL-программе это глобальная функция. И эта функция знать ничего не знает о том, из какого места программы ее вызвали. Ее дело - выбрать указанный ордер и разместить в некотором адресном пространстве результат. Причем прямой доступ к этому адресному пространству MQL-программа не имеет, только косвенный через функции OrderOpenPrice(), OrderOpenTime() и т. д. Для одной MQL-программы это одно и то же адресное пространство. И, заметьте, деление на "подпрограммы" здесь ничего не изменяет в ее сути. Вот если обратиться к OrderSelect() из другой MQL-программы, то тогда будет другой результат.

 

@Igor Makanu

Кимовские функции видел последний раз уже очень давно. Жаль, кстати, что сайт, прописанный в его кодах, сейчас не работает. 

Возвращаясь к функциям Кима, хочу сказать, что мне очень нравится то, что они чётко соответствуют формулам математической логики. Если переменная в дизъюнктах повторяется, то Ким спокойно "выносит её за скобки". Так, например, построен его код программерского трейлингстопа. Молодчага, дядя, слов нет.

 

@Ihor Herasko От ЗОЛОТЫЕ СЛОВА, что виновен программист. Ну не знал я про такое поведение кода. Ладно, решение найдено, вопрос закрыт.

Всем спасибо.

 
Vitaly Murlenko:

@Ihor Herasko От ЗОЛОТЫЕ СЛОВА, что виновен программист.

Можно перефразировать: в любой ситуации, когда что-то пошло не так, сначала нужно найти свою ошибку. В подавляющем большинстве случаев это получается.

Ну не знал я про такое поведение кода. Ладно, решение найдено, вопрос закрыт.

Всем спасибо.

Главное, чтобы Вы поняли, почему так происходит. Если это действительно так, то тема поднята не зря.

 
Мне стало понятно после слов ОрдерСелект заполняет поля структуры свойств ордера))) 
 

Про импортируемые ex-файлы, кстати, не уверен, не проверял.

Если SchSell расположить в другом ex и импортировать в основной код, возможно, OrderSelect-ы в ней не будут влиять на выбранный в основной программе ордер.

 
Суть в том что OrderType() выдаёт 0 хоть это сэл или бай.
И дело не в OrderSelect(), поскольку все остальные параметры выводятся замечательно.

Баг в функции OrderType()

Не знаю почему сейчас не работает, весь день ковырять. На винде 11 последняя версия.


Правка: нашёл ошибку. У меня был енум декларирован. Который назывался конечно OrderType. При компиляции всё замечательно. Ну сама функция потом без функции. Жаль что компилятор эту ошибку не заметил, мне это пол дня стоило понять почему не работает
 
Andrey Khatimlianskii #:

Про импортируемые ex-файлы, кстати, не уверен, не проверял.

Если SchSell расположить в другом ex и импортировать в основной код, возможно, OrderSelect-ы в ней не будут влиять на выбранный в основной программе ордер.

Андрей, а вы файлы МТ из облака перенесли в телегу, или теперь и там, и там?

 
Alexey Viktorov #:

Андрей, а вы файлы МТ из облака перенесли в телегу, или теперь и там, и там?

С гугла убрал, да. Только в телеге.

 
Andrey Khatimlianskii #:

С гугла убрал, да. Только в телеге.

 А можно ссылку, иногда нужны)))

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