Любой вопрос новичка, чтоб не захламлять форум. Профи, не проходите мимо. Без вас никуда - 6. - страница 156

 

1) почему бы инициализацию не провести сразу при объявлении int err=0 ?

2) не проверял, но как пишет документация ошибка хранится в некой переменой, которая автообнуляется при использовании функции GetLastError(),

а также всегда изменяется при использовании некоторых функций (в основном терминаловских)

3) вот почему GetLastError() давал значение 0 после обращения к несуществующему номеру тикета в OrderSelect:

" Остальные функции не меняют значение переменной last_error ни при каких условиях. ................., OrderSelect, ...................."

 
hoz:

Часто я внутри функций объявлял переменную типа так:

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

А дальше, когда нужно в пользовательских функциях вызывать переменную err, зная, что у неё уже есть значение. По сути, GetLastError() выдаёт код последней ошибки, а значит, если в каждой функции будет вызываться в конце всех расчётов данная переменная err, отвечающая за вывод кода ошибки, и, вызывающая GetLastError(), то всё будет верно, так?

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

Можно err объявить на глобальном уровне, затем в start() перед вызовом GetLastError() обнулять её, напр.:

int err;
//------------------
int init() 
{
  // ...
  return(0);
}
//------------------
int start() 
{ 
  // ...
  RefreshRates();
  OrderClose(...);
  err=0;     // обнуление
  err=GetLastError();
  SomeErrFunction(err);
  // ...
return(0);
}
 
ALXIMIKS:

1) почему бы инициализацию не провести сразу при объявлении int err=0 ?


А попробуйте!:) У меня не вышло. Как я понял, инициализация спец. функциями в глобальных переменных нельзя. Хотя в документации про это вроде бы не было сказано.
ALXIMIKS:

2) не проверял, но как пишет документация ошибка хранится в некой переменой, которая автообнуляется при использовании функции GetLastError(),

а также всегда изменяется при использовании некоторых функций (в основном терминаловских)

Про обнуления и и написал выше, тока там выходит, что если после того как значение попало в переменную LastError(), то, чтоб сбросить её необходимо вызвать функцию GetLastError(), чтобы она возвратила код последней ошибки и сбросила переменную LastError иначе, код последней ошибки будет хранится постоянно, до вызова GetLastError(), и, соответственно, может возвратить код последней ошибки там, где её уже нет. (т.е. в другой функции, чтоб затруднит чтение лога или принта).
ALXIMIKS:

3) вот почему GetLastError() давал значение 0 после обращения к несуществующему номеру тикета в OrderSelect:

" Остальные функции не меняют значение переменной last_error ни при каких условиях. ................., OrderSelect, ...................."

Это не из-за OrderSelect() скорее всего, а что-то другое нет так(рядом в той же функции). Тем более на неё часто влияет ещё много чего.
 
paladin80:

Можно err объявить на глобальном уровне, затем в start() перед вызовом GetLastError() обнулять её, напр.:

Если объявить в старт, а дальше по коду более 1 ошибки, то уже выйдет косяк по логике. Если не будет постоянно вызываться (теоритически в конце каждой пользовательской функции) GetLastError().
 
hoz:
то уже выйдет косяк по логике. Если не будет постоянно вызываться (теоретически в конце каждой пользовательской функции) GetLastError().

Иногда чаще вызывать приходится
 

Виктор (hoz), не пойму Ваших заморочек с последней ошибкой.

Объявите функцию для обработки ошибок и вызывайте её, где надо. Всё будет локально и везде можно использовать.

// Объявление:
void CommentError(int nLastCodeError, string sComment)
 {
  if (nLastCodeError != 0) Print(sComment, "  ", ErrorDescription(nLastCodeError));
 }

// Вызов:
void start()
 {
  CommentError(GetLastError(), "Ошибка в функции start()!");
 }
 
Zhunko:

Виктор (hoz), не пойму Ваших заморочек с последней ошибкой.

Объявите функцию для обработки ошибок и вызывайте её, где надо. Всё будет локально и везде можно использовать.


Оно то понятно. Но функция то эта будет вызываться, когда нужно в моём случает мне, т.е. когда я хочу проверить, есть ли ошибка. Но если ошибка была где-то раньше, а в данном моменте её нет, то вернётся прежняя ошибка, которая была раньше.. Ведь в Вашей функции Вадим, не обнуляется переменная LastError, вызовом GetLastError(). Вот в чём суть..
 
hoz:

Оно то понятно. Но функция то эта будет вызываться, когда нужно в моём случает мне, т.е. когда я хочу проверить, есть ли ошибка. Но если ошибка была где-то раньше, а в данном моменте её нет, то вернётся прежняя ошибка, которая была раньше.. Ведь в Вашей функции Вадим, не обнуляется переменная LastError, вызовом GetLastError(). Вот в чём суть..

Её не надо обнулять. Должна быть привычка везде после функций проверять ошибки. Ещё надо сделать вызов отключаемым. Чтобы не тормозило в боевом режиме. Т.е. это такой отладчик.

Исключение, конечно, для ошибок, которые надо анализировать, для принятия решения.

 
hoz:

Оно то понятно. Но функция то эта будет вызываться, когда нужно в моём случает мне, т.е. когда я хочу проверить, есть ли ошибка. Но если ошибка была где-то раньше, а в данном моменте её нет, то вернётся прежняя ошибка, которая была раньше.. Ведь в Вашей функции Вадим, не обнуляется переменная LastError, вызовом GetLastError(). Вот в чём суть..
Что мешает сначала обнулить (err=0;), потом вызвать действие, потом присвоить значение ошибки err=GetLastError(), обработать её, и снова err=0.
 
Как просчитать профит фактор при разных t/p и s/l. Понятно если тейк и стоп скажем по 20 пунктов считаем кол-во прибыльных и убыточных сделок и делим. А как считать к примеру если тейк 40 п., а стоп 30 пунктов? Спасибо!