- Начало работы
- Создание готового советника - Мастер MQL4/MQL5
- Мастер MQL4/MQL5
Здравствуйте! В mql4 полный новичек, имеется готовый индикатор, решил добавить в него алерт. Когда условия выполняются, алерт начинает очень много "пиликать". Как от этого избавиться, чтобы он издавал сигналы всего раза три. Вот мой код. Код на алерт выделил.
С алертом все ок, очевидно, слишком часто находятся пики в этой части кода
bool isfoundpik = findpik(i); if( isfoundpik ){
Попробуйте перед алертом вставить Print, чтобы посмотреть, как часто находятся пики
С алертом все ок, очевидно, слишком часто находятся пики в этой части кода
Попробуйте перед алертом вставить Print, чтобы посмотреть, как часто находятся пики
Ну да всё дело в функции
bool isfoundpik = findpik(i);
Т.е вот я например удаляю эту синюю линию с графика, через секунду он снова рисуется. Заканчивается алерт, когда закрывается 1 бар на индикаторе AO. Как тогда нормально всё сделать?
Ну да всё дело в функции
bool isfoundpik = findpik(i);
Т.е вот я например удаляю эту синюю линию с графика, через секунду он снова рисуется. Заканчивается алерт, когда закрывается 1 бар на индикаторе AO. Как тогда нормально всё сделать?
Код findpik(i) выложите, посмотрим, может, что и найдем вредного )
Давайте сам файл скину вам сюда)
АНАЛогичная ситуация. Срабатывает по несколько раз... Индикатор показывает стрелкой место и направление пересечения бара с МА:
int OnCalculate(const int rates_total, //Размер входных таймсерий
const int prev_calculated, //Обработано баров на предыдущем вызове
const datetime &time[], //Time
const double &open[], //Open
const double &high[], //High
const double &low[], //Low
const double &close[], //Close
const long &tick_volume[], //Tick Volume
const long &volume[], //Real Volume
const int &spread[]) //Spread
{
//---
if (Bars <= MA_Period) return (0); //Проверка количества баров на достаточность для расчёта
int ExtCountedBars = IndicatorCounted(); //Получение уже посчитанных баров
if (ExtCountedBars < 0) return (-1); //Проверка на возможные ошибки
if (ExtCountedBars > 0) ExtCountedBars--; //Последний посчитанный бар должен быть пересчитан
if (Volume[1] > 1)
for (int index = Bars - ExtCountedBars-1;index>=0; index--) //Оосновной цикл расчёта индиатора
{
double oMA = iMA(NULL,MA_TimeFrame,MA_Period,MA_Shift,MA_Method,PRICE_CLOSE, index); //Получение значений индикатора в переменные
double cMA = iMA(NULL,MA_TimeFrame,MA_Period,MA_Shift,MA_Method,PRICE_OPEN, index);
if (Open[index] < oMA && Close[index] > cMA)
// if (Open[index] < oMA && Close[index] > oMA && Open[index] < cMA && Close[index] > cMA) //Проверка условий восходящего движения
{
UPBuffer[index] = Low[index]-20*Point; //Отрисовка стрелки ВВЕРХ
Alert(Symbol(), " ", Period(), "Signal:UP!");
}
if (Open[index] > oMA && Close[index] < cMA)
// if (Open[index] > oMA && Close[index] < oMA && Open[index] > cMA && Close[index] < cMA) //Проверка условий нисходящего движения
{
DOWNBuffer[index] = High[index]+20*Point; //Отрисовка стрелки ВНИЗ
Alert(Symbol(), " ", Period(), "Signal:DOWN!");
}
}
//--- return value of prev_calculated for next call
return(rates_total);
}
Стрелку 1 раз рисует, а алертов куча.
Помогите: Укажите ошибку или напишите решения (комментария в кокоде приветствуются)
Спасибо!
Сейчас посмотрю, что там не так
Решаю проблему всегда так:
В шапку индикатора или советника
sinput ENUM_TIMEFRAMES RefreshBar = PERIOD_M1; // THE_REFRESH_BAR
sinput bool UseSound = True; // USE_A_SOUND
Функция
//+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~+ //| isNewBar(). Возвращает True, если появился новый бар по символу-периоду, иначе False. |>ok //+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~+ bool NewBar(int per) { //--- static datetime tm=0; // В стат. переменной будем помнить время открытия последнего бара datetime tb=(datetime)SeriesInfoInteger(Symbol(), per, SERIES_LASTBAR_DATE); // Текущее время if (tm==0) { // Если это первый вызов функции tm=tb; // Установим время и выйдем return (False); } if (tm!=tb) { // Если время отличается tm=tb; // Запомним время и вернем True return (True); } return (False); // Дошли до сюда - значит бар не новый, вернем False }
Использую
if (UseSound && NewBar(RefreshBar)) PlaySound("\\Sounds\\MELOCH.wav");
То есть: если условия выполнены даем алерт 1 раз в минуту с появлением нового бара, так как переменная RefreshBar = PERIOD_M1.
Есть варианты попроще, но меня этот вполне устраивает.
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования