Во-вторых, почему вместо тикета ордера указываете переменную цикла?
В-третьих, почему в 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)
{
// Ошибка распределения памятиreturnINIT_FAILED;
}
mas_of_Tickets[nTotal] = OrderTicket();
}
причина ошибки - ордера с номером OrdersHistoryTotal() не существует. Обратите внимание, во всех примерах, которые вам показали, циклы идут от последнего в списке (OrdersHistoryTotal()-1) до первого в списке (индекс 0)
причина ошибки - ордера с номером OrdersHistoryTotal() не существует. Обратите внимание, во всех примерах, которые вам показали, циклы идут от последнего в списке (OrdersHistoryTotal()-1) до первого в списке (индекс 0)
Это всего лишь пример кода. Писалось даже без проверки синтаксиса. Смысл - показать направление. Поэтому могут быть какие-то мелкие ошибки.
Я тут повозился с настройкой, в итоге:
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...
Может быть вы знаете, что здесь за проблема.
Я тут повозился с настройкой, в итоге:
Ошибка 4051...
Может быть вы знаете, что здесь за проблема.
Во-первых, почему все это делается в OnInit()?
Во-вторых, почему вместо тикета ордера указываете переменную цикла?
В-третьих, почему в OrderSelect указан выбор по индексу списка, а не по тикету?
Начните с простого - работу с одним ордером. До работы с множеством ордеров еще далеко. Там все сложнее.
Во-первых, почему все это делается в OnInit()?
Во-вторых, почему вместо тикета ордера указываете переменную цикла?
В-третьих, почему в OrderSelect указан выбор по индексу списка, а не по тикету?
Начните с простого - работу с одним ордером. До работы с множеством ордеров еще далеко. Там все сложнее.
Oninit, т.к. массив заполняется один раз. Этому советнику нужно подхватывать другой советник, который выставляет ордера, поэтому мне нужно узнавать тикет уже открытых ордеров, а чтобы узнать тикет я знаю только способ через индекс, и там проверяются абсолютно все ордера, и т.к. нужен тикет, то порядок не важен. Тестил советник с одним открытым оредром.
Понятно. Но тогда проблема в том, что массив распределяется на все имеющиеся ордера, а заполняется только теми, которые имеют определенный магик.
Чтобы добавить в массив все ордера с определенным магиком, нужно сделать так:
причина ошибки - ордера с номером OrdersHistoryTotal() не существует. Обратите внимание, во всех примерах, которые вам показали, циклы идут от последнего в списке (OrdersHistoryTotal()-1) до первого в списке (индекс 0)
причина ошибки - ордера с номером OrdersHistoryTotal() не существует. Обратите внимание, во всех примерах, которые вам показали, циклы идут от последнего в списке (OrdersHistoryTotal()-1) до первого в списке (индекс 0)
Понятно. Но тогда проблема в том, что массив распределяется на все имеющиеся ордера, а заполняется только теми, которые имеют определенный магик.
Чтобы добавить в массив все ордера с определенным магиком, нужно сделать так: