Скачать MetaTrader 5

Array out of range.

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Роман
21
Роман  

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

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

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

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;

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

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

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

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

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

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

Dmitry Fedoseev
43507
Dmitry Fedoseev  
Выведите принтом, что возвращает ArrayBsearch.
Роман
21
Роман  

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

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

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

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

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

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

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

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

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

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

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

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

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

12
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий