Получить имя объекта на текущем баре соседего графика. - страница 3

 
Tapochun:

Не придумывайте идеальных условий. Их не бывает. Ваша теория посыпется если добавить на график индикатор, строящий такие же объекты в тоже подокно, как и советник. Порядка не будет. Это два.

gip дело говорит. При создании своего кода достаточно придумать способ идентификации объектов по времени. Если на одно время выпадает более одного объекта, то дополнительно можно идентифицировать по цене. В итоге отпадает необходимость во всяческих переборах объектов.

Обходить момент с точно таким же индикатором или советником просто - в имя объекта добавляется уникальный ID, который вычисляется на старте программы. В итоге хоть десять одинаковых программ запускай. Каждая из этих программ будет оперировать только своими объектами, не мешая другим. 

И это не идеальные условия, а хорошо продуманная программа.  

Документация по MQL5: Стандартные константы, перечисления и структуры / Константы объектов / Свойства объектов
Документация по MQL5: Стандартные константы, перечисления и структуры / Константы объектов / Свойства объектов
  • www.mql5.com
Стандартные константы, перечисления и структуры / Константы объектов / Свойства объектов - справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
sanyooooook:

Если что, у Вас все объекты собраны в файл из которого Вы и можете получать доступ к объектам.

ЗЫ: или Вы не с копировщиком, а с разметчиком работаете?

Советник хороший, вы знаете. :) Хочу работать только с источником, без программ-посредников.

Спасибо за помощь!

 

Scriptong
:

gip дело говорит. При создании своего кода достаточно придумать способ идентификации объектов по времени. Если на одно время выпадает более одного объекта, то дополнительно можно идентифицировать по цене. В итоге отпадает необходимость во всяческих переборах объектов.

Обходить момент с точно таким же индикатором или советником просто - в имя объекта добавляется уникальный ID, который вычисляется на старте программы. В итоге хоть десять одинаковых программ запускай. Каждая из этих программ будет оперировать только своими объектами, не мешая другим. 

И это не идеальные условия, а хорошо продуманная программа.  

Ребята, если честно, мы все правы частично. Вот в таких спорах и рождается истина. gip и Вы правы в том, что не нужно перебирать каждый объект. Про то, что нужно придумать способ идентификации, тут я не спорил. gip ошибся в том, что:

объекты располагаются в порядке создания

Это не так. 

Вы же не совсем корректны в том, что нужно идентифицировать именно по времени.

Я же не прав в том, что:

 если добавить на график индикатор, строящий такие же объекты в тоже подокно, как и советник. Порядка не будет 

Решение наших заблуждений кроется в знании того, как сортируются объекты в терминале. А сортируются они достаточно очевидно. Все зависит от первого символа. Если первый символ совпадает, сравнивается второй и т.д. Сделал тест. Вот результаты:

Скриншоты торговой платформы MetaTrader

GBPUSD, M5, 2014.11.27

Alpari Limited, MetaTrader 5, Demo

temp_file_screenshot_44302.png

GBPUSD, M5, 2014.11.27, Alpari Limited, MetaTrader 5, Demo

Линии были нанесены не в том порядке, в котором были выведены в журнал. Как видно, приоритет (если не брать в расчет символы) у цифр, потом по английскому алфавиту (с приоритетом заглавных букв). Вот и весь секрет.

Вывод: для автора. Если хотите наиболее быструю сортировку (чтобы все ваши объекты в конце списка) добавьте в имя объекта (префиксом) маленькую "я". Да, русская буква "я". На скрине нет, ибо нашел после вставки. Можете проверить. Весь кириллический алфавит идет после тильды по приоритету. Далее, для всех объектов Вашего советника, как уже было сказано, указывайте точное время создания линии (в миллисекундах с помощью GetTickCount() ) с проверкой, чтобы несколько линий не создавались в одну миллисекунду (на всякий случай). Имя будет выглядеть так:

name = "я name "+IntegerToString( GetTickCount() );

Для перебора трендовых линий ( в главном окне текущего графика ) делать так:

int total = ObjectsTotal( 0, 0, OBJ_TREND );    
string name;                                                                                            
for( int i = total-1; i >= 0; i-- )
  {
   name = ObjectName( 0, i, 0, OBJ_TREND );       
   if( StringFind( "я", name ) == -1 ) break;   
   
   // Анализ... 

  }

Фуф... надеюсь поможет.

 

 


 
Tapochun:

Ребята, если честно, мы все правы частично. Вот в таких спорах и рождается истина. gip и Вы правы в том, что не нужно перебирать каждый объект. Про то, что нужно придумать способ идентификации, тут я не спорил. gip ошибся в том, что:

Это не так. 

Вы же не совсем корректны в том, что нужно идентифицировать именно по времени.

Я же не прав в том, что:

Решение наших заблуждений кроется в знании того, как сортируются объекты в терминале. А сортируются они достаточно очевидно. Все зависит от первого символа. Если первый символ совпадает, сравнивается второй и т.д. Сделал тест. Вот результаты:

Линии были нанесены не в том порядке, в котором были выведены в журнал. Как видно, приоритет (если не брать в расчет символы) у цифр, потом по английскому алфавиту (с приоритетом заглавных букв). Вот и весь секрет.

Вывод: для автора. Если хотите наиболее быструю сортировку (чтобы все ваши объекты в конце списка) добавьте в имя объекта (префиксом) маленькую "я". Да, русская буква "я". На скрине нет, ибо нашел после вставки. Можете проверить. Весь кириллический алфавит идет после тильды по приоритету. Далее, для всех объектов Вашего советника, как уже было сказано, указывайте точное время создания линии (в миллисекундах с помощью GetTickCount() ) с проверкой, чтобы несколько линий не создавались в одну миллисекунду (на всякий случай). Имя будет выглядеть так:

Для перебора трендовых линий ( в главном окне текущего графика ) делать так:

Фуф... надеюсь поможет.

Большое спасибо за ваши труды! Это действительно может помочь. Постараюсь впитать побольше светлых мыслей по этой теме с объектами. Сейчас пойду пробовать. Думаю вопрос будет решен благодаря вам!
 
WePlexus:
Большое спасибо за ваши труды! Это действительно может помочь. Постараюсь впитать побольше светлых мыслей по этой теме с объектами. Сейчас пойду пробовать. Думаю вопрос будет решен благодаря вам!

Да не за что. Сам узнал что-то новое. Только тут сам ошибся еще раз. Отвечал ночью. Вам нужна идентификация по открытию бара, так что лучше объекты именовать не так, как я указал выше, а вместо миллисекунд использовать секунды, т.е. время открытия бара. Но т.к. на одном баре м.б. несколько линий, то в имя также закодировать счетчик, т.е. образовался новый бар, счетчик = 0. Появилась первая линия на этом баре. Устанавливаем ей имя "я name "+DoubleToString( время открытия текущего бара )+" "+IntegerToString( счетчик ). Если линия создана успешно - счетчик++. Счетчик, конечно, статический. И так для всех линий на этом баре. Появился новый - счетчик = 0 и все по новой.

Да, я проверял не все символы, возможно есть и с меньшим приоритетом. 

 
Tapochun:

Да не за что. Сам узнал что-то новое. Только тут сам ошибся еще раз. Отвечал ночью. Вам нужна идентификация по открытию бара, так что лучше объекты именовать не так, как я указал выше, а вместо миллисекунд использовать секунды, т.е. время открытия бара. Но т.к. на одном баре м.б. несколько линий, то в имя также закодировать счетчик, т.е. образовался новый бар, счетчик = 0. Появилась первая линия на этом баре. Устанавливаем ей имя "я name "+DoubleToString( время открытия текущего бара )+" "+IntegerToString( счетчик ). Если линия создана успешно - счетчик++. Счетчик, конечно, статический. И так для всех линий на этом баре. Появился новый - счетчик = 0 и все по новой.

Да, я проверял не все символы, возможно есть и с меньшим приоритетом. 

Вы главное направление подсказали. :) Теперь от этого копать дальше можно. Работает все отлично. Спасибо!
Причина обращения: