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 и т.д.