Ошибка № 4055: Ошибка пользовательского индикатора.

 

Из кода индикатора вызываю WindowHandle (Symbol(), Period()) для получения дескриптора окна:

//+------------------------------------------------------------------+
//|    ПОЛУЧАЕМ ДЕСКРИПТОР ОКНА                                      |
//+------------------------------------------------------------------+
int fWindowHandle()
{
    int cnt = 0, Handle = -1, err = GetLastError();
    
    while (Handle <= 0 && !IsStopped())             // Выходим из цикла, только если получили дескриптор окна.
    {
        Handle = WindowHandle (Symbol(), Period()); // Получаем системный дескриптор нового окна.
        Sleep (500);                                // Делаем задержку между итерациями.
        cnt++;
        if (cnt > 20)
        {break;}
    }
    //---- Контролируем возможные ошибки
    fGetLastError ("fWindowHandle():");
    return (Handle);
}

В логе получаем непременную ошибку:

2010.12.07 16:40:54     i-PSI@TrendBasket AUDUSD,M5: fWindowHandle(): Ошибка № 4055: Ошибка пользовательского индикатора.

Но запрошенное получаем:

2010.12.07 16:40:54     i-PSI@TrendBasket AUDUSD,M5: Получили дескриптор окна !!! hWnd = 6163126.

Индикатору НЕ РАЗРЕШАЕТСЯ делать такие запросы? Или я в коде намудрил???

 

Пишем скрипт, который содержит следующий код:

int Handle = WindowHandle(Symbol(), Period()); // Получаем системный дескриптор окна.
Alert("Handle = ",Handle);

Компилируем, бросаем на график и убеждаемся, что всё работает. Теперь по Вашему коду.

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

 
И ещё, как можно ответить на Ваш вопрос. если совершенно непонятно что происходит в функции fGetLastError(), непонятно зачем Вы её вызываете при каждом запуске fWindowHandle() и непонятно откуда Вы получили приведённые Вами сообщения об ошибках?
 
IgRU4ek:

Индикатору НЕ РАЗРЕШАЕТСЯ делать такие запросы? Или я в коде намудрил???

Sleep уберите
 
drknn:

Пишем скрипт, который содержит следующий код:

Компилируем, бросаем на график и убеждаемся, что всё работает. Теперь по Вашему коду.

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

Объясняю очевидные вещи:

В начале пользовательской функции, чтобы контролировать возможные ошибки в коде этой самой функции, я объявляю переменную err, для обнуления показаний функции GetLastError(). Если при исполнении кода этой пользовательской функции,произойдёт ошибка, то её я "выловлю" с помощью другой пользовательской функции: GetLastError (string txt) - эта функция даёт расшифровку возникшей ошибки, указывает место, где произошла ошибка (наименование функции) и выводит эту информацию в лог.

 
sergeev:
Sleep уберите
Спасибо! Про Sleep() в индикаторе я как-то пропустил... :)
Причина обращения: