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

 

Есть вопрос такого формата значит: есть такой код

int P=3;

if(P==5){то необходимо залезть в библиотеку и что-то посчитать}

в данной ситуации Р=3, т.е. условие ложное, вопрос будет ли компилятор лезть в библиотеку и в холостую гонять код или компилятор будет читать код в текущем файле? Объясню почему я об этом спросил. Значит смотрите предположим если записать условие такого формата

int Y=4;

if(Y==4){что-то сделать} else{сделать что-то другое}. В данной ситуации получаем следующую картину Y==4, выполнился первый можно сказать приоритетный оператор, но то что записано в блоке else{сделать что-то другое} тоже будет проверено - посчитано(именно посчитано и всегда), но не выполнено потому что приоритетом является выражение if(Y==4). Другими словами в не зависимости от результата истинности машина производит все вычисления, т.е. тратит мощность на расчёты несмотря на то будет ли выполнен второстепенный оператор или нет. Если использовать большие программы и библиотеки и компилятор будет каждый раз копать код библиотек, то это в конечном итоге будет тормозить работу такой программы, на сколько эффективно будет в это случае использование библиотек может стоит использовать как можно более краткий код самого mql4 чтобы производительность робота была высокой? У кого какие мысли по этому поводу?

 
Pavel Soin:

Здравствуйте.

Допустим, есть 2 индикатора, у первого 4 буфера, у второго 2. Кидаю их на график, открываю окно данных (CTRL+D), в списке 6 буферов от 0 до 5. Как мне из этого списка на MQL прочитать значение, допустим, 5 буфера? Через iCustom по нужному индикатору не совсем удобно. Удобнее из этого списка. Знаю, что так делают, но как?

Помочь кто-нибудь сможет?

 
Seric29:

Есть вопрос такого формата значит: есть такой код

int P=3;

if(P==5){то необходимо залезть в библиотеку и что-то посчитать}

в данной ситуации Р=3, т.е. условие ложное, вопрос будет ли компилятор лезть в библиотеку и в холостую гонять код или компилятор будет читать код в текущем файле? Объясню почему я об этом спросил. Значит смотрите предположим если записать условие такого формата

int Y=4;

if(Y==4){что-то сделать} else{сделать что-то другое}. В данной ситуации получаем следующую картину Y==4, выполнился первый можно сказать приоритетный оператор, но то что записано в блоке else{сделать что-то другое} тоже будет проверено - посчитано(именно посчитано и всегда), но не выполнено потому что приоритетом является выражение if(Y==4). Другими словами в не зависимости от результата истинности машина производит все вычисления, т.е. тратит мощность на расчёты несмотря на то будет ли выполнен второстепенный оператор или нет. Если использовать большие программы и библиотеки и компилятор будет каждый раз копать код библиотек, то это в конечном итоге будет тормозить работу такой программы, на сколько эффективно будет в это случае использование библиотек может стоит использовать как можно более краткий код самого mql4 чтобы производительность робота была высокой? У кого какие мысли по этому поводу?

На такие вопросы очень здорово отвечает отладчик встроенный в MetaEditor. Напишите скрипт с подобными условиями и пошагово прогоните в дебагере. Наяву увидите как программа не заходит туда где ей нечего делать. Более того, такое условие

int P = 3, Y = 4;
if(P == 5 && Y == 4)

После проверки что Р != 3 дальше проверяться ничего не будет.

 
Добрый день. Подскажите плиз что сделать чтобы все графические элементы оставались на графике в выходные?
 
Lomonosov1991:
Добрый день. Подскажите плиз что сделать чтобы все графические элементы оставались на графике в выходные?
Не удалять их
 
Alexey Viktorov:

На такие вопросы очень здорово отвечает отладчик встроенный в MetaEditor. Напишите скрипт с подобными условиями и пошагово прогоните в дебагере. Наяву увидите как программа не заходит туда где ей нечего делать. Более того, такое условие

После проверки что Р != 3 дальше проверяться ничего не будет.

Вот вам пример

int pp=8;if(pp==8){pp=3;}else{pp=340000000000000000000000000000;}

рр в данном случае равно 8ми но компилятор ругается на большое число которое я хочу запихнуть в переменную, но я же не буду запихивать это число в переменную потому что рр=8 правильно, но почему-то компилятор начинает копать что я там написал и проверять может ли такое быть из чего мы делаем вывод что как раз таки компилятор всё проверяет и считает, ну это конечно грубая ошибка можно ошибку сделать и менее серьёзную но компилятор всё равно всё будет проверять может ли такое быть или нет. так вот что будет с библиотеками тоже хороший вопрос, я конечно не буду туда такое писать но речь идёт о том что компилятор залезет туда и начнёт проверять что ему предлагается сделать ещё но выполнять это не будет а считать будет. Далее я пробовал работать с отладчиком MQL4 читал инструкцию вот от сюда https://www.metatrader5.com/ru/metaeditor/help/development/debug, у меня даже не активна вкладка "проверять на истории" хотя в инструкции должна быть активна, далее  я попробовал выбрать вариант на реальных данных но в этом случае у меня не отображаются значения переменных всё пусто ничего не пишет, просто интересно как так.

 
Seric29:

Вот вам пример

int pp=8;if(pp==8){pp=3;}else{pp=340000000000000000000000000000;}

рр в данном случае равно 8ми но компилятор ругается на большое число которое я хочу запихнуть в переменную, но я же не буду запихивать это число в переменную потому что рр=8 правильно, но почему-то компилятор начинает копать что я там написал и проверять может ли такое быть из чего мы делаем вывод что как раз таки компилятор всё проверяет и считает, ну это конечно грубая ошибка можно ошибку сделать и менее серьёзную но компилятор всё равно всё будет проверять может ли такое быть или нет. так вот что будет с библиотеками тоже хороший вопрос, я конечно не буду туда такое писать но речь идёт о том что компилятор залезет туда и начнёт проверять что ему предлагается сделать ещё но выполнять это не будет а считать будет. Далее я пробовал работать с отладчиком MQL4 читал инструкцию вот от сюда https://www.metatrader5.com/ru/metaeditor/help/development/debug, у меня даже не активна вкладка "проверять на истории" хотя в инструкции должна быть активна, далее  я попробовал выбрать вариант на реальных данных но в этом случае у меня не отображаются значения переменных всё пусто ничего не пишет, просто интересно как так.

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

А отладчик МТ4 не работает на исторических данных. Это прерогатива тестера МТ5. Но скрипты на истории по-любому нет смысла дебажить и то что я предложил можно понаблюдать и в тестере МТ4. Просто надо в начале кода поставить точку останова, а затем пошагово наблюдать за последовательностью выполнения и значениями переменных.

 
Считаете нормальным обсуждать куски декомпилированного кода?
Хоть бы переменные переименовали. А то совсем уж внаглую...
 
Artyom Trishkin:
Считаете нормальным обсуждать куски декомпилированного кода?

Хоть бы переменные переименовали. А то совсем уж внаглую...

Этот советник в сети есть в формате MQL4. Trio Dancer. просто я его под себя переделываю

 
Lomonosov1991:

Этот советник в сети есть. Trio Dancer. просто я его под себя переделываю

Ну и что? Есть места, где скупают и продают краденное. 
Этот форум не из этой категории.
Советник был кем-то когда-то взломан (украден у автора), и теперь вы его делаете под себя. Делайте пожалуйста не на этом ресурсе. Здесь мы соблюдаем этику.
Причина обращения: