#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()
— хорошая идея — иногда у вас еще нет загруженных баров, а иногда есть, возможно, это исправлено, но я помню, что несколько месяцев назад у моего клиента была такая проблема, особенно при смене таймфреймов.