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

 
paladin80:
Посмотрите где потом используется total. Скорей всего потом идёт цикл перебора ордеров for (i=0; i<=total; i++).

кстати, да.. Я и выше уже добавил полный код данной функции:

void FindOrders()
{
// - 1 - == Инициализация переменных перед поиском ======================================
   int total = OrdersTotal() - 1;
   g_type = -1;                                    // На текущий момент у нас нет позиций
// - 1 - == Окончание блока =============================================================
 
// - 2 - == Непосредственно поиск =======================================================
   for (int i = total; i >= 0; i--)                // Используется весь список ордеров
      if (OrderSelect(i, SELECT_BY_POS))           // Убедимся, что ордер выбран
         if (MathFloor(OrderMagicNumber()) == i_magicNumber &&// Ордер открыт
             OrderSymbol() == Symbol())            // ..экспертом, который прикреплен к..
         {                                         // ..текущей паре
            g_ticket = OrderTicket();              // Запишем данные ордера
            g_type = OrderType();
         } 
// - 2 - == Окончание блока =============================================================
}

 Я так понял, чтоб не писать так логичнее будет сделать так:

int total = OrdersTotal() - 1;

 а цикл потом задавать так:

for(i=total; i>=1; i--)

 Верно? Просто как-то воспринимается не очень когда счётчик количества позиций от нуля.. не логично и, потому, зачем себя путать.. 

 
hoz:

кстати, да.. Я и выше уже добавил полный код данной функции:

 Я так понял, чтоб не писать так логичнее будет сделать так:

 а цикл потом задавать так:

 Верно? Просто как-то воспринимается не очень когда счётчик количества позиций от нуля.. не логично и, потому, зачем себя путать.. 

Для перебора ордеров надо до нуля а не до единицы.

for(i=total; i>=0; i--)

Мне когда-то профи объяснил, что перебирается массив ордеров и тогда да, лучше начать перебор с большей цифры. В массиве первый элемент имеет индекс 0 (ноль), поэтому не до 1 и также по этой причине надо OrdersTotal() - 1, а не просто OrdersTotal().

У меня перебор ордеров сделан так:

for (int i=OrdersTotal()-1; i>=0; i--)
 
paladin80:

Для перебора ордеров надо до нуля а не до единицы.

Мне когда-то профи объяснил, что перебирается массив ордеров и тогда да, лучше начать перебор с большей цифры. В массиве первый элемент имеет индекс 0 (ноль), поэтому не до 1 и также по этой причине надо OrdersTotal() - 1, а не просто OrdersTotal().

 Очень интересно. А я же первым делом открыл учебник и попытался найти ответ там. И тут https://book.mql4.com/ru/trading/ordermodify увидел, как в учебнике сделан перебор:

 for(int i=1; i<=OrdersTotal(); i++)          // Цикл перебора ордер

  Вот этот фактор и ввёл меня в заблуждение...

 
hoz:

 Очень интересно. А я же первым делом открыл учебник и попытался найти ответ там. И тут https://book.mql4.com/ru/trading/ordermodify увидел, как в учебнике сделан перебор:

  Вот этот фактор и ввёл меня в заблуждение...


А не обратили внимание на следущую строчку?

   for(int i=1; i<=OrdersTotal(); i++)          // Цикл перебора ордер     
   {      
     if (OrderSelect(i-1,SELECT_BY_POS)==true) // Если есть следующий
//
//Тут компенсируется отсутствие нуля с i-1
 
borilunad:


А не обратили внимание на следущую строчку?

 

 Нет. Но как-то криво написать. Не хочу критиковать учебник, но.. от 0 считать гораздо адекватнее, а не от -1. Иначе можно было б уже и от -30 начать...

 Как выше заметил paladin80 от 0 значение массивов считать наиболее адекатно будет, ежели от -N.

 
hoz:

 Нет. Но как-то криво написать. Не хочу критиковать учебник, но.. от 0 считать гораздо адекватнее, а не от -1. Иначе можно было б уже и от -30 начать...

 Как выше заметил paladin80 от 0 значение массивов считать наиболее адекатно будет, ежели от -N.


А сейчас думайте, включив логику!

Эти варианты идентичны, поскольку если i = 0, то перебирается от единицы до OrderTotal(), то есть от 0+1 до OrderTotal() - 1+1 (+1, так как в конце оператора for стоит i++)  И в учебнике то же самое, только записано от 1 до OrderTotal() и, чтобы не считалось от 2 до OrderTotal()+1, в функции OrderSelect к i приставил -1 автор учебника. Понятно?

Кстати, сколько программистов, почти столько же вариантов написания встретите. У каждого своё видение, свой почерк!

 
hoz:

 Нет. Но как-то криво написать. Не хочу критиковать учебник, но.. от 0 считать гораздо адекватнее, а не от -1. Иначе можно было б уже и от -30 начать...

 Как выше заметил paladin80 от 0 значение массивов считать наиболее адекатно будет, ежели от -N.

Если вас заинтересовал способ перебора ордеров, то могу предложит следующую схему:

if (OrdersTotal()>0)
{  for (int i=OrdersTotal()-1; i>=0; i--)
   {  if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) // ордер выбирается среди открытых
                                                    // и отложенных ордеров
      {  if (OrderSymbol()!=Symbol()) continue;     // если не наш символ, то уходим
         if (OrderMagicNumber()!=555) continue;     // если не наш магик номер, то уходим
                                                    // можно поставить любые другие фильтры
         // ... ваши вычисления
      }
   }
}
 
hoz:

 Нет. Но как-то криво написать. Не хочу критиковать учебник, но.. от 0 считать гораздо адекватнее, а не от -1. Иначе можно было б уже и от -30 начать...

 Как выше заметил paladin80 от 0 значение массивов считать наиболее адекатно будет, ежели от -N.

Я придерживаюсь такой же точки зрения - учебник писал конкретный человек - это его взгляд на вещи (организацию цикла перебора ордеров), а правильных решений ВСЕГДА существует множество. Есть взгяды правильные, а есть правильные и элегантные одновременно... :)
 
borilunad:


А сейчас думайте, включив логику!

Эти варианты идентичны, поскольку если i = 0, то перебирается от единицы до OrderTotal(), то есть от 0+1 до OrderTotal() - 1+1 (+1, так как в конце оператора for стоит i++)  И в учебнике то же самое, только записано от 1 до OrderTotal() и, чтобы не считалось от 2 до OrderTotal()+1, в функции OrderSelect к i приставил -1 автор учебника. Понятно?

  Конечно, понятно. Только вот раньше я не встречал чтобы так анализировали наличие ордера:

if (OrderSelect(i-1,SELECT_BY_POS)==true)

  обычно просто без ==true... Вот этот момент мне даже понравился. Хотя интересно, что в других экспертах такого приёма я не встречал. Логику то я понимаю, но всё же.

 
Пожалуйста подскажите, как для вычисления можно использовать значение мувинга несколько баров назад, т.е из истории? имеется ввиду как это будет выглядеть в коде. Если просто мувинг то
AlligatorJawsBuffer[i]=iMA(NULL,0,13,8,MODE_SMMA,PRICE_MEDIAN,i);
, а если  -5 баров назад?