Форум » Синтаксис языка » Поиск объектов .... » Ответить

Поиск объектов ....

voldemar227: Привет ! вопрос в следующем как программно найти объект на графике или скопированный с другого объекта ... То есть есть линия или фигура , через контр + мышь сделал параллельную копию ... Как найти этот объект или узнать его имя ???

Ответов - 27, стр: 1 2 3 All

Scriptong: voldemar227 пишет: Как найти этот объект или узнать его имя ??? По описанию. У дочернего объекта сохраняется описание родителя.

voldemar227: я хочу сделать следующее : при появлении ордера отрисовать линиию на цене открытия и при расдвоении ее либо добавлять профит либо добавлять стоп как в аг4 но что то моя голова не может сообразить ... Допустим мы открыли ордер появилась линия с именем "Op"+Ordertiket() и описанием ""+Ordertiket() я мышкой раздваиваю линию в верх , появляется вторая линия с именем Н12376846 и описанием ""+Ordertiket() как по описанию можно найти имя обьекта или его цену позиционирования ????

SK: voldemar227 пишет: как по описанию можно найти имя обьекта или его цену позиционирования ???? Нужно запомнить описание исходного объекта. Потом перебрать в цикле все объекты. У каждого объекта спрашивать описание. И если это описание совпадает с описанием исходного объекта, но имеет другое имя, то это имя и есть именем нового объекта. Дальше у найденного объекта нужно спросить координату цены и дальше уже принять эту цену для управления торговлей. Обратите внимание: если на каком-то этапе на чарте будет более одного объекта с исходным описанием, то второй и все последующие объекты тоже нужно учитывать в переборе в цикле. Например, если есть линия ордера и уже есть StopLoss, то при установке TakeProfit нужно помнить два объекта, чтобы отбросить их при поиске нового (третьего) объекта. В качестве описания лучше всего использовать строку, содержащую тип и тикет ордера. Например, BB_12345 соответствует ордеру Buy с тикетом 12345, BL_54321 соотв. BuyLimit с тикетом 54321 и т.д.


voldemar227: Да я это уже заметил ! ))) Спасибо

voldemar227: да и наверно это все лучше делать в зацикленном цикле , дабы все делалось очень быстро !

voldemar227: Я победил ! все работает как часы ! Вопрос в следующем , теперь еще более сложно если у ордера есть стоп лосс и тейк профит с линиями и я удалил линию как удалить тейк из под линии ? Мы же не имеем не имени не описания вообще ничего ....

voldemar227: Вопрос в следующем , теперь еще более сложно если у ордера есть стоп лосс и тейк профит с линиями и я удалил линию как удалить тейк из под линии ? Мы же не имеем не имени не описания вообще ничего ....

Scriptong: voldemar227 пишет: Мы же не имеем не имени не описания вообще ничего Есть предыдущее состояние. С ним и нужно производить сравнение.

voldemar227: я не понял как произвести сравнение с тем чего уже нет ....

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

voldemar227: Ок спасибо за оперативность !

voldemar227: for(int oo=1;oo <= Mas_old[0][0]; oo++) { for (int ii=1;i <= Mas_tek[0][0];ii++) { if (Mas_tek[ii][1] == Mas_old[oo][1]) { Print("profit totge"); } if (Mas_tek[ii][2] == Mas_old[oo][2]) { Print("stop totge"); } } } массивы типа string но почему то компилятор пишет что не верны сравниваемые типы

voldemar227: Scriptong пишет: а удаленный объект вычеркивается из массива отслеживаемых объектов. Вот тут тоже проблема ... Линия удалена но функция comment(); пишет что в ячейке имя осталось .... Я пробовал делать что если обьектфинд не находит линию то перезаписывать ячейку пустотой "" , но тоже результата не дало ...

Scriptong: voldemar227 пишет: массивы типа string но почему то компилятор пишет что не верны сравниваемые типы Массивы Mas_tek и Mas_old объявлены как string? Тогда ничего удивительного нет: компилятор правильно указывает на тот факт, что значение переменной типа int (переменная цикла) не может сравниваться со значением строковой переменной. voldemar227 пишет: Вот тут тоже проблема ... Линия удалена но функция comment(); пишет что в ячейке имя осталось .... Я пробовал делать что если обьектфинд не находит линию то перезаписывать ячейку пустотой "" , но тоже результата не дало ... Нужно смотреть весь код, как составлен алгоритм, как происходит запись данных и их сравнение между собой.

voldemar227: string ordertiket=""; //---------------------------------------------------------------------------// string Mas_tek[31][3],Mas_old [31][3]; //---------------------------------------------------------------------------// int start() { while(!IsStopped()) { string name; //---------------------------------------------------------------------------// ArrayCopy(Mas_tek, Mas_old);//сохраняем историю int Kol=0; //колличество ордеров ArrayInitialize(Mas_tek,0); //обнуляем массив //---------------------------------------------------------------------------// for (int i=0; i<OrdersTotal(); i++) { if((OrderSelect(i, SELECT_BY_POS)==true) && (OrderSymbol()==Symbol())) {ordertiket=DoubleToStr(OrderTicket(),0); Kol++; //----------------------------------------------------------------------------------------------// if (ObjectFind(ordertiket)==-1) { ObjectCreate (ordertiket,OBJ_HLINE,0,0,OrderOpenPrice()); ObjectSetText(ordertiket,ordertiket); } if (OrderType()==OP_BUY) { for (int x=0;x<=ObjectsTotal()-1;x++) { name=ObjectName(x); if (ObjectType(name)== OBJ_HLINE) { if (ObjectFind(name)==0&&name==ordertiket) { Mas_tek[Kol][1] = ordertiket; //по открытию } if (ObjectDescription(name)==ordertiket&&OrderOpenPrice()<ObjectGet(name,OBJPROP_PRICE1)&&ObjectGet(name,OBJPROP_PRICE1)>0) { Mas_tek[Kol][2] =name; //по профиту } if (ObjectDescription(name)==ordertiket&&OrderOpenPrice()>ObjectGet(name,OBJPROP_PRICE1)&&ObjectGet(name,OBJPROP_PRICE1)>0) { Mas_tek[Kol][3] =name; //по стопу } } } } //----------------------------------------------------------------------------------------------// } } /* for(int oo=1;oo <= StrToInteger(Mas_old[0][0]); oo++) { for (int ii=1;i <= StrToInteger(Mas_tek[0][0]);ii++) { if (Mas_tek[ii][1] == Mas_old[oo][1]) { Print("profit totge"); } else { Mas_tek[ii][1] = "нет линии";} if (Mas_tek[ii][2] == Mas_old[oo][2]) { Print("stop totge"); } else{Mas_tek[ii][2] = "нет линии";} } } */ Comment( " Цена открытия = ",Mas_tek[1][1], "\n"," Цена профита = ",Mas_tek[1][2], "\n"," Цена стопа = ",Mas_tek[1][3], "\n"," Тикет = ",ordertiket, "\n"," Обьекты = ",x); Sleep(50); } } //+------------------------------------------------------------------+ Это весь код

SK: На этой стадии (у нас) возникает естественный вопрос: правильно ли мы понимаем, что Вас чем-то не устраивает AG 4? Если это так, то опишите, пожалуйста, причины. Что Вы хотели бы улучшить? Возможно, что-то мешает (лишний функционал). Чего не хватает? Возможно, дело в условиях лицензирования или просто в желании иметь собственную программу?

Scriptong: voldemar227 пишет: Это весь код Слишком вольное программирование: 1. Какой смысл копировать один массив в другой, если массив, в который производилось копирование, очищается практически в следующей строке кода после копирования? 2. Функция ArrayInitialize не может применена к строковому массиву. Уточните этот момент в справке. Там явно указано, что массив должен быть числовой. 3. Массив Mas_tek во втором измерении содержит три элемента, но в коде используется четвертый элемент, что недопустимо (индекс последнего элемента в таких массивах - 2): Mas_tek[Kol][3] =name; //по стопу 4. Что подразумевалось получить в конструкции такого типа, если в этом элементе массива ничего не записано? StrToInteger(Mas_old[0][0])

voldemar227: Scriptong пишет: 4. Что подразумевалось получить в конструкции такого типа, если в этом элементе массива ничего не записано?  цитата: StrToInteger(Mas_old[0][0]) Я хотел запустить цикл для сравнения старого массива и нового У меня цель сделать модернизацию ордеров как в аг 4 установление линий тейк профита и модернизация и удаление по линиям с массивами раньше не работал по этому представление имею слабое

voldemar227: SK пишет: На этой стадии (у нас) возникает естественный вопрос: правильно ли мы понимаем, что Вас чем-то не устраивает AG 4? Если это так, то опишите, пожалуйста, причины. Что Вы хотели бы улучшить? Возможно, что-то мешает (лишний функционал). Чего не хватает? Возможно, дело в условиях лицензирования или просто в желании иметь собственную программу? У меня есть сайт (с вашим он не сравница так как мой сайт слабоват ) на котором я выкладываю советников по партнерской программе ... Дополнительный пассивный доход... По мимо торгов на форексе , нет такой психологической нагрузки когда понимаешь что яйца лежат по разным карманам ... И есть программка тестер trading-go называется посмотреть можно тут http://trading-go.ru/index.php которая как и афтограф 4 выставляет ордера с графика .... Но модернизация ордеров в ней очень плохо построена ... Я не хочу нагружать программу разными фишками и возможностями .... программа останется такой какая она сейчас есть . Я хочу переработать модернизацию ордеров .... и ни чего больше ... Вы оказали большую помощь мне не только по поводу данной проблемы но и по поводу других моих вопросов .... В знак благодарности я сделаю ссылку на ваш сайт с выражением оной . И также создам пост посвященный аг4 или чему вы пожелаете... По поводу вашего вопроса На этой стадии (у нас) возникает естественный вопрос: правильно ли мы понимаем, что Вас чем-то не устраивает AG 4? Если это так, то опишите, пожалуйста, причины. Что Вы хотели бы улучшить? Возможно, что-то мешает (лишний функционал). Чего не хватает? Возможно, дело в условиях лицензирования или просто в желании иметь собственную программу? я буду с вами честен : За 7 лет работы на форексе я не встречал людей использующих аг4 , на вопрос какой тестер я мог бы посоветовать для тестирования тактик я всегда говорил аг4 так как лучше я ничего не видел ... и через короткое время слышал отзыв : да программа крутая , неужели это все на мкл4 написано, но сложная, в ней пока разберешься пока сделаешь то что хочешь можно депо слить ... Мое мнение ( может оно ничего и не стоит ) не стоит делать одну такую сложную программу .... Лучше сделать несколько которые делают разные вещи и чем проще тем лучше ..... может можно все включить в одну программу но отключать блоки ...... Например мне не нужно установка своих торговых тактик, меня полностью устраивал аг 1 , мне не нужны все эти модификации с обьектами .... только открытие и модификация ордеров так как я торгую в основном руками .... Вобщем основной негативный отзыв сложно, запутанно , 95 % фишек только мешают, и не всегда работает ....... Может есть смысл сделать лайт нормал и про версии......

voldemar227: Моя логика такова voldemar227 пишет: string ordertiket=""; // текстовая переменная на глоб уровне //---------------------------------------------------------------------------// string Mas_tek[31][3],Mas_old [31][3]; // обьявление стрингового массива для 31 ордера по три ячейки для каждого //---------------------------------------------------------------------------// int start() { while(!IsStopped()) //цикл для быстроты работы { string name; // переменная для имен линий //---------------------------------------------------------------------------// ArrayCopy(Mas_tek, Mas_old);//сохраняем историю int Kol=0; //колличество ордеров //---------------------------------------------------------------------------// for (int i=0; i<OrdersTotal(); i++) // цикл по ордерам { if((OrderSelect(i, SELECT_BY_POS)==true) && (OrderSymbol()==Symbol())) {ordertiket=DoubleToStr(OrderTicket(),0); // переводим интовское значение тикета в тип стринг Kol++; //----------------------------------------------------------------------------------------------// if (ObjectFind(ordertiket)==-1) если центральной линии нет создать линию с именем тикета { ObjectCreate (ordertiket,OBJ_HLINE,0,0,OrderOpenPrice()); ObjectSetText(ordertiket,ordertiket); // сделать описание именем тикета } if (OrderType()==OP_BUY) // если ордер бай { for (int x=0;x<=ObjectsTotal()-1;x++) // цикл по перебору и поиску новых обьектов { name=ObjectName(x); // вернули имя обьекта if (ObjectType(name)== OBJ_HLINE) //если горизонтальная линия { if (ObjectFind(name)==0&&name==ordertiket) // если есть линия с именем тикета и описанием тикита значит это центральная линия { Mas_tek[Kol][1] = ordertiket; //запомнить имя в ячейку 1 первого ордера } if (ObjectDescription(name)==ordertiket&&OrderOpenPrice()<ObjectGet(name,OBJPROP_PRICE1)&&ObjectGet(name,OBJPROP_PRICE1)>0) // если есть обьект с описанием тикета и обьект выше цены открытия значит это новая линия для тейк профита { Mas_tek[Kol][2] =name; //запомним ее имя во вторую ячейку первого ордера } if (ObjectDescription(name)==ordertiket&&OrderOpenPrice()>ObjectGet(name,OBJPROP_PRICE1)&&ObjectGet(name,OBJPROP_PRICE1)>0) // если есть обьект с описанием тикета и обьект нгиже цены открытия значит это новая линия для стоп лосса { Mas_tek[Kol][3] =name; //запомним ее имя в третью ячейку первого ордера } } } } //----------------------------------------------------------------------------------------------// } } // с циклом сравнения вообще ничего не получилось так как пишет что не верны типеы сравниваемых данных // в документации я так и не нашол как сравнить массивы типа стринг /* for(int oo=1;oo <= StrToInteger(Mas_old[0][0]); oo++) { for (int ii=1;i <= StrToInteger(Mas_tek[0][0]);ii++) { if (Mas_tek[ii][1] == Mas_old[oo][1]) { Print("profit totge"); } else { Mas_tek[ii][1] = "нет линии";} if (Mas_tek[ii][2] == Mas_old[oo][2]) { Print("stop totge"); } else{Mas_tek[ii][2] = "нет линии";} } } */ Comment( " Цена открытия = ",Mas_tek[1][1], "\n"," Цена профита = ",Mas_tek[1][2], "\n"," Цена стопа = ",Mas_tek[1][3], "\n"," Тикет = ",ordertiket, "\n"," Обьекты = ",x); Sleep(50); } }

Scriptong: voldemar227 пишет: Я хотел запустить цикл для сравнения старого массива и нового Понятно. Тогда нужно сделать так: for (int ii = 0; ii < ArrayRange(Mas_tek, 1); ii++) { if (Mas_tek[ii][1] == Mas_old[ii][1]) Print("profit totge"); else Mas_tek[ii][1] = "нет линии"; if (Mas_tek[ii][2] == Mas_old[ii][2]) Print("stop totge"); else Mas_tek[ii][2] = "нет линии"; }

voldemar227: for (int i=0; i<OrdersTotal(); i++) { if((OrderSelect(i, SELECT_BY_POS)==true) && (OrderSymbol()==Symbol())) {ordertiket=DoubleToStr(OrderTicket(),0); Kol++; //----------------------------------------------------------------------------------------------// if (ObjectFind(ordertiket)==-1) { ObjectCreate (ordertiket,OBJ_HLINE,0,0,OrderOpenPrice()); ObjectSetText(ordertiket,ordertiket); } if (OrderType()==OP_BUY) { for (int x=0;x<=ObjectsTotal()-1;x++) { name=ObjectName(x); if (ObjectType(name)== OBJ_HLINE) { if (ObjectFind(name)==0&&name==ordertiket) { Mas_tek[Kol][0] = ordertiket; } if (ObjectDescription(name)==ordertiket&&OrderOpenPrice()<ObjectGet(name,OBJPROP_PRICE1)) { Mas_tek[Kol][1] =name; } if (ObjectDescription(name)==ordertiket&&OrderOpenPrice()>ObjectGet(name,OBJPROP_PRICE1)) { Mas_tek[Kol][2] =name; } } } } //----------------------------------------------------------------------------------------------// } } Не могу понять почему не заполняется массив именами что не так ???? Условия для записи есть ...

SK: voldemar227 пишет: Мое мнение ( может оно ничего и не стоит ) не стоит делать одну такую сложную программу .... Лучше сделать несколько которые делают разные вещи и чем проще тем лучше ..... может можно все включить в одну программу но отключать блоки ...... Например мне не нужно установка своих торговых тактик, меня полностью устраивал аг 1 , мне не нужны все эти модификации с обьектами .... только открытие и модификация ордеров так как я торгую в основном руками. Спасибо за лестный отзыв и Ваше мнение. В целом понятно. Коротко скажу, что в новый AG4M мы заложим тот же функционал, что и в AG 4, и ещё кое-что добавим. Основным отличием будет новый виндовый интерфейс, - с кнопками, полями для ввода значений, панелями настроек и пр. В частности, кнопки управления инструментами будут собраны на отдельной панели, которую при желании можно просто отключить, а потом при необходимости включить. Таким образом, новый AG4M в минимальной конфигурации видимости панелей будет представлен только небольшим тулбаром, из меню которого можно открыть любые панели и настройки. Разбивать программу на части мы не будем, т.к., во-первых, все составляющие взаимно дополняют друг друга; во-вторых, затруднительно запустить одновременно несколько программ на одном терминале, если пользователю требуется полный функционал. Ещё раз спасибо.

voldemar227: может подскажите статью где можно детально разобраться с массивами ????

SK: voldemar227 пишет: может подскажите статью где можно детально разобраться с массивами ???? Попробуйте посмотреть в учебнике по MQL 4. Если этого не достаточно, задайте вопрос на форуме в соотв. теме.

SK: voldemar227 пишет: Не могу понять почему не заполняется массив именами что не так ???? Условия для записи есть ... Так иногда бывает.. Чтобы найти ошибку, необходимо последовательно исключать некоторую часть кода, пока источник ошибки не станет явным. Например, в последнем фрагменте анализируется тип ордера : if (ObjectType(name)== OBJ_HLINE) Если эту строку и скобки удалить, будет малость полегче. Для явного контроля массивов распечатывайте оба массива в Alert или Print и сравнивайте. При отладке программ подобное приходится делать постоянно, иначе сколько-нибудь сложную программу просто не написать..

Enerawe: Спасибо за советы!



полная версия страницы