![MQL5 - Язык торговых стратегий для клиентского терминала MetaTrader 5](https://c.mql5.com/i/registerlandings/logo-2.png)
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Работает, спасибо за подсказку. Правда если просто крутить в обратную сторону, то вообще ничего не удаляет.
А вот если, зная что объектов не более 10 написать так, то работает:
for(int i=OrdersTotal()+10; i>=0; i--) {
if(ObjectGet(ObjectName(i), OBJPROP_COLOR)==clrDodgerBlue) {
ObjectDelete(0,ObjectName(i)); }}
Хотя кривой вариант какой-то.
А причем здесь OrdersTotal(), когда вы работаете с кол-во графических объектов?
ObjectsTotal
Работает, спасибо за подсказку. Правда если просто крутить в обратную сторону, то вообще ничего не удаляет.
А вот если, зная что объектов не более 10 написать так, то работает:
for(int i=OrdersTotal()+10; i>=0; i--) {
if(ObjectGet(ObjectName(i), OBJPROP_COLOR)==clrDodgerBlue) {
ObjectDelete(0,ObjectName(i)); }}
Хотя кривой вариант какой-то.
а вот если так сделать, то получится программирование методом научного тыка :-)
когда не пытаясь понять логику устройства просто меняются/перебираются опции. Не вышло с плюс значит минус. Если перебор попробовать поделить. Добавить магическую константу. Поменять ObjectsTotal() на OrdersTotal(), вдруг прокатит. И так далее.
Хотя устройство весьма просто:
образно: где-то внутри терминала лежит массив с данными по объектам. ObjectsTotal() возвращает кол-во элементов там. При ObjectDelete элемент из массива удаляется (у всех элементов с большим индексом, этот самый индекс уменьшается). Следующий объект становится на место текущего.
Поэтому если в инкрементном цикле от 0 вызвать ObjectDelete и не скорректировать следующий запрашиваемый индекс - объекты удаляться через 1. В декрементном такой проблемы нет, потому что элементы со более значащими индексами ты уже посмотрел.
И кстати: если это не просто короткий скрипт, то всеми силами избегайте использования ObjectsTotal() ObjectGetXXX()... лучше сохранить данные про нужные объекты к себе в массивы/структуры и их поддерживать
А причем здесь OrdersTotal(), когда вы работаете с кол-во графических объектов?
ObjectsTotal
Декрементный тоже удаляет объекты через один.
for(int i=ObjectsTotal(); i>=0; i--) {
if(ObjectGet(ObjectName(i), OBJPROP_COLOR)==clrCrimson) {
ObjectDelete(0,ObjectName(i)); }}
Не пойму, из-за чего в случае обратного цикла должно работать. Ведь цикл запускается командой i=ObjectsTotal(), но элементов же стало на один меньше.
Допустим при запуске было 100 элементов. Первая итерация нашла и удалила элемент. При втором запуске элементов уже 99, а циклу предписано сделать шаг i--.
Вот и получается, что с какой стороны ни посчитай скачем через 2.
Что, без массива никак значит?
Декрементный тоже удаляет объекты через один.
Ведь цикл запускается командой i=ObjectsTotal
Так не бывает.
Сергей, Вы правы. Заработало.
switch (level) {
case 1:
if(...) {...}
if(...) {...}
break;
case 2:
if(...) {...}
break
if(...) {...}
break;
}
Знающие люди, подскажите пожалуйста, в каком варианте я правильно break поставил? case 1 или case 2? Или можно вообще без break, так как у меня if() используется.