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

 
BoraBo:

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


Вот такая конструкция (аналогичная):

    if (ObjectFind ("rule") != -1 && (ObjectGet ("rule", OBJPROP_XDISTANCE) != 120 // правило 
    || ObjectGet ("rule", OBJPROP_YDISTANCE) != 140))
    {
        Sleep (2000);
        DelObj ("rule");
        if (confirm ("ИЗМЕНЯЕМ ПРАВИЛО. \nПродолжить?", "Подтверждение операции", MB_YESNO) == IDYES)
        {
            Sleep (3000);
            Basket_Conditions = IIFi ((Basket_Conditions == 0), 1, IIFi ((Basket_Conditions == 1), 2, 0));
        }
        return (1);
    }
    else
        {fGetLastError ("obj_check(): Find (rule)");}

всё равно работает через раз, а когда не срабатывает в лог никаких ошибок не пишет (fGetLastError()).

Зато очень интересно ведёт себя вот такая конструкция:

    if (ObjectFind ("rule") != -1 && (ObjectGet ("rule", OBJPROP_XDISTANCE) != 120 // правило 
    || ObjectGet ("rule", OBJPROP_YDISTANCE) != 140))
    {
        Sleep (2000);
        DelObj ("rule");
        if (confirm ("ИЗМЕНЯЕМ ПРАВИЛО. \nПродолжить?", "Подтверждение операции", MB_YESNO) == IDYES)
        {
            Sleep (3000);
            Basket_Conditions = IIFi ((Basket_Conditions == 0), 1, IIFi ((Basket_Conditions == 1), 2, 0));
        }
        return (1);
    }
    else
        {
        DelObj ("rule");
            fGetLastError ("obj_check(): Find (rule)");
        }

 Я добавил, в с лучае не выполнения начального условия - удаление объекта (DelObj ("rule")). Так вот объкт вообще исчез с графика!!! Что-бы это могло значить???

Объекты на графике рисуются с помощью функции:

//+------------------------------------------------------------------+
//|     ВЫВОД ОБЪЕКТА С ЗАДАННЫМИ ПАРАМЕТРАМИ                        |
//+------------------------------------------------------------------+
void Object_field (string name, string text, int X, int Y, int size, string Srift, color CL1, color CL2, int Corner = 0, int Angle = 0)
{
    if (ObjectFind (name) == -1)
    {ObjectCreate (name, OBJ_LABEL, 0, 0, 0);}
    ObjectSet (name, OBJPROP_COLOR, CL1);
    ObjectSet (name, OBJPROP_XDISTANCE, X);
    ObjectSet (name, OBJPROP_YDISTANCE, Y);
    ObjectSet (name, OBJPROP_CORNER, Corner);
    if (Angle > 0)
    {ObjectSet (name, OBJPROP_ANGLE, Angle);}
    ObjectSetText (name, text, size, Srift, CL2);
//----
    return;   
}

И вывод конкретного объекта прописан:

    Object_field ("rule", text, 120, 140, 10, "Calibri Bold", CLR_NONE, CL);

 

Перевариваю полученные результаты - пока нет соображений по данному наблюдению... 

 

По вырезкам из кода тяжело судить.

Вы сделайте отдельный маленький советник, который смоделирует вашу ситуацию.

 
    if (ObjectFind ("rule") != -1 && (ObjectGet ("rule", OBJPROP_XDISTANCE) != 120 // правило 
    || ObjectGet ("rule", OBJPROP_YDISTANCE) != 140))
создавая аналогию логики можно перефразировать... "если эта машина приехала и она зелёного цвета"... зачем нагружать условие проверкой цвета, если МАШИНА НЕ ПРИЕХАЛА? "Разделяй и властвуй"... сначала проверка на "приехала ли машина", а затем "на её принадлежность к зелени"... разделите условия. основное условие - "если объект найден". ВЛОЖЕННЫЕ внутрь - "если имеют определённые координаты".
 
//------------------------------------------------------------------------------------------
void drawline(string name,double pr1,datetime tim1,datetime tim2,color col, int type=OBJ_TREND,int with=2){
   if (!ObjectSet(name,OBJPROP_PRICE1, pr1)){if(ObjectCreate(name, type,0, tim1,0, tim2,0)){
                                                          ObjectSet(name,OBJPROP_PRICE1, pr1);
                                                          ObjectSet(name,OBJPROP_COLOR, col);
                                                          ObjectSet(name,OBJPROP_RAY, 0);
                                                          if (type==OBJ_TREND)ObjectSet(name,OBJPROP_WIDTH, with);
                                        } else Print("Ошибка № ",GetLastError(), " при создании обьекта price ", pr1);
   }
   ObjectSet(name,OBJPROP_PRICE2, pr1);
}
//------------------------------------------------------------------------------------------

вызываю так:

drawline("line0",Close[0],Time[0],Time[0],LightGreen,OBJ_HLINE);   - это линия с меткой цены

drawline(name,Ask,Time[tim],Time[tim+linewith],Red);  это отрезок трендовой линии

в отличии от Вашего кода я не ищу обьект с именем, я пытаюсь установить необходимый параметр обьекта, если произошла ошибка, пытаюсь создать обьект, если и там ошибка, тогда вывожу в журнал - пока работает как часы, проблем не наблюдал ни разу  

 
BoraBo:

По вырезкам из кода тяжело судить.

Вы сделайте отдельный маленький советник, который смоделирует вашу ситуацию.


Какая разница: большой или маленький - я прослеживаю судьбу одного единственного объекта!

Немножко пошаманив получил вообще впечатляющие результаты, сначала код:

    if (FindObject ("rule") && (ObjectGet ("rule", OBJPROP_XDISTANCE) != 120)) // правило 
    //|| ObjectGet ("rule", OBJPROP_YDISTANCE) != 140))
    {
        Sleep (2000);
        DelObj ("rule");
        if (confirm ("ИЗМЕНЯЕМ ПРАВИЛО. \nПродолжить?", "Подтверждение операции", MB_YESNO) == IDYES)
        {
            Sleep (3000);
            Basket_Conditions = IIFi ((Basket_Conditions == 0), 1, IIFi ((Basket_Conditions == 1), 2, 0));
        }
        return (1);
    }
    else
        {
        Print ("FindObject = ", CheckBOOL (FindObject ("rule")), "; Координата X = ", ObjectGet ("rule", OBJPROP_XDISTANCE), "; КООРДИНАТА Y = ", ObjectGet ("rule", OBJPROP_YDISTANCE));
            fGetLastError ("obj_check(): Find (rule)");
        }

Пояснение: создал функцию по подобию Вашей (DelObj()) - FindObject() с перебором всех объектов чарта. Пробовал уменьшать количестов условий (убирал сравнение координаты Y).

В лог без вызова (смещения объекта)  получаем следующее:

2010.09.29 09:23:54 e-PSI@BasketBull GBPCHF,H4: FindObject = Да; Координата X = 120; КООРДИНАТА Y = 140
2010.09.29 09:23:48 e-PSI@BasketBull GBPCHF,H4: FindObject = Да; Координата X = 120; КООРДИНАТА Y = 140
2010.09.29 09:23:44 e-PSI@BasketBull GBPCHF,H4: FindObject = Да; Координата X = 120; КООРДИНАТА Y = 140

При вызове условия (смещение объекта) - ничего не происходит, ошибок не пишет...

Ситуация - "крыша поехала". Или я что-то гне догоняю?! :(
 

 
IgorM:

вызываю так:

drawline("line0",Close[0],Time[0],Time[0],LightGreen,OBJ_HLINE);   - это линия с меткой цены

drawline(name,Ask,Time[tim],Time[tim+linewith],Red);  это отрезок трендовой линии

в отличии от Вашего кода я не ищу обьект с именем, я пытаюсь установить необходимый параметр обьекта, если произошла ошибка, пытаюсь создать обьект, если и там ошибка, тогда вывожу в журнал - пока работает как часы, проблем не наблюдал ни разу  

Кто-то из нас двоих чего-то не догоняет!!! Вы мой вопрос на первой страничке прочитали? С рисованием объекта проблем нет. Мне необходимо путём изменения координат объекта запустить пользовательскую функцию или (по ситуации) изменить значение переменной!!! Я понятно изъясняюсь?
 
TarasBY:

Какая разница: большой или маленький - я прослеживаю судьбу одного единственного объекта!



Согласен, не важно большой или маленький, просто основным было создать отдельный советник без лишнего кода, который смоделирует вашу ситуацию.

Чтобы его можно было запустить и посмотреть. Обычно у меня при попытке смоделировать ошибочную ситуацию все решается.

 
TarasBY:
Кто-то из нас двоих чего-то не догоняет!!! Вы мой вопрос на первой страничке прочитали? С рисованием объекта проблем нет. Мне необходимо путём изменения координат объекта запустить пользовательскую функцию или (по ситуации) изменить значение переменной!!! Я понятно изъясняюсь?


если у Вас нет проблем с рисованием, то у Вас не должно быть проблем с использованием ф-ции ObjectGet()

если через ObjectGet Вы не можете получить результат, у Вас либо отсутствует обьект с таким именем, либо у обьекта отсутствую запрашиваемые Вами параметры

всё! пример я привел на Ваш пример ф-ции 

//+------------------------------------------------------------------+
//| ВЫВОД ОБЪЕКТА С ЗАДАННЫМИ ПАРАМЕТРАМИ |
//+------------------------------------------------------------------+
void Object_field (s

там тож Вы не проверяете создался обьект или нет и в журнал ошибку не выводите

успехов
 

 
DDFedor:
создавая аналогию логики можно перефразировать... "если эта машина приехала и она зелёного цвета"... зачем нагружать условие проверкой цвета, если МАШИНА НЕ ПРИЕХАЛА? "Разделяй и властвуй"... сначала проверка на "приехала ли машина", а затем "на её принадлежность к зелени"... разделите условия. основное условие - "если объект найден". ВЛОЖЕННЫЕ внутрь - "если имеют определённые координаты".

Ваши замечания скорее лежат в плоскости философии рациональности кода, но не влияют на решение возникшей задачи. Я демонстрирую, что все заданные условия выполняются (см.лог): 

1) - объект существует;
2) - координаты соответствуют заданным при создании объекта и дублируются при проверке на смещение.

Но лучшее, чего мне удалось добиться: это срабатывание на второй попытке, после того как после первой попытки (безрезультатной), я через "Список объектов" удаляю этот ранее выделенный, перемещённый и затем возвращённый на прежнее место объект.

Остются два вопроса:

1) Почему не срабатывает с первого раза?

2) И как с этим бороться? 

 
IgorM:


если у Вас нет проблем с рисованием, то у Вас не должно быть проблем с использованием ф-ции ObjectGet()

если через ObjectGet Вы не можете получить результат, у Вас либо отсутствует обьект с таким именем, либо у обьекта отсутствую запрашиваемые Вами параметры

всё! пример я привел на Ваш пример ф-ции 

//+------------------------------------------------------------------+
//| ВЫВОД ОБЪЕКТА С ЗАДАННЫМИ ПАРАМЕТРАМИ |
//+------------------------------------------------------------------+
void Object_field (s

там тож Вы не проверяете создался обьект или нет и в журнал ошибку не выводите

успехов
 

Я очень подробно объяснил с примерами кода и записями в лог: объект существует, но при этом существует и вышеописанная проблема.

По поводу проверки факта создания  объекта внутри создающей его функции. Код: 

void Function()
{
    int err = GetLastError();
// рисуем объекты
    Object_field();
    Object_field();
    Object_field();
    Object_field();
    Object_field();
// рисуем много объектов
    fGetLastError ("Function():"); // Проверяем на ошибку
    return;
}
Если какой-то объект не создастся - последнюю ошибку я увижу. Но их, как ни старнно нет!!!



Причина обращения: