Добрый день! Помогите добрым советом новичку.При
компиляции ошибок не дает.
При включении на графике выскакивает ошибка " array out jf range". Что не верно?
Ниже прилагаю фрагмент кода с ошибкой в строке с открытием сделки.(строка 100).
Спасибо.
' это значит что вы вышли за пределы массива. Что-то кода нет где посмотреть ошибку.
Вставляйте код пожалуйста правильно через кнопку SRC чтобы выглядело вот так.
{
int n=0;
int total=PositionsTotal();
for(int i=0; i<total; i++)
{
if(!Position.SelectByIndex(i))continue;
if(Position.Magic()!=Magic)continue;
if(Position.Symbol()!=_Symbol)continue;
n++;
}
return(n);
}
double BBUp[],BBLow[],BBMidle[]; // динамические массивы для хранения численных значений Bollinger Bands
double p_close; // переменная для хранения значения close бара
//+------------------------------------------------------------------+
//| Custom TradeSignalCounter() function |
//+------------------------------------------------------------------+
bool TradeSignalCounter(int Number,
string Symbol_,
bool Trade,
int period,
int bb_period,
double deviation,
ENUM_APPLIED_PRICE ApPrice,
bool &UpSignal[],
bool &DnSignal[],
bool &UpStop[],
bool &DnStop[])
{
//--- проверка запрета на торговлю
if(!Trade)return(true);
//--- объявление переменной для хранения итогового размера массивов переменных
static int Size_=0;
//--- объявление массива для хранения хэндлов индикаторов как статической переменной
static int Handle[];
static int Recount[],MinBars[];
double RSI[],rsi;
MqlRates mrate[]; // Будет содержать цены, объемы и спред для каждого бара
//------------------------------------
static int BBol[];
double BB[];
//--- инициализация
if(Number+1>Size_) // Вход в блок инициализации только на первом старте
{
Size_=Number+1; // Для этого номера вход в блок закрыт
//---- изменение размеров массивов переменных
ArrayResize(RSI,4);
ArrayResize(Handle,Size_);
ArrayResize(Recount,Size_);
ArrayResize(MinBars,Size_);
ArrayInitialize(Handle,0);
ArrayInitialize(Recount,0);
ArrayInitialize(MinBars,0);
//-----------------------------------------------------
ArrayResize(BB,4);
ArrayResize(BBol,Size_);
ArrayInitialize(BBol,0);
//---- определение минимально количества баров, достаточного для расчёта
MinBars[Number]=3*period;
//---- предварительное обнуление ячеек массивов
DnSignal[Number] = false;
UpSignal[Number] = false;
DnStop [Number] = false;
UpStop [Number] = false;
//---- используем массив как таймсерию
// массив котировок
ArraySetAsSeries(mrate,true);
ArraySetAsSeries(RSI,true);
//--- получить исторические данные последних 3-х баров
if(CopyRates(_Symbol,_Period,0,3,mrate)<0)
{
Alert("Ошибка копирования исторических данных - ошибка:",GetLastError(),"!!");
return(0);
}
//---- получение хендла индикатора
Handle[Number]=iRSI(Symbol_,PERIOD_M1,period,ApPrice);
BBol[Number]=iBands(Symbol_,PERIOD_M5,bb_period,0,deviation,ApPrice);
}
//--- проверка количества баров на достаточность для расчёта
if(Bars(Symbol_,0)<MinBars[Number])return(true);
//--- получение торговых сигналов
if(IsNewBar(Number,Symbol_,0) || Recount[Number]) // Вход в блок на смене бара или при неудачном копировании данных
{
DnSignal[Number] = false;
UpSignal[Number] = false;
DnStop [Number] = false;
UpStop [Number] = false;
//--- используя хэндлы индикатора, копируем значения индикаторного
//--- буфера в специально подготовленный для этого статический массив
if(CopyBuffer(Handle[Number],0,0,4,RSI)<0)
{
Recount[Number]=true; // так как данные не получены, то следует вернуться
// в этот блок получения торговых сигналов на следующем тике!
return(false); // выходим из функции TradeSignalCounter() без получения торговых сигналов
}
//----------------------------------------------------------------------------------------------------------
if(CopyBuffer(BBol[Number],0,0,4,BB)<0)
{
Recount[Number]=true; // так как данные не получены, то следует вернуться
// в этот блок получения торговых сигналов на следующем тике!
return(false); // выходим из функции TradeSignalCounter() без получения торговых сигналов
}
//---- все операции копирования из индикаторного буфера завершены успешно
Recount[Number]=false; // можно не возвращаться в этот блок до очередной смены бара
//----------------------------------------------------------------------------------------------------------------
rsi = NormalizeDouble(RSI[1], _Digits); //
//===========================================================================================
if(mrate[1].close < BBLow[1] && rsi<30) UpSignal[Number] = true; // закрытие свечи ниже границы ВВ и РСА ниже 30
if(mrate[1].close > BBUp[1] && rsi>70) DnSignal[Number] = true; // закрытие свечи выше ВВ и РСА выше 70
//---- определение сигналов выхода
if(mrate[1].close < BBMidle[1]) DnStop[Number] = true; //
if(mrate[1].close > BBMidle[1]) UpStop[Number] = true; //
}
//---
return(true);
}
//+------------------------------------------------------------------+
//| Custom TradePerformer() function |
//+------------------------------------------------------------------+
Добрый день! Помогите добрым советом новичку.При
компиляции ошибок не дает.
При включении на графике выскакивает ошибка " array out jf range". Что не верно?
Ниже прилагаю фрагмент кода с ошибкой в строке с открытием сделки.(строка 100).
Спасибо.
Отдельно выведите здесь строку номер 100, ато массивов больно много, непонятно - в каком
if(mrate[1].close > BBUp[1] && rsi>70) DnSignal[Number] = true; // закрытие свечи выше ВВ и РСА выше 70
//---- определение сигналов выхода
if(mrate[1].close < BBMidle[1]) DnStop[Number] = true; //
if(mrate[1].close > BBMidle[1]) UpStop[Number] = true; //
if(mrate[1].close > BBUp[1] && rsi>70) DnSignal[Number] = true; // закрытие свечи выше ВВ и РСА выше 70
//---- определение сигналов выхода
if(mrate[1].close < BBMidle[1]) DnStop[Number] = true; //
if(mrate[1].close > BBMidle[1]) UpStop[Number] = true; //
Попробуйте сверху добавить
где-нибудь тут:
ArrayResize(Handle,Size_);
ArrayResize(Recount,Size_);
ArrayResize(MinBars,Size_);
Не помогло, та же ошибка. Что делать?
Подозреваю, что ошибка в другом массиве.
Про ошибку подробнее тогда напишите. Обычно указывается номер строки и номер позиции в строке.
Кажись понял
BBLow[1] - в этом массиве нет ни одного значения вообще.
Исправим эту ошибку, затем у Вас вылетит следующая строка по ошибке, т.к.
BBUp[1] - тоже самое
затем вылетит ошибка по следующим 2-м строкам, т.к.
BBMidle[1] - тоже самое
Эти массивы пустые. Непонятно - зачем у Вас они в условиях?
Занесите в эти три массива хотя бы что-нибудь, не менее 2-х значений и ошибка исчезнет.
Возможно стерт кусок кода из середины программы.
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Добрый день! Помогите добрым советом новичку.При
компиляции ошибок не дает.
При включении на графике выскакивает ошибка " array out jf range". Что не верно?
Ниже прилагаю фрагмент кода с ошибкой в строке с открытием сделки.(строка 100).
Спасибо.