Цикл в цикле - страница 2

 
Ihor Herasko:

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

Только после этого массив можно заполнять.

Значит получается так:

void OpenTime(int cmd)
  {
   datetime OT[];
   if(ArreyResize(OT,OrdersTotal())<0)
   return;
   for(int i=0;i<=OrdersTotal();i++)
     {
      if(OrderSelect(i,SELECT_BY_POS))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==magic && OrderType()==cmd)
         OT[i]=OrderOpenTime();
        }
     }
  }

но тогда снова вопрос: как сортировать динамичный массив не с 0 а с последнего значения?

 
Maksim Neimerik:

Привет! Я почему-то нигде не встречал цикл перебора ордеров в цикле перебора ордеров. Такое практикуется? Можно так делать?

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

зачем там ДВА цикла ? надо найти последний и предпоследний, на так и найдите их...

datetime otime[2]={0};// время ордеров

int otciket[2]={-1};      // тикеты ордеров

for(int pos=OrdersTotal();pos>=0;pos--) {

    .....

    if (oticket[0]==-1) { oticket[0]=OrderTicket();otime[o]=OrderOpenTime(); }

    else if (OrderOpenTime()>otime[0]) { otime[1]=otime[0]; oticket[1]=oticket[0]; oticket[0]=OrderTicket();otime[0]=OrderOpenTime(); }

    else if (OrderOpenTime()>otime[1]) { otime[1]=OrderOpenTime();oticket[1]=OrderTicket();}

}

 
Maxim Kuznetsov:

зачем там ДВА цикла ? надо найти последний и предпоследний, на так и найдите их...

datetime otime[2]={0};// время ордеров

int otciket[2]={-1};      // тикеты ордеров

for(int pos=OrdersTotal();pos>=0;pos--) {

    .....

    if (oticket[0]==-1) { oticket[0]=OrderTicket();otime[o]=OrderOpenTime(); }

    else if (OrderOpenTime()>otime[0]) { otime[1]=otime[0]; oticket[1]=oticket[0]; oticket[0]=OrderTicket();otime[0]=OrderOpenTime(); }

    else if (OrderOpenTime()>otime[1]) { otime[1]=OrderOpenTime();oticket[1]=OrderTicket();}

}

спасибо, буду пробовать... получается oticket[0] это пердпоследний а oticket[1] это последний ордера, так?
 
Maksim Neimerik:
спасибо, буду пробовать... получается oticket[0] это пердпоследний а oticket[1] это последний ордера, так?

Выведите на Print(), и посмотрите результат, так будет быстрее, чем писать сообщение, а потом ждать ответ

 
Vitaly Muzichenko:

Выведите на Print(), и посмотрите результат, так будет быстрее, чем писать сообщение, а потом ждать ответ

))) тоже правильно, спасибо. Только у меня сейчас нет доступа к терминалу, вот и пишу...
 

Можно сделать цикл в цикле. Только перед вторым циклом надо в переменных сохранить параметры ордера выделенного в первом цикле.

 
Dmitry Fedoseev:

Можно сделать цикл в цикле. Только перед вторым циклом надо в переменных сохранить параметры ордера выделенного в первом цикле.

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

Решил проблему так:

void ModifyOrderPrev()
{
   datetime t=0;
   for(int i=0; i<OrdersTotal(); i++)
   {
      if(OrderSelect(i,SELECT_BY_POS))
      {
         if(OrderSymbol()==Symbol()&&OrderMagicNumber()==magic)
         {
            if(t<OrderOpenTime())
            {
               t=OrderOpenTime();                  
            }  
         }
      }
   }
   for(int i=0; i<OrdersTotal(); i++)
   {
      if(OrderSelect(i,SELECT_BY_POS))
      {
         if(OrderSymbol()==Symbol()&&OrderMagicNumber()==magic)
         {
            if(t>OrderOpenTime())
            {
               if(!OrderModify(OrderTicket(),OrderOpenPrice(),0,0,0))
               {
                  Print("Order Modify Error!!! Order prev");
                  break;
               }   
            }  
         }
      }
   }
}

незнаю насколько это правильно с точки зрения программирования, но оно работает... как по мне так это самое важное.

 
Maksim Neimerik:

Привет! Я почему-то нигде не встречал цикл перебора ордеров в цикле перебора ордеров. Такое практикуется? Можно так делать?

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

Учтите, что количество доступных ордеров, возвращаемое функцией OrdersTotal(), зависит от настроек истории

     Проверьте   

Извините,  перепутал с  OrdersHistoryTotal()

 
STARIJ:

Учтите, что количество доступных ордеров, возвращаемое функцией OrdersTotal(), зависит от настроек истории

     Проверьте  


Вы что-то перепутали.

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