Скачать MetaTrader 5

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

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Игорь
208
Игорь 2010.12.07 16:50 

Из кода индикатора вызываю 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.

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

Владимир Тезис
4266
Владимир Тезис 2010.12.08 18:08  

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

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

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

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

Владимир Тезис
4266
Владимир Тезис 2010.12.08 18:10  
И ещё, как можно ответить на Ваш вопрос. если совершенно непонятно что происходит в функции fGetLastError(), непонятно зачем Вы её вызываете при каждом запуске fWindowHandle() и непонятно откуда Вы получили приведённые Вами сообщения об ошибках?
o_o
Модератор
23861
o_o 2010.12.08 19:54  
IgRU4ek:

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

Sleep уберите
TarasBY
1739
TarasBY 2010.12.08 20:33  
drknn:

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

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

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

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

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

TarasBY
1739
TarasBY 2010.12.08 20:35  
sergeev:
Sleep уберите
Спасибо! Про Sleep() в индикаторе я как-то пропустил... :)
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий