Автор | Сообщение |
|
| |
Пост N: 50
Зарегистрирован: 19.11.10
Откуда: Россия, Новочеркасск
|
|
Отправлено: 16.12.12 14:02. Заголовок: Поиск объектов ....
Привет ! вопрос в следующем как программно найти объект на графике или скопированный с другого объекта ... То есть есть линия или фигура , через контр + мышь сделал параллельную копию ... Как найти этот объект или узнать его имя ???
|
|
|
Ответов - 27
, стр:
1
2
3
All
[только новые]
|
|
|
| постоянный участник
|
Пост N: 552
Зарегистрирован: 03.09.09
|
|
Отправлено: 16.12.12 15:57. Заголовок: voldemar227 пишет: ..
voldemar227 пишет: цитата: | Как найти этот объект или узнать его имя ??? |
| По описанию. У дочернего объекта сохраняется описание родителя.
|
|
|
|
| |
Пост N: 51
Зарегистрирован: 19.11.10
Откуда: Россия, Новочеркасск
|
|
Отправлено: 17.12.12 12:40. Заголовок: я хочу сделать следу..
я хочу сделать следующее : при появлении ордера отрисовать линиию на цене открытия и при расдвоении ее либо добавлять профит либо добавлять стоп как в аг4 но что то моя голова не может сообразить ... Допустим мы открыли ордер появилась линия с именем "Op"+Ordertiket() и описанием ""+Ordertiket() я мышкой раздваиваю линию в верх , появляется вторая линия с именем Н12376846 и описанием ""+Ordertiket() как по описанию можно найти имя обьекта или его цену позиционирования ????
|
|
|
|
Отправлено: 17.12.12 13:17. Заголовок: voldemar227 пишет: ..
voldemar227 пишет: цитата: | как по описанию можно найти имя обьекта или его цену позиционирования ???? |
| Нужно запомнить описание исходного объекта. Потом перебрать в цикле все объекты. У каждого объекта спрашивать описание. И если это описание совпадает с описанием исходного объекта, но имеет другое имя, то это имя и есть именем нового объекта. Дальше у найденного объекта нужно спросить координату цены и дальше уже принять эту цену для управления торговлей. Обратите внимание: если на каком-то этапе на чарте будет более одного объекта с исходным описанием, то второй и все последующие объекты тоже нужно учитывать в переборе в цикле. Например, если есть линия ордера и уже есть StopLoss, то при установке TakeProfit нужно помнить два объекта, чтобы отбросить их при поиске нового (третьего) объекта. В качестве описания лучше всего использовать строку, содержащую тип и тикет ордера. Например, BB_12345 соответствует ордеру Buy с тикетом 12345, BL_54321 соотв. BuyLimit с тикетом 54321 и т.д.
|
|
|
|
| |
Пост N: 53
Зарегистрирован: 19.11.10
Откуда: Россия, Новочеркасск
|
|
Отправлено: 17.12.12 13:48. Заголовок: Да я это уже заметил..
Да я это уже заметил ! ))) Спасибо
|
|
|
|
| |
Пост N: 54
Зарегистрирован: 19.11.10
Откуда: Россия, Новочеркасск
|
|
Отправлено: 17.12.12 13:51. Заголовок: да и наверно это все..
да и наверно это все лучше делать в зацикленном цикле , дабы все делалось очень быстро !
|
|
|
|
| |
Пост N: 55
Зарегистрирован: 19.11.10
Откуда: Россия, Новочеркасск
|
|
Отправлено: 17.12.12 14:24. Заголовок: Я победил ! все рабо..
Я победил ! все работает как часы ! Вопрос в следующем , теперь еще более сложно если у ордера есть стоп лосс и тейк профит с линиями и я удалил линию как удалить тейк из под линии ? Мы же не имеем не имени не описания вообще ничего ....
|
|
|
|
| |
Пост N: 56
Зарегистрирован: 19.11.10
Откуда: Россия, Новочеркасск
|
|
Отправлено: 17.12.12 15:54. Заголовок: Вопрос в следующем ..
Вопрос в следующем , теперь еще более сложно если у ордера есть стоп лосс и тейк профит с линиями и я удалил линию как удалить тейк из под линии ? Мы же не имеем не имени не описания вообще ничего ....
|
|
|
|
| постоянный участник
|
Пост N: 554
Зарегистрирован: 03.09.09
|
|
Отправлено: 17.12.12 16:58. Заголовок: voldemar227 пишет: ..
voldemar227 пишет: цитата: | Мы же не имеем не имени не описания вообще ничего |
| Есть предыдущее состояние. С ним и нужно производить сравнение.
|
|
|
|
| |
Пост N: 57
Зарегистрирован: 19.11.10
Откуда: Россия, Новочеркасск
|
|
Отправлено: 17.12.12 18:41. Заголовок: я не понял как произ..
я не понял как произвести сравнение с тем чего уже нет ....
|
|
|
|
| постоянный участник
|
Пост N: 555
Зарегистрирован: 03.09.09
|
|
Отправлено: 17.12.12 21:40. Заголовок: voldemar227 пишет: ..
voldemar227 пишет: цитата: | я не понял как произвести сравнение с тем чего уже нет |
| Для этого нужно организовать сохранение предыдущего состояния отслеживаемых объектов в массиве. На каждой итерации нужно проверять наличие отслеживаемых объектов на графике. Как только какой-то объект не найден, это означает, что объект был удален. После этого совершаются нужные действия (которые соответствуют этому объекту), а удаленный объект вычеркивается из массива отслеживаемых объектов.
|
|
|
|
| |
Пост N: 58
Зарегистрирован: 19.11.10
Откуда: Россия, Новочеркасск
|
|
Отправлено: 17.12.12 21:46. Заголовок: Ок спасибо за операт..
Ок спасибо за оперативность !
|
|
|
|
|
| |
Пост N: 59
Зарегистрирован: 19.11.10
Откуда: Россия, Новочеркасск
|
|
Отправлено: 18.12.12 16:59. Заголовок: for(int oo=1;oo &..
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 но почему то компилятор пишет что не верны сравниваемые типы
|
|
|
|
| |
Пост N: 60
Зарегистрирован: 19.11.10
Откуда: Россия, Новочеркасск
|
|
Отправлено: 18.12.12 18:30. Заголовок: Scriptong пишет: а..
Scriptong пишет: цитата: | а удаленный объект вычеркивается из массива отслеживаемых объектов. |
| Вот тут тоже проблема ... Линия удалена но функция comment(); пишет что в ячейке имя осталось .... Я пробовал делать что если обьектфинд не находит линию то перезаписывать ячейку пустотой "" , но тоже результата не дало ...
|
|
|
|
| постоянный участник
|
Пост N: 559
Зарегистрирован: 03.09.09
|
|
Отправлено: 18.12.12 18:58. Заголовок: voldemar227 пишет: ..
voldemar227 пишет: цитата: | массивы типа string но почему то компилятор пишет что не верны сравниваемые типы |
| Массивы Mas_tek и Mas_old объявлены как string? Тогда ничего удивительного нет: компилятор правильно указывает на тот факт, что значение переменной типа int (переменная цикла) не может сравниваться со значением строковой переменной. voldemar227 пишет: цитата: | Вот тут тоже проблема ... Линия удалена но функция comment(); пишет что в ячейке имя осталось .... Я пробовал делать что если обьектфинд не находит линию то перезаписывать ячейку пустотой "" , но тоже результата не дало ... |
| Нужно смотреть весь код, как составлен алгоритм, как происходит запись данных и их сравнение между собой.
|
|
|
|
| |
Пост N: 61
Зарегистрирован: 19.11.10
Откуда: Россия, Новочеркасск
|
|
Отправлено: 18.12.12 20:09. Заголовок: string ordertiket=..
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); } } //+------------------------------------------------------------------+ Это весь код
|
|
|
|
Отправлено: 18.12.12 20:40. Заголовок: На этой стадии (у на..
На этой стадии (у нас) возникает естественный вопрос: правильно ли мы понимаем, что Вас чем-то не устраивает AG 4? Если это так, то опишите, пожалуйста, причины. Что Вы хотели бы улучшить? Возможно, что-то мешает (лишний функционал). Чего не хватает? Возможно, дело в условиях лицензирования или просто в желании иметь собственную программу?
|
|
|
|
| постоянный участник
|
Пост N: 560
Зарегистрирован: 03.09.09
|
|
Отправлено: 18.12.12 20:43. Заголовок: voldemar227 пишет: ..
voldemar227 пишет: Слишком вольное программирование: 1. Какой смысл копировать один массив в другой, если массив, в который производилось копирование, очищается практически в следующей строке кода после копирования? 2. Функция ArrayInitialize не может применена к строковому массиву. Уточните этот момент в справке. Там явно указано, что массив должен быть числовой. 3. Массив Mas_tek во втором измерении содержит три элемента, но в коде используется четвертый элемент, что недопустимо (индекс последнего элемента в таких массивах - 2): цитата: | Mas_tek[Kol][3] =name; //по стопу |
| 4. Что подразумевалось получить в конструкции такого типа, если в этом элементе массива ничего не записано? цитата: | StrToInteger(Mas_old[0][0]) |
|
|
|
|
|
| |
Пост N: 62
Зарегистрирован: 19.11.10
Откуда: Россия, Новочеркасск
|
|
Отправлено: 18.12.12 21:25. Заголовок: Scriptong пишет: 4...
Scriptong пишет: цитата: | 4. Что подразумевалось получить в конструкции такого типа, если в этом элементе массива ничего не записано? цитата: StrToInteger(Mas_old[0][0]) |
| Я хотел запустить цикл для сравнения старого массива и нового У меня цель сделать модернизацию ордеров как в аг 4 установление линий тейк профита и модернизация и удаление по линиям с массивами раньше не работал по этому представление имею слабое
|
|
|
|
| |
Пост N: 63
Зарегистрирован: 19.11.10
Откуда: Россия, Новочеркасск
|
|
Отправлено: 18.12.12 21:43. Заголовок: SK пишет: На этой ..
SK пишет: цитата: | На этой стадии (у нас) возникает естественный вопрос: правильно ли мы понимаем, что Вас чем-то не устраивает AG 4? Если это так, то опишите, пожалуйста, причины. Что Вы хотели бы улучшить? Возможно, что-то мешает (лишний функционал). Чего не хватает? Возможно, дело в условиях лицензирования или просто в желании иметь собственную программу? |
| У меня есть сайт (с вашим он не сравница так как мой сайт слабоват ) на котором я выкладываю советников по партнерской программе ... Дополнительный пассивный доход... По мимо торгов на форексе , нет такой психологической нагрузки когда понимаешь что яйца лежат по разным карманам ... И есть программка тестер trading-go называется посмотреть можно тут http://trading-go.ru/index.php которая как и афтограф 4 выставляет ордера с графика .... Но модернизация ордеров в ней очень плохо построена ... Я не хочу нагружать программу разными фишками и возможностями .... программа останется такой какая она сейчас есть . Я хочу переработать модернизацию ордеров .... и ни чего больше ... Вы оказали большую помощь мне не только по поводу данной проблемы но и по поводу других моих вопросов .... В знак благодарности я сделаю ссылку на ваш сайт с выражением оной . И также создам пост посвященный аг4 или чему вы пожелаете... По поводу вашего вопроса цитата: | На этой стадии (у нас) возникает естественный вопрос: правильно ли мы понимаем, что Вас чем-то не устраивает AG 4? Если это так, то опишите, пожалуйста, причины. Что Вы хотели бы улучшить? Возможно, что-то мешает (лишний функционал). Чего не хватает? Возможно, дело в условиях лицензирования или просто в желании иметь собственную программу? |
| я буду с вами честен : За 7 лет работы на форексе я не встречал людей использующих аг4 , на вопрос какой тестер я мог бы посоветовать для тестирования тактик я всегда говорил аг4 так как лучше я ничего не видел ... и через короткое время слышал отзыв : да программа крутая , неужели это все на мкл4 написано, но сложная, в ней пока разберешься пока сделаешь то что хочешь можно депо слить ... Мое мнение ( может оно ничего и не стоит ) не стоит делать одну такую сложную программу .... Лучше сделать несколько которые делают разные вещи и чем проще тем лучше ..... может можно все включить в одну программу но отключать блоки ...... Например мне не нужно установка своих торговых тактик, меня полностью устраивал аг 1 , мне не нужны все эти модификации с обьектами .... только открытие и модификация ордеров так как я торгую в основном руками .... Вобщем основной негативный отзыв сложно, запутанно , 95 % фишек только мешают, и не всегда работает ....... Может есть смысл сделать лайт нормал и про версии......
|
|
|
|
| |
Пост N: 64
Зарегистрирован: 19.11.10
Откуда: Россия, Новочеркасск
|
|
Отправлено: 19.12.12 09:39. Заголовок: Моя логика такова ..
Моя логика такова 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); } } |
|
|
|
|
|
| постоянный участник
|
Пост N: 561
Зарегистрирован: 03.09.09
|
|
Отправлено: 19.12.12 11:34. Заголовок: voldemar227 пишет: ..
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] = "нет линии"; } |
|
|
|
|
|
|
| |
Пост N: 65
Зарегистрирован: 19.11.10
Откуда: Россия, Новочеркасск
|
|
Отправлено: 19.12.12 12:00. Заголовок: for (int i=0; i..
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; } } } } //----------------------------------------------------------------------------------------------// } } Не могу понять почему не заполняется массив именами что не так ???? Условия для записи есть ...
|
|
|
|
Отправлено: 19.12.12 13:15. Заголовок: voldemar227 пишет: ..
voldemar227 пишет: цитата: | Мое мнение ( может оно ничего и не стоит ) не стоит делать одну такую сложную программу .... Лучше сделать несколько которые делают разные вещи и чем проще тем лучше ..... может можно все включить в одну программу но отключать блоки ...... Например мне не нужно установка своих торговых тактик, меня полностью устраивал аг 1 , мне не нужны все эти модификации с обьектами .... только открытие и модификация ордеров так как я торгую в основном руками. |
|
Спасибо за лестный отзыв и Ваше мнение. В целом понятно. Коротко скажу, что в новый AG4M мы заложим тот же функционал, что и в AG 4, и ещё кое-что добавим. Основным отличием будет новый виндовый интерфейс, - с кнопками, полями для ввода значений, панелями настроек и пр. В частности, кнопки управления инструментами будут собраны на отдельной панели, которую при желании можно просто отключить, а потом при необходимости включить. Таким образом, новый AG4M в минимальной конфигурации видимости панелей будет представлен только небольшим тулбаром, из меню которого можно открыть любые панели и настройки. Разбивать программу на части мы не будем, т.к., во-первых, все составляющие взаимно дополняют друг друга; во-вторых, затруднительно запустить одновременно несколько программ на одном терминале, если пользователю требуется полный функционал. Ещё раз спасибо.
|
|
|
|
| |
Пост N: 66
Зарегистрирован: 19.11.10
Откуда: Россия, Новочеркасск
|
|
Отправлено: 19.12.12 16:30. Заголовок: может подскажите ста..
может подскажите статью где можно детально разобраться с массивами ????
|
|
|
|
Отправлено: 20.12.12 02:35. Заголовок: voldemar227 пишет: ..
voldemar227 пишет: цитата: | может подскажите статью где можно детально разобраться с массивами ???? |
|
Попробуйте посмотреть в учебнике по MQL 4. Если этого не достаточно, задайте вопрос на форуме в соотв. теме.
|
|
|
|
Отправлено: 20.12.12 02:56. Заголовок: voldemar227 пишет: ..
voldemar227 пишет: цитата: | Не могу понять почему не заполняется массив именами что не так ???? Условия для записи есть ... |
|
Так иногда бывает.. Чтобы найти ошибку, необходимо последовательно исключать некоторую часть кода, пока источник ошибки не станет явным. Например, в последнем фрагменте анализируется тип ордера : if (ObjectType(name)== OBJ_HLINE) Если эту строку и скобки удалить, будет малость полегче. Для явного контроля массивов распечатывайте оба массива в Alert или Print и сравнивайте. При отладке программ подобное приходится делать постоянно, иначе сколько-нибудь сложную программу просто не написать..
|
|
|
|
| |
Пост N: 1
Зарегистрирован: 24.09.16
|
|
Отправлено: 24.09.16 18:36. Заголовок: Спасибо за советы!..
Спасибо за советы!
|
|
|
Ответов - 27
, стр:
1
2
3
All
[только новые]
|
|