Спрашивайте! - страница 21

 
billworld2:
Существует ли способ удаления объектов на основе текстовой строки select в имени объекта?

Вот пример:

datetime currentDay = StrToTime(Year()+". "+Month()+". "+Day()+" 00.00");

for(int i=0;i<ObjectsTotal();i++)

{

string name = ObjectName(i);

if( ObjectGet(name,OBJPROP_TIME1) < currentDay && ObjectGet(name,OBJPROP_TIME2) < currentDay && ObjectGet(name,OBJPROP_TIME3) < currentDay)

{

ObjectDelete(ObjectName(i));

return (false);

}

}

return (true);

 
billworld2:
Один из моих учебных проектов заключается в настройке tester.tpl, который управляет вариантом отображения графика для стратегического тестера. Я нахожу стиль графика по умолчанию очень сложным для визуализации. Поэтому я создал новый шаблон, а затем построил скрипт для замены всех стрелок на более привлекательные.

Однако я также хотел бы получить информацию в названиях стрелок и отобразить ее в виде текста на графике. Названия стрелок включают в себя такие вещи, как "#62 покупка" или "73 продажа закрытие". Таким образом, вы можете посмотреть на график и увидеть, когда именно происходит вход/выход из конкретной сделки. Я не знаю, почему это не включено по умолчанию в тестер стратегий, как это сделано в других платформах (например, TradeStation).

В любом случае, я хотел бы захватить текст, о котором идет речь, и вставить новые текстовые объекты чуть ниже существующих стрелок на графике. Но я не могу понять, как этого добиться.

Как мне это сделать?

Спасибо

Билл

Ну, вы можете написать скрипт или функцию, которая будет считывать информацию о стрелке и создавать текстовую метку под ней. Затем запускать скрипт каждый раз, когда рисуется новая стрелка. Или просто поместить функцию в конец основной функции ea. Я не знаю, почему эта информация не является стандартной в metatrader, но закодировать такую функциональность очень просто.

 
Kalenzo:
Вам следует прочитать о функциях Дата и Время, и использовать функцию iBarShift для получения сдвига первого бара указанного месяца из указанного таймфрейма.

Я знаю, что для вас это должно быть тривиально. Я просто пока не могу понять это, следуя ограниченной документации (там не так много примеров). Не могли бы вы любезно предоставить пример того, как это сделать?

Спасибо

Билл

 
Kalenzo:
Ну, вы можете написать скрипт или функцию, которая будет считывать информацию о стрелке и делать текстовую метку рядом с ней. Затем запускать скрипт каждый раз, когда рисуется новая стрелка. Или просто поместить функцию в конец основной функции ea. Я не знаю, почему эта информация не является стандартной в metatrader, но это простое кодирование такого рода функциональности.

Спасибо, но я застрял конкретно на том, как написать скрипт. Если у вас есть время, чтобы предоставить короткий пример, я был бы очень признателен.

Еще раз спасибо.

Билл

 

Не уверен, что понял. Для ясности, я ищу способ выполнить поиск подстроки на основе имени объекта. Например, у меня есть группа объектов со строкой "-206" (вместе с другим текстом). Я хочу найти и удалить все объекты, содержащие "-206" в своем имени.

В приведенном ниже примере меня смущает ассоциация с OBJPROP_TIME1, OBJPROP_TIME2 и OBJPROP_TIME3. Я знаю, что объекты могут иметь до трех временных координат. Я не понимаю, как это сочетается с тем, что я пытаюсь сделать.

Kalenzo:
Вот пример:

datetime currentDay = StrToTime(Year()+". "+Month()+". "+Day()+" 00.00");

for(int i=0;i<ObjectsTotal();i++)

{

string name = ObjectName(i);

if( ObjectGet(name,OBJPROP_TIME1) < currentDay && ObjectGet(name,OBJPROP_TIME2) < currentDay && ObjectGet(name,OBJPROP_TIME3) < currentDay)

{

ObjectDelete(ObjectName(i));

return (false);

}

}

return(true);
 
billworld2:
Не уверен, что понял. Для ясности, я ищу способ выполнить поиск подстроки на основе имени объекта. Например, у меня есть группа объектов со строкой "-206" в них (вместе с другим текстом). Я хочу найти и удалить все объекты, которые содержат "-206" в своем имени. В приведенном ниже примере меня смущает ассоциация с OBJPROP_TIME1, OBJPROP_TIME2 и OBJPROP_TIME3. Я знаю, что объекты могут иметь до трех временных координат. Я не понимаю, как это сочетается с тем, что я пытаюсь сделать.

Хорошо, попробуйте следующее:

for(int i=0;i<ObjectsTotal();i++)

{

string name = ObjectName(i);

if(StringSubstr( name, 0, 3)==206)

{

ObjectDelete(ObjectName(i));

}

}

Если первые 3 буквы имени объекта равны 206, то объект будет удален.

 
billworld2:
Спасибо, но я застрял конкретно на том, как написать скрипт. Если у вас есть время, чтобы предоставить короткий пример, я был бы очень признателен.

Еще раз спасибо.

Билл

сначала объявите глобальную переменную (глобальную для скрипта) int objectCount;

затем в конце ea обрабатываем все объекты (например, можно искать их по имени)

for(int i=0;i>=ObjectsTotal(OBJ_ARROW) ;i++)

{

//если метка объекта не существует, нарисуйте ее, допустим, мы возьмем имя существующего объекта.

//имя существующей стрелки и добавим к нему метку L, чтобы идентифицировать ее

if(ObjectFind(ObjectName(i)+"L")== -1)

{

ObjectCreate(ObjectName(i)+"L",OBJ_ARROW,0,ObjectGet(ObjectName(i), OBJPROP_TIME1),ObjectGet(ObjectName(i),(OBJPROP_PRICE1+3*Point)));

// и все

}

}

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

 

Хорошо. Понял. На самом деле мне нужно было использовать StringFind(). Спасибо за подсказки!

#property show_inputs

extern string stringname="blah";

//+------------------------------------------------------------------+

//| функция запуска скриптовой программы |

//+------------------------------------------------------------------+

int start()

{

//----

for(int i=0;i<ObjectsTotal();i++)

if(StringFind(ObjectName(i),stringname,0)>0)

{

ObjectDelete(ObjectName(i));

}

Kalenzo:
Хорошо, попробуйте это:

for(int i=0;i<ObjectsTotal();i++)

{

string name = ObjectName(i);

if(StringSubstr( name, 0, 3)==206)

{

ObjectDelete(ObjectName(i));

}

}

Если первые 3 буквы имени объекта будут равны 206, то объект будет удален
 

Спасибо, но это не работает. Сначала я изменил "i>=ObjectsTotal" на "i<=ObjectsTotal" (опечатка). Затем, я заметил, что вы создаете еще один объект стрелки, где мы хотим создать новый текстовый объект, который включает имя объекта стрелки. В любом случае, код ниже создает кучу стрелок (около 50), которые накладываются на одни и те же координаты.

Я все еще теряюсь в этом вопросе. Если у вас есть возможность взглянуть еще раз, буду очень признателен. Для ясности, я хочу создать один новый текстовый объект, который позиционируется под каждым существующим объектом стрелки, где текстовое описание текстового объекта равно имени объекта стрелки.

Билл

Kalenzo:
сначала объявляем глобальную переменную (глобальную для скрипта) int objectCount;

затем в конце ea обработать все объекты (например, можно искать их по имени)

for(int i=0;i>=ObjectsTotal(OBJ_ARROW) ;i++)

{

//если метка объекта не существует, нарисуйте ее, допустим, мы возьмем имя существующего объекта.

//имя существующей стрелки и добавим к нему метку L, чтобы идентифицировать ее

if(ObjectFind(ObjectName(i)+"L")== -1)

{

ObjectCreate(ObjectName(i)+"L",OBJ_ARROW,0,ObjectGet(ObjectName(i), OBJPROP_TIME1),ObjectGet(ObjectName(i),(OBJPROP_PRICE1+3*Point)));

// и все

}

}

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

Удаление объектов на основе содержимого

Существует ли способ удаления объектов на основе выделенной текстовой строки в имени объекта?

Edit: Разобрался с помощью подсказки от Kalenzo. Ответ находится в посте #212.

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