Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам - страница 2669

 

Добрый день! 

Недавно появилась странная вещь. Ставлю советник на график. Работает он в этом графике, всё верно, но при этом в меню по ПКМ этот же советник появляется во всех открытых графиках. Раньше такого не замечал. Возможно появилось после последнего обновления.

На всех графиках становится ярким "Список экспертов" и везде один и тот же показан. Причём, если удалить его на любом из графиков один раз - удаляется везде.

Finam Meta Trader 5 Version: 5.00 build 5320 26 sep 2025 

 
lynxntech #:

так же со всех окон печатает, фильтровать удается только по текущему символу, дальше пока не буду пробовать

А если символов с одинаковым периодом несколько?
 
Vitaly Murlenko #:

Вы не понимаете, что просите. Простая средняя - это то самое арифметическое среднее, которое нам давали в школе. Это ни что иное, как среднее значение числового ряда. Вычисляется по алгоритму: суммируем все значения числового ряда и делим на их количество. У скользящей средней количество элементов числового ряда называется термином "период усреднения". Например имеем числовой ряд из значений цен закрытия трёх последних свеч: 125,5  125,8  125,2. Сумма этих значений = 376,5. Число элементов нашего ряда = 3 (период усреднения). Поэтому 376,5/3 = 125,5. А вот теперь самое интересное. Закрылась ещё одна свеча. Например, по цене 126,0. Мы имеем теперь числовой ряд, состоящий уже из 4-х элементов: 125,5  125,8  125,2 и 126,0. Но поскольку мы вычисляем трёх-периодное среднее, то берём только три последних элемента. Это числа 125,8  125,2 и 126,0. Первый элемент 125,5 - отбрасывается. Что мы теперь имеем? (125,8 + 125,2 + 126,0) / 3 = 125,7.

Чтоб на пятиминутном графике получить значение простой средней, нужно кинуть на график индикатор Moving Averages (В терминале в списке трендовых индикаторов он есть), и в его параметрах указать, что строится он по ценам закрытия и указать период усреднения (сколько именно последних свеч) мы будем брать для вычисления значения средней величины.

что такое простая средняя и как она строится я прекрасно понимаю.

имеем на 5 минутном графике например предыдущую свечу. По вашему я кидаю на график индикатор простой средней с ценой закрытия и периодом.

мне надо чтоб эта средняя прошла по цене закрытия предыдущей свечи, а для этого надо знать период этой средней.

так вот я изначально имею цену закрытия предыдущей свечи и мне надо вычислить период средней ,чтоб она прошла по этой цене  в данный момент времени.

я написал программку поиска периода этой средней, но она получилась корявой и мне не нравится.

вот я и спрашиваю может такая программка где нибудь есть в библиотеке ?

 
fvdtrejder #:
вот я и спрашиваю может такая программка где нибудь есть в библиотеке ?
Навряд ли.
И причина аналогична той, по которой никто не может поймать Неуловимого Джо.
 
fvdtrejder #:
мне надо чтоб эта средняя прошла по цене закрытия предыдущей свечи, а для этого надо знать период этой средней.
Она никогда не пройдёт по цене закрытия, только может оказаться на близком рассмотрении.
 
fvdtrejder #:

что такое простая средняя и как она строится я прекрасно понимаю.

имеем на 5 минутном графике например предыдущую свечу. По вашему я кидаю на график индикатор простой средней с ценой закрытия и периодом.

мне надо чтоб эта средняя прошла по цене закрытия предыдущей свечи, а для этого надо знать период этой средней.

так вот я изначально имею цену закрытия предыдущей свечи и мне надо вычислить период средней ,чтоб она прошла по этой цене  в данный момент времени.

я написал программку поиска периода этой средней, но она получилась корявой и мне не нравится.

вот я и спрашиваю может такая программка где нибудь есть в библиотеке ?

Нельзя посчитать среднюю для конца ряда.) ну если только для периода 1 или 2. Для периода три это будет для предпоследней свечи)
 
fvdtrejder #:
мне надо чтоб эта средняя прошла по цене закрытия предыдущей свечи, а для этого надо знать период этой средней.

алгоритмически : увеличиваете период средней от 2-х до собственных ограничений пока результат вас не удовлетворит 

ровно точка в точку не будет. Но если примерно и с допусками то есть шанс найти (кстати такого может и не быть)

PS/ надеюсь SMA умеете считать не прибегая к iMA(_Symbol,_Period,.....)

PPS/ когда сумма_с_накоплением/число_шагов_накопления примерно сошлось к требуемой величине, число_шагов_накопления есть искомый вами период

 
fvdtrejder #:


мне надо чтоб эта средняя прошла по цене закрытия предыдущей свечи, а для этого надо знать период этой средней.

так вот я изначально имею цену закрытия предыдущей свечи и мне надо вычислить период средней ,чтоб она прошла по этой цене  в данный момент времени.


Или я не так играю, или Вы не так поёте. Зачем вычислять период средней, если заранее известно, что значение линии на предыдущей свече равно цене закрытия этой свечи?

Или Вам нужно, чтоб это значение было и на нулевой свече? Вот код. Если нужно чтоб оно было и на нулевой свече, то раскомментируйте строку 49

//+------------------------------------------------------------------+
//|                                                     MA_Close.mq4 |
//+------------------------------------------------------------------+
#property version   "1.00"
#property strict
#property indicator_chart_window
#property indicator_buffers 1
#property indicator_buffers 1
#property indicator_color1 clrBlue
#property indicator_width1 2
input int DrawDeep=250;// Глубина отрисовки
double MA_Buffer[];
int limit;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit(){
        //--- indicator buffers mapping
        SetIndexStyle(0,DRAW_LINE);
        SetIndexBuffer(0,MA_Buffer);
        limit=(-1);
        return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[]){
        if(limit<0){
                limit=DrawDeep;
        }
        else{
                if(rates_total==prev_calculated){
                        limit=0;
                }
                if(rates_total>prev_calculated){
                        limit=1;
                }
        }
        for(int i=limit;i>=0;i--){
                //if(i==0){MA_Buffer[0]=Close[1]; break;}
                // Заполняем буффер значениями 
                MA_Buffer[i]=Close[i];
        }
        return(rates_total);
}
//+------------------------------------------------------------------+
 
 
 
Или нужно всегда чтоб значение текущей свечи было равно значению цены закрытия предыдущей свечи? Если да, то код легко поменять на Close[i+1]. Только для этого в блоке инициализации строку 38 нужно написать так: limit=DrawDeep-1;