//+------------------------------------------------------------------+//| Demo_iBands.mq5 |//| Copyright 2021, MetaQuotes Ltd. |//| https://www.mql5.com |//+------------------------------------------------------------------+#property copyright"Copyright 2021, MetaQuotes Ltd."#property link"https://www.mql5.com"#property version"1.00"//--- входные параметрыinputint bands_period=20; // период скользящей среднейinputint bands_shift=0; // сдвигinputdouble deviation=2.0; // кол-во стандартных отклоненийinputENUM_APPLIED_PRICE applied_price=PRICE_CLOSE; // тип цены//--- переменная для хранения хэндла индикатора iBandsint handle;
//+------------------------------------------------------------------+//| Expert initialization function |//+------------------------------------------------------------------+intOnInit()
{
//--- создадим хэндл индикатора
handle=iBands(_Symbol,_Period,bands_period,bands_shift,deviation,applied_price);
//--- если не удалось создать хэндлif(handle==INVALID_HANDLE)
{
//--- сообщим о неудаче и выведем номер ошибкиPrintFormat("Не удалось создать хэндл индикатора iBands для пары %s/%s, код ошибки %d",
_Symbol,
EnumToString(_Period),
GetLastError());
//--- работа индикатора завершается досрочноreturn(INIT_FAILED);
}
//---return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+//| Expert deinitialization function |//+------------------------------------------------------------------+voidOnDeinit(constint reason)
{
if(handle!=INVALID_HANDLE)
IndicatorRelease(handle);
//--- почистим график при удалении индикатораComment("");
}
//+------------------------------------------------------------------+//| Expert tick function |//+------------------------------------------------------------------+voidOnTick()
{
//--- индикаторные буферыdouble UpperBuffer[];
double LowerBuffer[];
double MiddleBuffer[];
//--- количество копируемых значений из индикатора iBandsint values_to_copy=2;
//--- если FillArraysFromBuffer вернула false, значит данные не готовы - завершаем работуif(!FillArraysFromBuffers(MiddleBuffer,UpperBuffer,LowerBuffer,bands_shift,handle,values_to_copy))
return;
//--- сформируем сообщениеPrint("MiddleBuffer =",MiddleBuffer[0], "UpperBuffer =",UpperBuffer[0], "LowerBuffer =",LowerBuffer[0], "values_to_copy =",values_to_copy);
}
//+------------------------------------------------------------------+//| Заполняем индикаторные буферы из индикатора iBands |//+------------------------------------------------------------------+bool FillArraysFromBuffers(double &base_values[], // индикаторный буфер средней линии Bollinger Bandsdouble &upper_values[], // индикаторный буфер верхней границыdouble &lower_values[], // индикаторный буфер нижней границыint shift, // смещениеint ind_handle, // хэндл индикатора iBandsint amount // количество копируемых значений
)
{
//--- сбросим код ошибкиResetLastError();
//--- заполняем часть массива MiddleBuffer значениями из индикаторного буфера под индексом 0if(CopyBuffer(ind_handle,0,-shift,amount,base_values)<0)
{
//--- если копирование не удалось, сообщим код ошибкиPrintFormat("Не удалось скопировать данные из индикатора iBands, код ошибки %d",GetLastError());
//--- завершим с нулевым результатом - это означает, что индикатор будет считаться нерассчитаннымreturn(false);
}
//--- заполняем часть массива UpperBuffer значениями из индикаторного буфера под индексом 1if(CopyBuffer(ind_handle,1,-shift,amount,upper_values)<0)
{
//--- если копирование не удалось, сообщим код ошибкиPrintFormat("Не удалось скопировать данные из индикатора iBands, код ошибки %d",GetLastError());
//--- завершим с нулевым результатом - это означает, что индикатор будет считаться нерассчитаннымreturn(false);
}
//--- заполняем часть массива LowerBuffer значениями из индикаторного буфера под индексом 2if(CopyBuffer(ind_handle,2,-shift,amount,lower_values)<0)
{
//--- если копирование не удалось, сообщим код ошибкиPrintFormat("Не удалось скопировать данные из индикатора iBands, код ошибки %d",GetLastError());
//--- завершим с нулевым результатом - это означает, что индикатор будет считаться нерассчитаннымreturn(false);
}
//--- все получилосьreturn(true);
}
//+------------------------------------------------------------------+
Ребята, кто не занят и может посмотреть. набросал советник по вчерашнему индюку но что-то он не так работает. Вроде он открывает сделки не по сигналам. И пробовал добавлять условия закрытия сделок на обратном сигнале но сделки то закрываются то нет. помогите найти ошибку. Может в условии ошибка?
inputint Magic = 000;
inputdouble Lots = 0.1;
inputint TakeProfit = 100;
inputint StopLoss = 50;
inputint Slippage = 5;
double vverh,vnuz,SL,TP;
int tiket;
//+------------------------------------------------------------------+//| Expert initialization function |//+------------------------------------------------------------------+intOnInit()
{
//---/* if (Digits == 3 || Digits == 5)
{
TakeProfit *=10;
StopLoss *=10;
Slippage *=10;
}*///---return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+//| Expert deinitialization function |//+------------------------------------------------------------------+voidOnDeinit(constint reason)
{
//---
}
//+------------------------------------------------------------------+//| Expert tick function |//+------------------------------------------------------------------+voidOnTick()
{
//---
vverh = iCustom(NULL,0,"777",0,1); // стрелка вверх
vnuz = iCustom(NULL,0,"777",1,1); // стрелка вниз//-----------------------------------------------------------if (CountSell() == 0 && vnuz >0)
{
tiket = OrderSend(Symbol(),OP_SELL,Lots,Bid,Slippage,0,0,"",Magic,0, Red);
if (tiket>0)
{
SL=NormalizeDouble(Bid+StopLoss*Point,Digits);
TP=NormalizeDouble(Bid-TakeProfit*Point,Digits);
if (OrderSelect(tiket, SELECT_BY_TICKET))
if (!OrderModify(tiket,OrderOpenPrice(),SL,TP,0))
Print("Ошибка модификации ордера на продажу");
} elsePrint("Ошибка открытия ордера на продажу");
}
////////////////////////////////////////////////////////////////if (CountBuy() == 0 && vverh >0)
{
tiket = OrderSend(Symbol(),OP_BUY,Lots,Ask,Slippage,0,0,"",Magic,0,Blue);
if (tiket>0)
{
TP=NormalizeDouble(Ask+TakeProfit*Point,Digits);
SL=NormalizeDouble(Ask-StopLoss*Point,Digits);
if (OrderSelect(tiket, SELECT_BY_TICKET))
if (!OrderModify(tiket,OrderOpenPrice(),SL,TP,0))
Print("Ошибка модификации ордера на покупку");
} elsePrint("Ошибка открытия ордера на покупку");
}
}
//+------------------------------------------------------------------+int CountSell()
{
int count =0;
for (int trade = OrdersTotal()-1; trade>=0; trade--)
{
if (OrderSelect(trade,SELECT_BY_POS,MODE_TRADES))
{
if (OrderSymbol()==Symbol() && OrderMagicNumber()==Magic && OrderType() == OP_SELL)
count++;
}
}
return(count);
}
//+------------------------------------------------------------------+int CountBuy()
{
int count =0;
for (int trade = OrdersTotal()-1; trade>=0; trade--)
{
if (OrderSelect(trade,SELECT_BY_POS,MODE_TRADES))
{
if (OrderSymbol()==Symbol() && OrderMagicNumber()==Magic && OrderType()==OP_BUY)
count++;
}
}
return(count);
}
jarikn: Ребята, кто не занят и может посмотреть. набросал советник по вчерашнему индюку но что-то он не так работает. Вроде он открывает сделки не по сигналам. И пробовал добавлять условия закрытия сделок на обратном сигнале но сделки то закрываются то нет. помогите найти ошибку. Может в условии ошибка?
Скорее всего индикатор рисует...и еще смотри ошибки в журнале
По какой причине? Чего сразу не пишите что не так?
потому что разработчики написали, что OnInit() предназначен для инициализации, а не для чего то другого
что произойдет не буду гадать, первое, что вижу - вот Вы сделали паузу чтобы получить в OnInit() значения индикатора - что будет если в это время юзер переключит ТФ?
ЗЫ: а как поведет себя Ваш код если запустить эксперт, затем закрыть терминал и опять открыть терминал с уже запущенным советником?
Ясно. Спасибо. Может еще кто-нибудь подскажет?
заодно тоже с Вами по учился
Только не удивляйтесь, когда перестанет или будет через раз работать.
По какой причине? Чего сразу не пишите что не так?
По какой причине? Чего сразу не пишите что не так?
Что за наезды?
Что за наезды?
Ясно.
Может кто-то еще подскажет что там не так, и по какой причине перестанет работать, если действительно что-то не так?
Ясно.
Может кто-то еще подскажет что там не так, и по какой причине перестанет работать, если действительно что-то не так?
Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий
Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам
Igor Makanu, 2021.07.05 14:16
потому что индикатор еще не рассчитан
https://www.mql5.com/ru/docs/series/barscalculated
секция OnInit() не самое лучшее место, чтобы получать окружение терминала, думаю, что все логично и правильно работаетВот ведь ответ
Спасиб.
Надо чтоб сразу при запуске делал расчеты на истории. Делаю в ините потому что необходимость вот такая.
Добавил паузу в ините, перед расчетами. Если так, то все-равно какие-то "подводные камни"?
Надо чтоб сразу при запуске делал расчеты на истории. Делаю в ините потому что необходимость вот такая.
Добавил паузу в ините, перед расчетами. Если так, то все-равно какие-то "подводные камни"?
Проще и надёжней поставить флаг первого запуска в OnTick()
Ребята, кто не занят и может посмотреть. набросал советник по вчерашнему индюку но что-то он не так работает. Вроде он открывает сделки не по сигналам. И пробовал добавлять условия закрытия сделок на обратном сигнале но сделки то закрываются то нет. помогите найти ошибку. Может в условии ошибка?
По какой причине? Чего сразу не пишите что не так?
потому что разработчики написали, что OnInit() предназначен для инициализации, а не для чего то другого
что произойдет не буду гадать, первое, что вижу - вот Вы сделали паузу чтобы получить в OnInit() значения индикатора - что будет если в это время юзер переключит ТФ?
ЗЫ: а как поведет себя Ваш код если запустить эксперт, затем закрыть терминал и опять открыть терминал с уже запущенным советником?