Часто я внутри функций объявлял переменную типа так:
Дальше внутри, при каком-то условии уже вызываю её, чтобы увидеть, если есть ошибка. Ну это не только у меня, а и много где, в кодах, которые мне попадались. Так сказать, типичная ситуация. Сегодня я подумал, что не логично каждый раз, в каждой функции, где требуется контролировать ошибки, объявлять ту же самую переменную. Подумал, пришёл к выводу, что проще будет один раз объявить глобально и инициализировать её в ините. Как-то так:
А дальше, когда нужно в пользовательских функциях вызывать переменную err, зная, что у неё уже есть значение. По сути, GetLastError() выдаёт код последней ошибки, а значит, если в каждой функции будет вызываться в конце всех расчётов данная переменная err, отвечающая за вывод кода ошибки, и, вызывающая GetLastError(), то всё будет верно, так?
Но зато, если не вызвать по конце какой-то функции (по цепочке выполнения кода эксперта) то переменная не обнулится, и это грозит не верным выполнением, в случает, если в предыдущей по цепочке выполнения кода была ошибка, а в текущей нет, НО код ошибки то возвращается последний... а для её сброса, необходимо вызвать данную функцию GetLastError(). Т.е. тут всё зависит от того, вызвана оно была или нет. Если нет уверенности, что будет везде так, проще перестраховаться и обнулять её каждый раз, так?
Можно err объявить на глобальном уровне, затем в start() перед вызовом GetLastError() обнулять её, напр.:
1) почему бы инициализацию не провести сразу при объявлении int err=0 ?
А попробуйте!:) У меня не вышло. Как я понял, инициализация спец. функциями в глобальных переменных нельзя. Хотя в документации про это вроде бы не было сказано.
ALXIMIKS:
2) не проверял, но как пишет документация ошибка хранится в некой переменой, которая автообнуляется при использовании функции GetLastError(),
а также всегда изменяется при использовании некоторых функций (в основном терминаловских)
Про обнуления и и написал выше, тока там выходит, что если после того как значение попало в переменную LastError(),то, чтоб сбросить её необходимо вызвать функцию GetLastError(), чтобы она возвратила код последней ошибки и сбросила переменную LastErrorиначе, код последней ошибки будет хранится постоянно, до вызова GetLastError(), и, соответственно, может возвратить код последней ошибки там, где её уже нет. (т.е. в другой функции, чтоб затруднит чтение лога или принта).
ALXIMIKS:
3) вот почему GetLastError() давал значение 0после обращения к несуществующему номеру тикета в OrderSelect:
" Остальные функции не меняют значение переменной last_error ни при каких условиях. ................., OrderSelect, ...................."
Это не из-за OrderSelect() скорее всего, а что-то другое нет так(рядом в той же функции). Тем более на неё часто влияет ещё много чего.
Можно err объявить на глобальном уровне, затем в start() перед вызовом GetLastError() обнулять её, напр.:
Если объявить в старт, а дальше по коду более 1 ошибки, то уже выйдет косяк по логике. Если не будет постоянно вызываться (теоритически в конце каждой пользовательской функции) GetLastError().
Виктор (hoz), не пойму Ваших заморочек с последней ошибкой.
Объявите функцию для обработки ошибок и вызывайте её, где надо. Всё будет локально и везде можно использовать.
Оно то понятно. Но функция то эта будет вызываться, когда нужно в моём случает мне, т.е. когда я хочу проверить, есть ли ошибка. Но если ошибка была где-то раньше, а в данном моменте её нет, то вернётся прежняя ошибка, которая была раньше.. Ведь в Вашей функции Вадим, не обнуляется переменная LastError,вызовом GetLastError(). Вот в чём суть..
Оно то понятно. Но функция то эта будет вызываться, когда нужно в моём случает мне, т.е. когда я хочу проверить, есть ли ошибка. Но если ошибка была где-то раньше, а в данном моменте её нет, то вернётся прежняя ошибка, которая была раньше.. Ведь в Вашей функции Вадим, не обнуляется переменная LastError, вызовом GetLastError(). Вот в чём суть..
Её не надо обнулять. Должна быть привычка везде после функций проверять ошибки. Ещё надо сделать вызов отключаемым. Чтобы не тормозило в боевом режиме. Т.е. это такой отладчик.
Исключение, конечно, для ошибок, которые надо анализировать, для принятия решения.
Оно то понятно. Но функция то эта будет вызываться, когда нужно в моём случает мне, т.е. когда я хочу проверить, есть ли ошибка. Но если ошибка была где-то раньше, а в данном моменте её нет, то вернётся прежняя ошибка, которая была раньше.. Ведь в Вашей функции Вадим, не обнуляется переменная LastError, вызовом GetLastError(). Вот в чём суть..
Что мешает сначала обнулить (err=0;), потом вызвать действие, потом присвоить значение ошибки err=GetLastError(), обработать её, и снова err=0.
Как просчитать профит фактор при разных t/p и s/l. Понятно если тейк и стоп скажем по 20 пунктов считаем кол-во прибыльных и убыточных сделок и делим. А как считать к примеру если тейк 40 п., а стоп 30 пунктов? Спасибо!
1) почему бы инициализацию не провести сразу при объявлении int err=0 ?
2) не проверял, но как пишет документация ошибка хранится в некой переменой, которая автообнуляется при использовании функции GetLastError(),
а также всегда изменяется при использовании некоторых функций (в основном терминаловских)
3) вот почему GetLastError() давал значение 0 после обращения к несуществующему номеру тикета в OrderSelect:
" Остальные функции не меняют значение переменной last_error ни при каких условиях. ................., OrderSelect, ...................."
Часто я внутри функций объявлял переменную типа так:
Дальше внутри, при каком-то условии уже вызываю её, чтобы увидеть, если есть ошибка. Ну это не только у меня, а и много где, в кодах, которые мне попадались. Так сказать, типичная ситуация. Сегодня я подумал, что не логично каждый раз, в каждой функции, где требуется контролировать ошибки, объявлять ту же самую переменную. Подумал, пришёл к выводу, что проще будет один раз объявить глобально и инициализировать её в ините. Как-то так:
А дальше, когда нужно в пользовательских функциях вызывать переменную err, зная, что у неё уже есть значение. По сути, GetLastError() выдаёт код последней ошибки, а значит, если в каждой функции будет вызываться в конце всех расчётов данная переменная err, отвечающая за вывод кода ошибки, и, вызывающая GetLastError(), то всё будет верно, так?
Но зато, если не вызвать по конце какой-то функции (по цепочке выполнения кода эксперта) то переменная не обнулится, и это грозит не верным выполнением, в случает, если в предыдущей по цепочке выполнения кода была ошибка, а в текущей нет, НО код ошибки то возвращается последний... а для её сброса, необходимо вызвать данную функцию GetLastError(). Т.е. тут всё зависит от того, вызвана оно была или нет. Если нет уверенности, что будет везде так, проще перестраховаться и обнулять её каждый раз, так?
Можно err объявить на глобальном уровне, затем в start() перед вызовом GetLastError() обнулять её, напр.:
1) почему бы инициализацию не провести сразу при объявлении int err=0 ?
2) не проверял, но как пишет документация ошибка хранится в некой переменой, которая автообнуляется при использовании функции GetLastError(),
а также всегда изменяется при использовании некоторых функций (в основном терминаловских)
3) вот почему GetLastError() давал значение 0 после обращения к несуществующему номеру тикета в OrderSelect:
" Остальные функции не меняют значение переменной last_error ни при каких условиях. ................., OrderSelect, ...................."
Можно err объявить на глобальном уровне, затем в start() перед вызовом GetLastError() обнулять её, напр.:
то уже выйдет косяк по логике. Если не будет постоянно вызываться (теоретически в конце каждой пользовательской функции) GetLastError().
Иногда чаще вызывать приходится
Виктор (hoz), не пойму Ваших заморочек с последней ошибкой.
Объявите функцию для обработки ошибок и вызывайте её, где надо. Всё будет локально и везде можно использовать.
Виктор (hoz), не пойму Ваших заморочек с последней ошибкой.
Объявите функцию для обработки ошибок и вызывайте её, где надо. Всё будет локально и везде можно использовать.
Оно то понятно. Но функция то эта будет вызываться, когда нужно в моём случает мне, т.е. когда я хочу проверить, есть ли ошибка. Но если ошибка была где-то раньше, а в данном моменте её нет, то вернётся прежняя ошибка, которая была раньше.. Ведь в Вашей функции Вадим, не обнуляется переменная LastError, вызовом GetLastError(). Вот в чём суть..
Оно то понятно. Но функция то эта будет вызываться, когда нужно в моём случает мне, т.е. когда я хочу проверить, есть ли ошибка. Но если ошибка была где-то раньше, а в данном моменте её нет, то вернётся прежняя ошибка, которая была раньше.. Ведь в Вашей функции Вадим, не обнуляется переменная LastError, вызовом GetLastError(). Вот в чём суть..
Её не надо обнулять. Должна быть привычка везде после функций проверять ошибки. Ещё надо сделать вызов отключаемым. Чтобы не тормозило в боевом режиме. Т.е. это такой отладчик.
Исключение, конечно, для ошибок, которые надо анализировать, для принятия решения.
Оно то понятно. Но функция то эта будет вызываться, когда нужно в моём случает мне, т.е. когда я хочу проверить, есть ли ошибка. Но если ошибка была где-то раньше, а в данном моменте её нет, то вернётся прежняя ошибка, которая была раньше.. Ведь в Вашей функции Вадим, не обнуляется переменная LastError, вызовом GetLastError(). Вот в чём суть..