Ошибка 4051 - страница 2

 
Ihor Herasko:

Это всего лишь пример кода. Писалось даже без проверки синтаксиса. Смысл - показать направление. Поэтому могут быть какие-то мелкие ошибки.

Я тут повозился с настройкой, в итоге: 

int OnInit()
  { 
    ArrayResize(mas_of_Tickets, OrdersTotal()+1, ARRAY_RESERVE_SIZE);
    if(OrdersTotal()>0){     
     for(int k = ArraySize(mas_of_Tickets); k>0; k--){     
      if(OrderSelect(k, SELECT_BY_POS)==False)
       Comment("12Ошибка: " ,GetLastError());
      if(OrderMagicNumber()==magic)
      mas_of_Tickets[k]=OrderTicket();
      Print(mas_of_Tickets[1]);
     }
    }
   return(INIT_SUCCEEDED);
  }

Ошибка 4051... 

Может быть вы знаете, что здесь за проблема.

 
arethel:

Я тут повозился с настройкой, в итоге: 

Ошибка 4051... 

Может быть вы знаете, что здесь за проблема.

Во-первых, почему все это делается в OnInit()? 

Во-вторых, почему вместо тикета ордера указываете переменную цикла?

В-третьих, почему в OrderSelect указан выбор по индексу списка, а не по тикету?

Начните с простого - работу с одним ордером. До работы с множеством ордеров еще далеко. Там все сложнее.

 
Ihor Herasko:

Во-первых, почему все это делается в OnInit()? 

Во-вторых, почему вместо тикета ордера указываете переменную цикла?

В-третьих, почему в OrderSelect указан выбор по индексу списка, а не по тикету?

Начните с простого - работу с одним ордером. До работы с множеством ордеров еще далеко. Там все сложнее.

Oninit, т.к. массив заполняется один раз. Этому советнику нужно подхватывать другой советник, который выставляет ордера, поэтому мне нужно узнавать тикет уже открытых ордеров, а чтобы узнать тикет я знаю только способ через индекс, и там проверяются абсолютно все ордера, и т.к. нужен тикет, то порядок не важен. Тестил советник с одним открытым оредром.
 
Так же, когда вернусь домой, протещу то, что вдруг индекс первого ордера в списке равняется нулю.
 
arethel:
Oninit, т.к. массив заполняется один раз. Этому советнику нужно подхватывать другой советник, который выставляет ордера, поэтому мне нужно узнавать тикет уже открытых ордеров, а чтобы узнать тикет я знаю только способ через индекс, и там проверяются абсолютно все ордера, и т.к. нужен тикет, то порядок не важен. Тестил советник с одним открытым оредром.

Понятно. Но тогда проблема в том, что массив распределяется на все имеющиеся ордера, а заполняется только теми, которые имеют определенный магик.

Чтобы добавить в массив все ордера с определенным магиком, нужно сделать так:

for(int k = OrdersTotal() - 1; k >= 0; k--)
{     
   if (!OrderSelect(k, SELECT_BY_POS))
      continue;

   if (OrderMagicNumber() != magic)
      continue;

   int nTotal = ArraySize(mas_of_Tickets);
   if (ArrayResize(mas_of_Tickets, nTotal + 1, ARRAY_RESERVE_SIZE) != nTotal + 1)
   {
      // Ошибка распределения памяти
      return INIT_FAILED;
   }

   mas_of_Tickets[nTotal] = OrderTicket();
}
 

причина ошибки - ордера с номером OrdersHistoryTotal() не существует. Обратите внимание, во всех примерах, которые вам показали, циклы идут от последнего в списке (OrdersHistoryTotal()-1) до первого в списке (индекс 0)

 
Igor Zakharov:

причина ошибки - ордера с номером OrdersHistoryTotal() не существует. Обратите внимание, во всех примерах, которые вам показали, циклы идут от последнего в списке (OrdersHistoryTotal()-1) до первого в списке (индекс 0)

Большое спасибо!!!
 
Ihor Herasko:

Понятно. Но тогда проблема в том, что массив распределяется на все имеющиеся ордера, а заполняется только теми, которые имеют определенный магик.

Чтобы добавить в массив все ордера с определенным магиком, нужно сделать так:

Большое спасибо!!!
 
Сейчас вроде работает
Причина обращения: