Индикаторы: EMMA - страница 3

 

ToLik_SRGV, подскажите, как использовать ваш индикатор с помощью iCustom(), что-бы найти ближайший экстремум?
Пробую так:

double getEMMA()
{
        double data=0;
        int bar_num;
        for(bar_num=1; data==0; bar_num++){           
           data = iCustom(NULL,PERIOD_H4,"EMMA_Update_1",1,18,1,5,true,false,0,bar_num);   
        }
        Message("EMMA = "+data+" on bar "+bar_num);
        return (data);
}
Возвращается странное значение - на примере ниже я получаю значение экстремума номер 1, а номер 2 не видится, не говоря уже о нижних экстремумах. Что я делаю не так?

 
4ort:

ToLik_SRGV, подскажите, как использовать ваш индикатор с помощью iCustom(), что-бы найти ближайший экстремум?
Пробую так: ...


Вы все правильно делаете, для поиска последнего экстремума, ошибка закралась в передаче параметров в функцию iCustom(), вы забыли передать параметр EMMA_Deviation_in_Percent
нужно так:

data = iCustom(NULL,PERIOD_H4,"EMMA_Update_1",0.1,1,18,1,5,true,false,0,bar_num);
 
ToLik_SRGV:

Вы все правильно делаете, для поиска последнего экстремума, ошибка закралась в передаче параметров в функцию iCustom(), вы забыли передать параметр EMMA_Deviation_in_Percent
нужно так:

data = iCustom(NULL,PERIOD_H4,"EMMA_Update_1",0.1,1,18,1,5,true,false,0,bar_num);
Точно! Спасибо за индикатор!
 

Еще возник вопрос - пытаюсь запустить индикатор в советнике, и если таймфрейм индикатора совпадает с ТФ в тестере, то всё нормально, а если меньше чем в тестере то индикатор зависает. Вот например тестовый код:

extern  int EMMAtf = 30;
//+------------------------------------------------------------------+
double getEMMA() 
{
                double data=0;
                int bar_num;
                for(bar_num=1; data==0; bar_num++){                     
                        data = iCustom(NULL,EMMAtf,"EMMA_Update_1",0.08,1,5,1,4,false,false,0,bar_num); 
                }
                return (data);
}
//+------------------------------------------------------------------+
int start()
{       
                double stop_emma = getEMMA();
                
                if(stop_emma < Ask) Print("BUY");
                if(stop_emma > Bid) Print("SELL");                                              
}

Если прогоняю его в тестере на М30 и меньше, то всё нормально, если на Н1, то зависает...

 
4ort:

Еще возник вопрос - пытаюсь запустить индикатор в советнике, и если таймфрейм индикатора совпадает с ТФ в тестере, то всё нормально, а если меньше чем в тестере то индикатор зависает. Вот например тестовый код:

Если прогоняю его в тестере на М30 и меньше, то всё нормально, если на Н1, то зависает...

Илья, просто нельзя считывать показания индикаторов с меньшего периода. Это ограничение платформы MT4. Например для контраста возьмем период М1, и построим на нем Эмму, сформируется определенное количество пиков/впадин, но как их отобразить на одной часовой свече периода Н1? Тоже и у вас, когда вы пытаетесь рассчитать показания индикатора с М30 на часовке и выше. Также будет, если вы попытаетесь построить любой индикатор, а не только Эмму. Поэтому можно рассчитывать показатели только с больших периодов, например М30 для М1, М5, М15. Надеюсь понятно объяснил :)

 

На проверке модераторами новая версия UPDATE_2.

 
ToLik_SRGV:

Илья, просто нельзя считывать показания индикаторов с меньшего периода. Это ограничение платформы MT4. Например для контраста возьмем период М1, и построим на нем Эмму, сформируется определенное количество пиков/впадин, но как их отобразить на одной часовой свече периода Н1? Тоже и у вас, когда вы пытаетесь рассчитать показания индикатора с М30 на часовке и выше. Также будет, если вы попытаетесь построить любой индикатор, а не только Эмму. Поэтому можно рассчитывать показатели только с больших периодов, например М30 для М1, М5, М15. Надеюсь понятно объяснил :)

Меня терзают смутные сомненья... :) Вот пример с М1 - ведь я пытаюсь не отобразить на часовой свечке данные с М1, а получить в советнике данные ближайшего экстремума М1, который находится перед текущим временем, текущего бара Н1.
То есть я представлял себе это так - имея время текущего бара Н1, ищется на меньшем ТФ экстремум, находящийся ближе всего к этому времени открытия. Вроде всё логично, да и в справке нигде не нашел ограничений по использованию timeframe в iCustom()...

...может это ограничение только для пользовательских индикаторов? Стандартные ведь нормально берут данные с меньших ТФ (тот-же ишимоку, машки - я проверял).

 

4ort:

Меня терзают смутные сомненья... :)

Не напрасно :))) Вы пытаетесь получить на часовке, данные с получасовки, наприер для закрытия позиций, используя получасовой таймфрейм как опережающий? Я обычно делаю на оборот, для открытия использую больший период, а для закрытия текущий, меньший, но это не столь важно, дело вкуса :). Пробовал разобраться с зависаниями, оказалась все достаточно тривиально. Проблема в рассогласовании периодов. Когда вы пытаетесь на Н1 получить данные с М30, а М30 соответствующих часовке нет, то терминал пытается их загрузить, но четно, отсюда и зависания.
Посмотрите на вкладку журнал, там при зависании в место одной записи, например такой:

EMMA_Update_1 GBPUSD,M15: loaded successfully
Их очень много.
Вариантов решения проблемы два. Закачивать историю, и пересчитать ее на всех таймфреймах, или выбрать в тестере временной диапазон который присутствует на всех тестируемых периодах.

 
Да, всё верно, Анатолий, я хочу с помощью вашего индикатора найти входы и стопы для Ишимоку, очень красивые входы получаются, а размер стопа получается лучше, если его брать с меньшего ТФ.

Насчет истории котировок - да, этих записей куча вылезает loaded successfully, затем removed - но дело в том, что я использую как раз данные с минуток, переконвертировав их во все старшие ТФ (с 2003 года), так что рассогласований быть не должно... сейчас отконвертировал заново - то-же самое.
И в то-же время Ишимоку прекрасно работает с меньшим ТФ - в журнале ничего подобного нет.

Сейчас еще посмотрел журнал - например запись 2010.04.22 03:00 EMMA_Update_1 GBPUSD,M30: removed проверил вручную через F2 - этот бар присутствует и на Н1 и на М30, так что проблема не в истории...
 
4ort:
 ...  этих записей куча вылезает  loaded successfully, затем removed - но ...

В том то и дело что запись в журнале EMMA_Update_1 EURUSD,M30: loaded successfully должна быть одна, означает она, что все данные успешно загружены. Запись EMMA_Update_1 EURUSD,M30: removed – означает что советник закончил работу, и был удален. В журнале могут быть надписи типа: unmatched data error (high value 1.3566 at 2009.03.20 20:30 and price 1.3566 mismatched) – это ошибки рассогласования графиков на различных таймфреймах, не столь критично, и к зависанию отношения не имеют. Пробовал ваш код: 

extern  int EMMAtf = 30;
//+------------------------------------------------------------------+
double getEMMA() 
{
                double data=0;
                int bar_num;
                for(bar_num=1; data==0; bar_num++){                     
                        data = iCustom(NULL,EMMAtf,"EMMA_Update_1",0.08,1,5,1,4,false,false,0,bar_num); 
                }
                return (data);
}
//+------------------------------------------------------------------+
int start()
{       
                double stop_emma = getEMMA();
                
                if(stop_emma < Ask) Print("BUY");
                if(stop_emma > Bid) Print("SELL");                                              
}

Все работает, никаких ошибок, и зависаний. По этому сделал вывод, что ошибки нет, ни в индикаторе, ни в представленном коде. Скорее всего это все таки из за истории. Я тестировал на истории EUR/USD с 1999 года. Котировки закачивались через Архив котировок/Загрузить. Полностью М1, потом предложение пересчитать все таймфреймы, соглашаемся. Ни какие конвертеры не использовал, ошибки рассогласования графиков есть конечно, но не везде, и не критичны. Попробуйте все таки по экспериментировать с историей, возьмите какой ни будь кусок из середины, возможно другую валютную пару. Отпишите как прошли эксперименты. Удачи :)))

Причина обращения: