[АРХИВ] Любой вопрос новичка, чтоб не захламлять форум. Профи, не проходите мимо. Без вас никуда - 3. - страница 240

 
a1 = OrdersTotal();
for (i = 0; i < a1; i++)
{
OrderSelect(i,SELECT_BY_POS);
OrderDelete(OrderTicket());

}

Вот такой простой скрипт должен удалять все отложенные ордера, но удаляет ровно половину ордеров ... ???

 
        
FAQ 04.03.2011 12:56 

Подскажите, как найти цену последнего фрактала?


sergeev: Для этого можно воспользоваться индикатором iFractals. Он возвращает значение 0, если на баре нет фрактала и значение цены фрактала если он есть. Фракталы делятся на верхние и нижние. Если вам надо получить верхние, то в функцию iFractals передается MODE_UPPER, а для нижних - MODE_LOWER. Поэтому для поиска фрактала надо пройти в цикле по барам и первое не 0 значение и будет искомым фракталом.

пример:

double frac;
for (int i=3; i<Bars; i++)
{
   frac=iFractals(Symbol(), Period(), MODE_UPPER, i); if (frac>0) break;
   frac=iFractals(Symbol(), Period(), MODE_LOWER, i); if (frac>0) break;
}
if (frac>0) Print("Цена последнего фрактала: ", frac);


пример организации отдельной функции:

//---------------------------------------------------------------   GetLastFrac
double GetLastFrac(string smb, int tf, int iB)
{
   int n=iBars(smb, tf);  double frac;
   for (int i=iB; i<n; i++)
   {
      frac=iFractals(smb, tf, MODE_UPPER, i); if (frac>0) return(frac);
      frac=iFractals(smb, tf, MODE_LOWER, i); if (frac>0) return(frac);
   }
   return(0);
}
.....
Print("Последний фрактал: ", GetLastFrac("EURUSD", 60, 3));
В FAQ было, я первые разы чет перелистнул и не заметил.
 
Neo333:
a1 = OrdersTotal();
for (i = 0; i < a1; i++)
{
OrderSelect(i,SELECT_BY_POS);
OrderDelete(OrderTicket());

}

Вот такой простой скрипт должен удалять все отложенные ордера, но удаляет ровно половину ордеров ... ???

допустим ордеров было 10.

Вот вы удалили половину (с нулевого по пятый)

теперь вы хотите выбрать шестой.. а их осталось всего 5. Ошибка и удалять нечего. С остальными аналогично

 
Neo333:
a1 = OrdersTotal();
for (i = 0; i < a1; i++)
{
OrderSelect(i,SELECT_BY_POS);
OrderDelete(OrderTicket());

}

Вот такой простой скрипт должен удалять все отложенные ордера, но удаляет ровно половину ордеров ... ???

Измените направление перебора ордеров:

for (i=a1-1; i>=0; i--) {....}

 
artmedia70:

Измените направление перебора ордеров:

for (i=a1-1; i>=0; i--) {....}

Работает ... но в чём логика - какая разница i++ или i-- ???
 
Zhunko:

1. Вы проверили?

Докладываю: помогло, но, похоже, глючит.

Первый терминал. Удалил все графики и символы, добавил 7 символов по доллару, добавил графики. Всё с перезагрузками.

Растянул тиковый на 3/4 экрана. Заполнение первых 6, 7-й встал на 5-ти клетках.

После очередного перезапуска полностью стали заполняться не все, распределение почти случайное, - чем ниже символ в списке, тем меньше ему клеточек достается.

Второй терминал. На нем было 7 йеновых пар. Удалил лишние символы, перезапустил - заполняться стали намного глубже, а вот глубина заполнения оказалась распределена случайным образом.

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

В любом случае, для одной валюты способ работает. Резюме: рецепт в фак :) Спасибо.

 
Neo333:
Работает ... но в чём логика - какая разница i++ или i-- ???

Вам же сразу написали в чём причина. Дело не в i++ или i--, а в том, с какого конца начать удалять ордера - с начала списка (как вы) или с конца списка (как нужно в данном случае)

Для того, чтобы понять что происходит при удалении ордеров, нужно знать и представлять, каким образом ордера хранятся в массиве.

Когда удаляете сначала первый ордер (он индексируется i=0), то индексы всех ордеров смещаются в массиве - тот, который был первым, становится нулевым, второй становится первым, третий - вторым и т.д. Потому и происходит не полное удаление всех ордеров - ведь когда i становится равным 6, шестой ордер смещается на пятую позицию в массиве ордеров и ордер просто не выбирается по индексу 6.

Когда же вы удаляете ордера с конца списка, то смещения не происходит - первый ордер как имел нулевую позицию в списке, так и будет её иметь. 10-й ордер имел позицию 9, он был удалён, далее удаляется 9-й ордер, который имеет позицию в списке 8 и т.д. до первого ордера с позицией ноль в массиве ордеров.

 
Neo333:
Работает ... но в чём логика - какая разница i++ или i-- ???
вам ведь уже ответил пользователь
152
ilunga на этот вопрос
 
nadya:
вам ведь уже ответил пользователь
152
ilunga на этот вопрос
Что-то мне подсказало, что нужно было разжевать и дать более развёрнутый ответ... :)
 
Zhunko:
... открыть график автономно.
По остальным графикам "тикает". Не вариант.
Причина обращения: