Тонкости работы графического интерфейса в MT4

 

Вопрос к ЗНАТОКАМ или РАЗРАБОТЧИКАМ. Код для запуска пользовательской функции через изменение координат объекта (OBJ_LABEL):

    if (ObjectGet ("close", OBJPROP_XDISTANCE) != 120 // закрыть все
    || ObjectGet ("close", OBJPROP_YDISTANCE) != 200)
    {
        Print ("Намереваемся закрыть вручную все ордера !!!");
        Sleep (2000);
        if (confirm ("ЗАКРЫВАЕМ ВСЕ ПОЗИЦИИ. \nПродолжить?", "Подтверждение закрытия", MB_YESNO) == IDYES)
        {
            Sleep (3000);
            for (j = 0; j <= NumberOfTry; j++)
            {if (close() == 0) {break;}}
        }
        ObjectDelete ("close");
        return (1); 
    }

Сделал проверку на X и Y координаты, понаставил Sleep (для гарантированной остановки выполнения кода). Срабатывает через раз. Если не срабатывает, то в лог (по Print) ничего не выводится. При повторной попытке выделить объект - объект не выделяется. И только после удаления объекта через "Список объектов" можно произвести следующую попытку запуска, в данном случае функции close(). Срабатывает со 2-3 - го раза.
С этим как-то можно бороться???

 

впереди всей конструкции проверьте объект на его существование ObjectFind(), а затем уже все действия производите.

 
DDFedor:

впереди всей конструкции проверьте объект на его существование ObjectFind(), а затем уже все действия производите.

Сделал, но каждоразового срабатывания всё равно не получается... :(
 
TarasBY:
Сделал, но каждоразового срабатывания всё равно не получается... :(

и каковЫ действия, на "найден" и "НЕ найден"? закоментарьте всю рабочую конструкцию внутри ObjectFind(), оставьте лишь принты лишь на ЭТИ действия, тогда будет видно - найден объект или нет, производить действия или нет. ( может быть не нужно удалять объект? мож пусть поживёт? хотя бы на время отладки....? )
 

А окошко обновляете после удаления объекта?

 
DDFedor:

и каковЫ действия, на "найден" и "НЕ найден"? закоментарьте всю рабочую конструкцию внутри ObjectFind(), оставьте лишь принты лишь на ЭТИ действия, тогда будет видно - найден объект или нет, производить действия или нет. ( может быть не нужно удалять объект? мож пусть поживёт? хотя бы на время отладки....? )
Вообще-то обозначенную в коде функцию я не могу засунуть внутрь условия if (ObjectFind()) так как упомянутая функция вызывается по требованию пользователя и вызывается к "жизни" изменением координат объекта.
Или я что-то не так понял?
 
Roger:

А окошко обновляете после удаления объекта?

Советник имеет сложный графический интерфейс и работает в цикле:

    if (Timer == true)
    {
        while (IsExpertEnabled())    // Пауза для изменения параметров советника
        {
            if (main() == 1)
            {return (0);}
            Sleep (Delay);
            if (timer_set() == 1)
            {return (0);}
            migalka = IIFb ((timercolor == Lime), false, true); // делаем мигалку для якорей
            WindowRedraw();
        }
    } 
Мы об одном и том же?
 

Просто дополните свое условие

if (ObjectFind("close")!=-1&&(ObjectGet ("close", OBJPROP_XDISTANCE) != 120 // закрыть все
    || ObjectGet ("close", OBJPROP_YDISTANCE) != 200))
 
TarasBY:

Мы об одном и том же?


Да, я это имел ввиду. Значит вилы в другом месте.
 
TarasBY:
Вообще-то обозначенную в коде функцию я не могу засунуть внутрь условия if (ObjectFind()) так как упомянутая функция вызывается по требованию пользователя и вызывается к "жизни" изменением координат объекта.
Или я что-то не так понял?


if (ObjectFind()) - должно быть первым условием при попытках работать с объектом. Тем более, если объект передвигается вручную(если объекта нет, т.е. был удалён намеренно или случайно, вся логика - рушится.бесполезная трата ресурсов и порождение ошибок ). ищите "верхнюю точку", чтобы самостоятельно включить "if (ObjectFind())" таким образом, чтобы проверка на существование объекта стала продолжением существующей логики.

"я не могу", часто можно заменить на "я не хочу"... надеюсь это не Ваш случай, потому как кроме вас это никому не нужно (непосредственно код).

 

Вроде все работает.

Файлы:
vitrade.mq4  8 kb
Причина обращения: