Array out of range.

 

Здравствуйте ув.форумчане и все, все, все.

Прошу помощи. Стал недавно заниматься разработкой советника для опционов.. и наткнулся на одну непонятную мне ошибку.

Итак, принцип работы советника прост, работает по Мартингейлу, то есть при каждой неудачной сделке увеличивает лот. 

double ArLots[12]; //Объявляется в глобалке. 

Значения присваиваются в OnInit()

{ArLots[0]=Lot_1, ArLots[1]=Lot_2 и т.д.}  //Lot_1, Lot_2 и т.д. это input double переменные.

...{ 

if(close>=open) 

   {

      int ArIndexOfpLot = ArrayBsearch(ArLots,pLot);  //ArLots мой массив, в него занесены значения лотов. pLot - лот предыдущего ордера.

      int NextArIndex = ArIndexOfpLot+1;

      lot = ArLots[NextArIndex];  //<-Здесь выбивает ошибку. Не сразу, один или два раза он все таки увеличивает лот, а потом говорит "array out of range". 

      break;                      //Было бы понятно если бы он доходил до последних элементов массива, но нет, ошибка вылетает на первых. 

    }   

return lot;

 
Массив как строится? Код где? А так-то лот рассчитывать надо через коэффициент, а не брать из массива, тогда и ошибки этой не будет никогда.
 
Размер массива 12. Наверно открыто 12 ордеров, советник пытается открыть 13-ый.
 
а, да, вижу теперь. ну так надо хотя бы динамический массив, если так не хочется рассчитывать лот.
 

Нет. Советник не открывает больше одного ордера. 

Вообще общий принципе работы такой:

Проверка всех условий, открывается ордер с лотом, например 1.0. Как только он закрылся проверка на то как он закрылся положительно или нет. Если да, то лоту снова дается значение 1.0.

Если же нет, то тогда, он ищет в массиве 1.0, возвращает индекс этого элемента, к индексу прибавляем 1, и получается что следующий размер лота будет возвращаться с того элемента, индекс которого например 0+1, то есть 1. Там уже значение 4, и так далее.  

Все в принципе работает нормально, то есть как и должно, но после нескольких открытий ордеров(в последний раз открыл 3 или 4), перестает торговать с ошибкой "array out of range". 

 
Выведите принтом, что возвращает ArrayBsearch.
 

Хах)) Теперь понятно, что ничего не понятно. Когда лот был 1.0, он вернул верно, индекс 0. 

Когда лот стал 4.0, он вернул индекс 11, то есть последний элемент массива и выбил ошибку, потому как советник попытался взять значение с 12го элемента. 

Честно сказать.. понятия не имею что делать. Я либо неправильно использую функцию ArrayBsearch или она некорректно работает. 

 
ArrayBsearch работает с отсортированным массивом. Еще переменные double нужно нормализовать - NormalizeDouble().
 

Спасибо. Только не понятно вот что, сортировка массива, он сортирует значения или индексы. 

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

Так вот, в массиве, 12 элементов, то есть как бы 12 шагов, я хотел сделать так, что если бы пользователю нужно было бы не 12, а 7, то после 7, он ставил 0.0. 

В таком случае если сортировать массив, он наверняка выставит сперва нули, а потом уж 1,4,10 и т.д? 

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

Не, в том то и дело. Мне нужно чтобы нули были после больших значений.

Логика такая:

Советник проходит, например, 7 шагов. После 7, лот ставиться 0, дальше у меня стоит функция CheckLot, то есть если лот меньше MINLOT то ставим MINLOT.

То есть опять 1.0. И опять по новой, он находит эту еденицу в массиве и снова начинает 1,4,10,25 и т.д.

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