Скачать MetaTrader 5
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Опубликовал программу в Маркете? Опубликуй ее и в блоге - виджет поможет!
roman57
9
roman57 2012.02.27 15:21 
Добрый день друзья! Помогите разобраться, совсем не могу въехать ((. Суть задачи такова. Взять данные с индикатора MA и бара. Проверить значение текущего бара выше текущего значения МА. Спасибо за помощь!
Владимир Жириновский
2632
Владимир Жириновский 2012.02.27 18:48  

В учебнике это есть .

Вот оттуда https://book.mql4.com/ru/samples/indicators


Скользящее Среднее (Moving Average, MA).

Технический Индикатор Скользящее Среднее (Moving Average, MA) показывает среднее значение цены инструмента за некоторый период времени. Индикатор отражает общую тенденцию рынка - может расти, убывать или показывать незначительные колебания возле некоторой цены.

Для получения значения индикаторной линии МА в какой-либо момент времени необходимо воспользоваться стандартной функцией:

double iMA(string symbol, int timeframe, int period, int ma_shift, int ma_method, int applied_price, int shift)

Параметры:

symbol - символьное имя инструмента, на данных которого будет вычисляться индикатор. NULL означает текущий символ.

timeframe - период. Может быть одним из периодов графика. 0 означает период текущего графика.

period - период усреднения для вычисления скользящего среднего.

ma_shift - сдвиг индикатора относительно ценового графика.

ma_method - метод усреднения. Может быть одним из значений методов скользящего среднего (Moving Average).

applied_price - используемая цена. Может быть любой из ценовых констант.

shift - индекс значения, получаемого из индикаторного массива (сдвиг относительно текущего бара на указанное количество баров назад).

Ниже приведен пример вызова функции технического индикатора из эксперта callindicator.mq4 :

//--------------------------------------------------------------------
// callindicator.mq4
// Предназначен для использования в качестве примера в учебнике MQL4.
//--------------------------------------------------------------------
extern int Period_MA = 21;            // Период расчётной МА
bool Fact_Up = true;                  // Факт сообщения, что цена..
bool Fact_Dn = true;                  //..находится выше или ниже МА
//--------------------------------------------------------------------
int start()                           // Спец. функция start
  {
   double MA;                         // Значение МА на 0 баре    
//--------------------------------------------------------------------
                                      // Обращение к функции техн.инд.
   MA=iMA(NULL,0,Period_MA,0,MODE_SMA,PRICE_CLOSE,0); 
//--------------------------------------------------------------------
   if (Bid > MA && Fact_Up == true)   // Проверка прохода вверх
     {
      Fact_Dn = true;                 // Сообщать о цене выше МА
      Fact_Up = false;                // Не сообщать о цене ниже МА
      Alert("Цена находится выше MA(",Period_MA,").");// Сообщение 
     }
//--------------------------------------------------------------------
   if (Bid < MA && Fact_Dn == true)   // Проверка прохода вниз
     {
      Fact_Up = true;                 // Сообщать о цене ниже МА
      Fact_Dn = false;                // Не сообщать о цене выше МА
      Alert("Цена находится ниже MA(",Period_MA,").");// Сообщение 
     }
//--------------------------------------------------------------------
   return;                            // Выход из start()
  }
//--------------------------------------------------------------------

В эксперте callindicator.mq4 используется вызов функции iMA() технического индикатора Скользящее Среднее. Рассмотрим эту часть кода более подробно:

   MA=iMA(NULL,0,Period_MA,0,MODE_SMMA,PRICE_CLOSE,0);

NULL означает, что расчёт скользящей средней производится для того финансового инструмента, в окно которого присоединён эксперт (в данном случае - эксперт, в общем случае - любая прикладная программа);

0 - расчёт производится для таймфрейма, установленного в окне финансового инструмента, к которому присоединён эксперт;

Period_MA - значение периода усреднения задано во внешней переменной; если после присоединения к окну финансового инструмента пользователь не изменил это значение на панели настроек внешних переменных эксперта, то это значение равно 5;

0 - сдвиг индикаторного массива относительно ценового графика не производился, т. е значения элементов индикаторного массива содержат те значения МА, которые рассчитаны для баров, на которых отображается индикаторная линия;

MODE_SMA - для расчёта выбран метод простого скользящего среднего;

PRICE_CLOSE - для расчёта принята цена закрытия бара;

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

Учитывая, что сдвиг индикаторного массива относительно ценового графика не производился, значение скользящей средней получено для нулевого бара. Функция iMA() возвращает некоторое значение, которое присваивается переменной MA. В дальнейших строках программы это значение сравнивается с текущей ценой Bid. Если текущая цена оказывается выше или ниже полученного значения МА (т.е. выше линии), то выдаётся сообщение пользователю. Использование в программе переменных Fact_Up и Fact_Dn позволяет выводить сообщения только в случаях, если происходит первое проникновение цены через линию МА (обратите внимание, голубая индикаторная линия в окне финансового инструмента отражена не потому, что функция технического индикатора была вызвана из программы, а потому, что пользователь прикрепил индикатор в окно, Рис. 104).


Рис. 105. Результат работы эксперта callindicator.mq4.

Здесь необходимо напомнить, что по мере появления новых баров индексы исторических баров увеличиваются, а текущий, развивающийся бар всегда имеет индекс 0. В эксперте callindicator.mq4 функция технического индикатора iMA() возвращает значение, рассчитанное для нулевого бара. Несмотря на то, что во время исполнения данного эксперта значение этого индекса никогда не меняется (т.е. расчёт всегда производится для нулевого бара), значение, возвращаемое функцией iMA(), всегда будет соответствовать последнему расчётному, а именно, рассчитанному для текущего нулевого бара.

Если для каких-либо расчётов в программе необходимо получить значение функции технического индикатора не для нулевого, а для какого-либо исторического бара, то в вызове функции необходимо указать значение индекса того элемента индикаторного массива, который нужен. Рассмотрим пример эксперта historybars.mq4, в котором вычисляется значение Скользящей Средней на четвёртом баре:

//--------------------------------------------------------------------
// historybars.mq4
// Предназначен для использования в качестве примера в учебнике MQL4.
//--------------------------------------------------------------------
extern int Period_MA = 5;             // Период расчётной МА
//--------------------------------------------------------------------
int start()                           // Спец. функция start
  {
   double MA_c,                       // Значение МА на 0 баре    
          MA_p,                       // Значение МА на 4 баре    
          Delta;                      // Разница МА на 0 и 4 баре
//--------------------------------------------------------------------
                                      // Обращение к функции техн.инд.
   MA_c  = iMA(NULL,0,Period_MA,0,MODE_SMA,PRICE_CLOSE,0); 
   MA_p  = iMA(NULL,0,Period_MA,0,MODE_SMA,PRICE_CLOSE,4); 
   Delta = (MA_c - MA_p)Point;       // Разница МА на 0 и 4 баре
//--------------------------------------------------------------------
   if (Delta > 0 )                    // Текущая цена больше старой
      Alert("На 4 барах МА выросла на ",Delta,"pt");  // Сообщение 
   if (Delta < 0 )                    // Текущая цена меньше старой
      Alert("На 4 барах МА снизилась на ",-Delta,"pt");// Сообщение 
//--------------------------------------------------------------------
   return;                            // Выход из start()
  }
//--------------------------------------------------------------------

В эксперте historybars.mq4 рассчитываются значения МА для текущего бара (с индексом 0) и для четвёртого бара (с индексом 4). Указанные значения индексов 0 и 4 в процессе работы (этой, конкретной) программы не изменяются, в то же время программа может работать бесконечно долгое время, всякий раз выполняя необходимые вычисления значений МА для нулевого и четвёртого бара. Здесь важно ещё раз отметить: несмотря на то, что вычисления ведутся для МА на барах с одними и теми же индексами, сами значения МА будут меняться, а именно соответствовать текущим значениям МА на текущем нулевом и текущем четвёртом баре.


Рис. 106. Результат работы эксперта historybars.mq4.

На Рис. 106 хорошо видно, что по мере роста цены на последних барах МА поднимается вверх. Разница между значениями МА на нулевом и четвёртом барах также растёт, что находит своё отражение в сообщениях функции Alert().

/
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий