Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Существует ли способ удаления объектов на основе текстовой строки 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);
Один из моих учебных проектов заключается в настройке tester.tpl, который управляет вариантом отображения графика для стратегического тестера. Я нахожу стиль графика по умолчанию очень сложным для визуализации. Поэтому я создал новый шаблон, а затем построил скрипт для замены всех стрелок на более привлекательные.
Однако я также хотел бы получить информацию в названиях стрелок и отобразить ее в виде текста на графике. Названия стрелок включают в себя такие вещи, как "#62 покупка" или "73 продажа закрытие". Таким образом, вы можете посмотреть на график и увидеть, когда именно происходит вход/выход из конкретной сделки. Я не знаю, почему это не включено по умолчанию в тестер стратегий, как это сделано в других платформах (например, TradeStation).
В любом случае, я хотел бы захватить текст, о котором идет речь, и вставить новые текстовые объекты чуть ниже существующих стрелок на графике. Но я не могу понять, как этого добиться.
Как мне это сделать?
Спасибо
БиллНу, вы можете написать скрипт или функцию, которая будет считывать информацию о стрелке и создавать текстовую метку под ней. Затем запускать скрипт каждый раз, когда рисуется новая стрелка. Или просто поместить функцию в конец основной функции ea. Я не знаю, почему эта информация не является стандартной в metatrader, но закодировать такую функциональность очень просто.
Вам следует прочитать о функциях Дата и Время, и использовать функцию iBarShift для получения сдвига первого бара указанного месяца из указанного таймфрейма.
Я знаю, что для вас это должно быть тривиально. Я просто пока не могу понять это, следуя ограниченной документации (там не так много примеров). Не могли бы вы любезно предоставить пример того, как это сделать?
Спасибо
Билл
Ну, вы можете написать скрипт или функцию, которая будет считывать информацию о стрелке и делать текстовую метку рядом с ней. Затем запускать скрипт каждый раз, когда рисуется новая стрелка. Или просто поместить функцию в конец основной функции ea. Я не знаю, почему эта информация не является стандартной в metatrader, но это простое кодирование такого рода функциональности.
Спасибо, но я застрял конкретно на том, как написать скрипт. Если у вас есть время, чтобы предоставить короткий пример, я был бы очень признателен.
Еще раз спасибо.
Билл
Не уверен, что понял. Для ясности, я ищу способ выполнить поиск подстроки на основе имени объекта. Например, у меня есть группа объектов со строкой "-206" (вместе с другим текстом). Я хочу найти и удалить все объекты, содержащие "-206" в своем имени.
В приведенном ниже примере меня смущает ассоциация с OBJPROP_TIME1, OBJPROP_TIME2 и OBJPROP_TIME3. Я знаю, что объекты могут иметь до трех временных координат. Я не понимаю, как это сочетается с тем, что я пытаюсь сделать.
Вот пример:
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);Не уверен, что понял. Для ясности, я ищу способ выполнить поиск подстроки на основе имени объекта. Например, у меня есть группа объектов со строкой "-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, то объект будет удален.
Спасибо, но я застрял конкретно на том, как написать скрипт. Если у вас есть время, чтобы предоставить короткий пример, я был бы очень признателен.
Еще раз спасибо.
Биллсначала объявите глобальную переменную (глобальную для скрипта) 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));
}
Хорошо, попробуйте это:
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), которые накладываются на одни и те же координаты.
Я все еще теряюсь в этом вопросе. Если у вас есть возможность взглянуть еще раз, буду очень признателен. Для ясности, я хочу создать один новый текстовый объект, который позиционируется под каждым существующим объектом стрелки, где текстовое описание текстового объекта равно имени объекта стрелки.
Билл
сначала объявляем глобальную переменную (глобальную для скрипта) 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.