Как извлечь значения DI и -DI из индикатора iADX() в MQL4 / MQL5?

#mql4 #mql5

#mql4 #mql5

Вопрос:

Я новичок в MQL4 и я пишу свой первый советник.

Моя цель — получить переменные DI и -DI индикатора ADX.
Я использовал iADX() функцию, как показано здесь:

 double a;

int OnInit() {

    a = iADX( NULL, 0, 0, PRICE_CLOSE, MODE_PLUSDI, 0 );

    Alert( a );
}
  

Но он продолжает печатать 0.0

Я неправильно ввел параметры iADX() функции?

Я просто хотел бы извлечь значения DI и -DI , чтобы я мог использовать их в своем коде.

Комментарии:

1. Привет, шанс. Когда у вас появится свободная минутка, пожалуйста, ознакомьтесь с рекомендациями по использованию Stack Overflow и, в частности, обратите внимание, что другие люди могут редактировать ваши сообщения. Мы склонны редактировать приветствия, заранее спасибо, явные просьбы о помощи и т. Д. — Это «пух», который не добавляет ничего, кроме дополнительных слов для чтения. Не могли бы вы свернуть его обратно, пожалуйста?

2. @halfer спасибо, я не знал. Спасибо за информацию!

Ответ №1:

Сначала синтаксис:

 double iADX( string symbol,        // BEST AS: _Symbol
             int    timeframe,     // BEST AS: one of {}-ENUMs ~ PERIOD_CURRENT
             int    period,        //          averaging period 
             int    applied_price, // BEST AS: one of {}-ENUMs ~ PRICE_CLOSE
             int    mode,          // BEST AS: one of {}-ENUMs ~ MODE_PLUSDI
             int    shift          //          shift 
             );
  

Почему 0.0 ?

Как только мы прочитаем вызывающий интерфейс, требование усреднить выбранную последовательность PRICE_CLOSE записей, сохраненных для current Symbol() ( NULL ), кажется справедливым, но просто обратите внимание, что выполнение этого для баров с нулевой последовательностью предписывает ничего не делать, вместо того, чтобы использовать какое-то разумное исчисление SUM( Close[i..j] )/period , позволяющее выполнять какую-либо значимую обработку.

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

 double DI_plus,
       DI_minus;
int    ADX_PERIOD = 8;

int    OnInit() {
       ObjectCreate( ChartID(), "GUI-SHOW DI", ... );               // LABEL for  DI
       ObjectCreate( ChartID(), "GUI-SHOW-DI", ... );               // LABEL for -DI
       }

int    OnTick() {

       DI_plus  = iADX( _Symbol,
                        PERIOD_CURRENT,
                        ADX_PERIOD,
                        PRICE_CLOSE,
                        MODE_PLUSDI,
                        0
                        );
       DI_minus = iADX( _Symbol,
                        PERIOD_CURRENT,
                        ADX_PERIOD,
                        PRICE_CLOSE,
                        MODE_MINUSDI,
                        0
                        );
       ObjectSetString( Chart_ID(),
                        "GUI-SHOW DI",
                        OBJPROP_TEXT,
                        StringFormat(" DI .6f", DI_plus )
                        );
       ObjectSetString( Chart_ID(),
                        "GUI-SHOW-DI",
                        OBJPROP_TEXT,
                        StringFormat("-DI .6f", DI_minus )
                        );
       }
  

Ответ №2:

У ADX есть один параметр — его период. и вы используете индикатор с периодом = 0, в таком случае он возвращает нули…

 double a;
int period = 14;

int OnInit() {
   a = iADX( NULL, 0, period, PRICE_CLOSE, MODE_PLUSDI, 0 );
   Alert( a );
}
  

Также я не уверен, что вызывать индикатор OnInit() — хорошая идея — иногда у вас еще нет загруженных баров, а иногда есть, возможно, это исправлено, но я помню, что несколько месяцев назад у моего клиента была такая проблема, особенно при смене таймфреймов.