Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
не совсем так , из базы взял советник "Bolbands.mq5" и переделал на
использование индикатора ВВ и RSI( вместо DEMA). Он работает на 1 валюте,но хочу сделать мультик.
Ниже его фрагмент кода:
bool Buy_Condition =(mrate[1].close > BBLow[1] && mrate[1].open < BBLow[1] && // белая свеча пересекла нижнюю границу Болинджера снизу вверх
demaVal[0]>demaVal[1] && demaVal[1]>demaVal[2]); // DEMA растет
bool Sell_Condition = (mrate[1].close < BBUp[1] && mrate[1].open > BBUp[1] && // черная свеча пересекла верхнюю границу Болинджера сверху вниз
demaVal[0]<demaVal[1] && demaVal[1]<demaVal[2]); // DEMA убываетет
bool Buy_Close =(mrate[1].close < BBUp[1] && mrate[1].open > BBUp[1]); // черная свеча пересекла верхнюю границу Болинджера сверху вниз
bool Sell_Close =(mrate[1].close > BBLow[1] && mrate[1].open < BBLow[1]); // белая свеча пересекла нижнюю границу Болинджера снизу вверх
не совсем так , из базы взял советник "Bolbands.mq5" и переделал на
использование индикатора ВВ и RSI( вместо DEMA). Он работает на 1 валюте,но хочу сделать мультик.
Ниже его фрагмент кода:
bool Buy_Condition =(mrate[1].close > BBLow[1] && mrate[1].open < BBLow[1] && // белая свеча пересекла нижнюю границу Болинджера снизу вверх
demaVal[0]>demaVal[1] && demaVal[1]>demaVal[2]); // DEMA растет
bool Sell_Condition = (mrate[1].close < BBUp[1] && mrate[1].open > BBUp[1] && // черная свеча пересекла верхнюю границу Болинджера сверху вниз
demaVal[0]<demaVal[1] && demaVal[1]<demaVal[2]); // DEMA убываетет
bool Buy_Close =(mrate[1].close < BBUp[1] && mrate[1].open > BBUp[1]); // черная свеча пересекла верхнюю границу Болинджера сверху вниз
bool Sell_Close =(mrate[1].close > BBLow[1] && mrate[1].open < BBLow[1]); // белая свеча пересекла нижнюю границу Болинджера снизу вверх
Фрагмент ни о чем не говорит. Те же самые ошибки. Массивы пустые
Ищите в этом коде чему равны BBLow[], BBUp[]
У Вас присвоение значений в эти массивы + BBMidle[] в Вашем переделанном коде отсутствует!!!
Сначала нужно добиться, чтобы работало на одной паре.
Полный код оригинала в студию принесите, если самостоятельно не получится.
силь ву пле! Это работает , но на 1 паре пока.
//| bbrsimulti.mq5 |
//| Copyright 2016, MetaQuotes Software Corp. |
//| https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2010, AM2."
#property link "http://www.mql5.com"
#property version "1.05"
//--- входные параметры
input int bands_period= 20; // Период Bollinger Bands
input int rsi_period= 21; // Период RSI
input int bands_shift = 0; // Смещение относительно графика
input double deviation= 2.5; // Стандартное отклонение
input double Lot=0.1; // Количество лотов для торговли
//--- глобальные переменные
int BolBandsHandle; // хэндл индикатора Bolinger Bands
int rsiHandle; // хэндл индикатора DEMA
double BBUp[],BBLow[],BBMidle[]; // динамические массивы для хранения численных значений Bollinger Bands
double rsiVal[];
input int hi=71;
input int lw=29; // динамический массив для хранения значений индикатора Moving Average
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
//--- достаточно ли количество баров для работы
if(Bars(_Symbol,_Period)<60) // общее количество баров на графике меньше 60?
{
Alert("На графике меньше 60 баров, советник не будет работать!!");
return(-1);
}
//--- получить хэндл индикатора Bollinger Bands и DEMA
BolBandsHandle=iBands(NULL,PERIOD_M1,bands_period,bands_shift,deviation,PRICE_CLOSE);
rsiHandle=iRSI(NULL,PERIOD_M1,rsi_period,PRICE_CLOSE);
//--- Нужно проверить, не были ли возвращены значения Invalid Handle
if((BolBandsHandle<0) || (rsiHandle<0))
{
Alert("Ошибка при создании индикаторов - номер ошибки: ",GetLastError(),"!!");
return(-1);
}
return(0);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
//--- освобождаем хэндлы индикаторов
IndicatorRelease(BolBandsHandle);
IndicatorRelease(rsiHandle);
}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{
//--- для сохранения значения времени бара мы используем static-переменную Old_Time.
//--- при каждом выполнении функции OnTick мы будем сравнивать время текущего бара с сохраненным временем.
//--- если они не равны, это означает, что начал строится новый бар.
static datetime Old_Time;
datetime New_Time[1];
bool IsNewBar=false;
//--- копируем время текущего бара в элемент New_Time[0]
int copied=CopyTime(_Symbol,_Period,0,1,New_Time);
//--- ok, успешно скопировано
if(copied>0)
{
if(Old_Time!=New_Time[0]) // если старое время не равно
{
//--- новый бар
IsNewBar=true;
if(MQL5InfoInteger(MQL5_DEBUGGING)) Print("Новый бар",New_Time[0],"старый бар",Old_Time);
//--- сохраняем время бара
Old_Time=New_Time[0];
}
}
else
{
Alert("Ошибка копирования времени, номер ошибки =",GetLastError());
ResetLastError();
return;
}
//--- советник должен проверять условия совершения новой торговой операции только при новом баре
if(IsNewBar==false)
{
return;
}
//--- имеем ли мы достаточное количество баров на графике для работы
int Mybars=Bars(_Symbol,_Period);
if(Mybars<60) // если общее количество баров меньше 60
{
Alert("На графике менее 60 баров, советник работать не будет!!");
return;
}
MqlRates mrate[]; // Будет содержать цены, объемы и спред для каждого бара
//--- установим индексацию в массивах котировок и индикаторов как в таймсериях
//--- массив котировок
ArraySetAsSeries(mrate,true);
ArraySetAsSeries(rsiVal,true);
//--- массив значений индикаторов
ArraySetAsSeries(BBUp,true);
ArraySetAsSeries(BBLow,true);
ArraySetAsSeries(BBMidle,true);
//--- получить исторические данные последних 3-х баров
if(CopyRates(_Symbol,_Period,0,3,mrate)<0)
{
Alert("Ошибка копирования исторических данных - ошибка:",GetLastError(),"!!");
return;
}
//--- копируем новые значения индикаторов используя хэндлы
if(CopyBuffer(BolBandsHandle,0,0,3,BBMidle)<0 || CopyBuffer(BolBandsHandle,1,0,3,BBUp)<0
|| CopyBuffer(BolBandsHandle,2,0,3,BBLow)<0)
{
Alert("Ошибка копирования буферов индикатора Bollinger Bands - номер ошибки:",GetLastError(),"!!");
return;
}
if(CopyBuffer(rsiHandle,0,0,3,rsiVal)<0)
{
Alert("Ошибка копирования буферов индикатора RSI - номер ошибки:",GetLastError());
return;
}
double Ask = SymbolInfoDouble(_Symbol,SYMBOL_ASK); // лучшее предложение на покупку
double Bid = SymbolInfoDouble(_Symbol,SYMBOL_BID); // лучшее предложение на продажу
//--- объявляем переменные типа boolean, они будут использоваться при проверке условий для покупки и продажи
bool Buy_Condition =(rsiVal[1]<lw && mrate[1].close < BBLow[1] ); // DEMA растет
bool Sell_Condition = (rsiVal[1]>hi && mrate[1].close > BBUp[1]); // DEMA убываетет
bool Buy_Close =(mrate[1].close > BBMidle[1]); // черная свеча пересекла верхнюю границу Болинджера сверху вниз
bool Sell_Close =(mrate[1].close < BBMidle[1]); // белая свеча пересекла нижнюю границу Болинджера снизу вверх
if(Buy_Condition && !PositionSelect(_Symbol)) // Открываем длинную позицию
{ // DEМА растет и белая свеча пересекла нижнюю границу Болинджера снизу вверх
LongPositionOpen();
}
if(Sell_Condition && !PositionSelect(_Symbol)) // Открываем короткую позицию
{ // DEМА убывет и черная свеча пересекла верхнюю границу Болинджера сверху вниз
ShortPositionOpen();
}
if(Buy_Close && PositionSelect(_Symbol)) // Закрываем длинную позицию
{ // черная свеча пересекла верхнюю границу Болинджера сверху вниз
LongPositionClose();
}
if(Sell_Close && PositionSelect(_Symbol)) // Закрываем короткую позицию
{ // белая свеча пересекла нижнюю границу Болинджера снизу вверх
ShortPositionClose();
}
return;
}
//+------------------------------------------------------------------+
//| Открытие длинной позиции |
//+------------------------------------------------------------------+
void LongPositionOpen()
{
MqlTradeRequest mrequest; // Будет использоваться для отсылки торговых запросов
MqlTradeResult mresult; // Будет использоваться для получения результатов выполнения торговых запросов
ZeroMemory(mrequest);
ZeroMemory(mresult);
double Ask = SymbolInfoDouble(_Symbol,SYMBOL_ASK); // лучшее предложение на покупку
double Bid = SymbolInfoDouble(_Symbol,SYMBOL_BID); // лучшее предложение на продажу
if(!PositionSelect(_Symbol))
{
mrequest.action = TRADE_ACTION_DEAL; // немедленное исполнение
mrequest.price = NormalizeDouble(Ask,_Digits); // последняя цена ask
mrequest.sl = 0; // Stop Loss
mrequest.tp = 0; // Take Profit
mrequest.symbol = _Symbol; // символ
mrequest.volume = Lot; // количество лотов для торговли
mrequest.magic = 0; // Magic Number
mrequest.type = ORDER_TYPE_BUY; // ордер на покупку
mrequest.type_filling = ORDER_FILLING_FOK; // тип исполнения ордера - все или ничего
mrequest.deviation=5; // проскальзывание от текущей цены
OrderSend(mrequest,mresult); // отсылаем ордер
}
}
//+------------------------------------------------------------------+
//| Открытие короткой позиции |
//+------------------------------------------------------------------+
void ShortPositionOpen()
{
MqlTradeRequest mrequest; // Будет использоваться для отсылки торговых запросов
MqlTradeResult mresult; // Будет использоваться для получения результатов выполнения торговых запросов
ZeroMemory(mrequest);
ZeroMemory(mresult);
double Ask = SymbolInfoDouble(_Symbol,SYMBOL_ASK); // лучшее предложение на покупку
double Bid = SymbolInfoDouble(_Symbol,SYMBOL_BID); // лучшее предложение на продажу
if(!PositionSelect(_Symbol))
{
mrequest.action = TRADE_ACTION_DEAL; // немедленное исполнение
mrequest.price = NormalizeDouble(Bid,_Digits); // последняя цена Bid
mrequest.sl = 0; // Stop Loss
mrequest.tp = 0; // Take Profit
mrequest.symbol = _Symbol; // символ
mrequest.volume = Lot; // количество лотов для торговли
mrequest.magic = 0; // Magic Number
mrequest.type= ORDER_TYPE_SELL; // ордер на продажу
mrequest.type_filling = ORDER_FILLING_FOK; // тип исполнения ордера - все или ничего
mrequest.deviation=5; // проскальзывание от текущей цены
OrderSend(mrequest,mresult); // отсылаем ордер
}
}
//+------------------------------------------------------------------+
//| Закрытие длинной позиции |
//+------------------------------------------------------------------+
void LongPositionClose()
{
MqlTradeRequest mrequest; // Будет использоваться для отсылки торговых запросов
MqlTradeResult mresult; // Будет использоваться для получения результатов выполнения торговых запросов
ZeroMemory(mrequest);
ZeroMemory(mresult);
double Ask = SymbolInfoDouble(_Symbol,SYMBOL_ASK); // лучшее предложение на покупку
double Bid = SymbolInfoDouble(_Symbol,SYMBOL_BID); // лучшее предложение на продажу
if(PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_BUY)
{
mrequest.action = TRADE_ACTION_DEAL; // немедленное исполнение
mrequest.price = NormalizeDouble(Bid,_Digits); // последняя цена Bid
mrequest.sl = 0; // Stop Loss
mrequest.tp = 0; // Take Profit
mrequest.symbol = _Symbol; // символ
mrequest.volume = Lot; // количество лотов для торговли
mrequest.magic = 0; // Magic Number
mrequest.type= ORDER_TYPE_SELL; // ордер на продажу
mrequest.type_filling = ORDER_FILLING_FOK; // тип исполнения ордера - все или ничего
mrequest.deviation=5; // проскальзывание от текущей цены
OrderSend(mrequest,mresult); // отсылаем ордер
}
}
//+------------------------------------------------------------------+
//| Закрытие короткой позиции |
//+------------------------------------------------------------------+
void ShortPositionClose()
{
MqlTradeRequest mrequest; // Будет использоваться для отсылки торговых запросов
MqlTradeResult mresult; // Будет использоваться для получения результатов выполнения торговых запросов
ZeroMemory(mrequest);
ZeroMemory(mresult);
double Ask = SymbolInfoDouble(_Symbol,SYMBOL_ASK); // лучшее предложение на покупку
double Bid = SymbolInfoDouble(_Symbol,SYMBOL_BID); // лучшее предложение на продажу
if(PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_SELL)
{
mrequest.action = TRADE_ACTION_DEAL; // немедленное исполнение
mrequest.price = NormalizeDouble(Ask,_Digits); // последняя цена ask
mrequest.sl = 0; // Stop Loss
mrequest.tp = 0; // Take Profit
mrequest.symbol = _Symbol; // символ
mrequest.volume = Lot; // количество лотов для торговли
mrequest.magic = 0; // Magic Number
mrequest.type = ORDER_TYPE_BUY; // ордер на покупку
mrequest.type_filling = ORDER_FILLING_FOK; // тип исполнения ордера - все или ничего
mrequest.deviation=5; // проскальзывание от текущей цены
OrderSend(mrequest,mresult); // отсылаем ордер
}
}
//+------------------------------------------------------------------+
силь ву пле! Это работает , но на 1 паре пока.
Ну и прекрасно!
А где у Вас такое?
if(CopyBuffer(BolBandsHandle,0,0,3,BBMidle)<0 || CopyBuffer(BolBandsHandle,1,0,3,BBUp)<0
|| CopyBuffer(BolBandsHandle,2,0,3,BBLow)<0)
{
Alert("Ошибка копирования буферов индикатора Bollinger Bands - номер ошибки:",GetLastError(),"!!");
return;
}
Вернемся к первому посту - ошибка - выход за границы массива.
У Вас массив пустой, а Вы пытаетесь считать второе по порядку значение из массива.