Вопросы от начинающих MQL5 MT5 MetaTrader 5 - страница 1540

 
MrBrooklin #:

Всё! Не мучайтесь. Вот Вам код для получения значений индикатора ATR:

Дальше, уж будьте добры, сами.

С уважением, Владимир

Не правлильно.

Вы в OnInit() проверяете хендл и выходите из обработчика, если хендл не валидный (а он нулевой в лучшем случае. В худшем - там мусор, так как Handle_ATR не инициализирована). Создаёте же индикатор с присвоением хендлу корректного значения только в OnTick() - а зачем там? В OnInit() создавайте индикатор и получайте его хендл. В OnTick() обращайтесь по хендлу за данными индикатора.

 
Artyom Trishkin #:

Не правлильно.

Вы в OnInit() проверяете хендл и выходите из обработчика, если хендл не валидный (а он нулевой в лучшем случае. В худшем - там мусор, так как Handle_ATR не инициализирована). Создаёте же индикатор с присвоением хендлу корректного значения только в OnTick() - а зачем там? В OnInit() создавайте индикатор и получайте его хендл. В OnTick() обращайтесь по хендлу за данными индикатора.

Спасибо, Артём. Ещё не до конца проснулся. )) Сейчас исправлю.

С уважением, Владимир.

P.S. Исправил код.
 
MrBrooklin #:
double atr_value=NormalizeDouble(atr_array_value[0], 5); // нормализуем значения индикатора ATR
А зачем? Какой смысл?
 
Artyom Trishkin #:
А зачем? Какой смысл?

Говорю же, спросонья написал. )) Поправил.

С уважением, Владимир.

 

Исправленный вариант:

//+------------------------------------------------------------------+
//| Input variables                                                  |
//+------------------------------------------------------------------+
input ushort Averaging_Period=14; // Период усреднения индикатора ATR

int Handle_ATR;
double atr_array_value[]; // создадим массив для значений индикатора ATR
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
   Handle_ATR=iATR(_Symbol, PERIOD_CURRENT, Averaging_Period); // получим хэндл индикатора ATR
   if(Handle_ATR==INVALID_HANDLE)
     {
      Print("Некорректный хэндл индикатора ATR!");
      return(INIT_FAILED);
     }
   ArraySetAsSeries(atr_array_value, true); // зададим индексацию элементов массива, как в таймсериях
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   IndicatorRelease(Handle_ATR);
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   int copy_buffer = CopyBuffer(Handle_ATR, 0, 0, 3, atr_array_value); // копируем в массив данные указанного буфера индикатора ATR
   if(copy_buffer > 0) // если скопированные данные больше нуля
      Print("Значение ATR = ", DoubleToString(atr_array_value[0], 5)); // выведем на печать
  }
//+------------------------------------------------------------------+

С уважением, Владимир.

 

а ничего так,что  SYMBOL_PRICE_VOLATILITY и ATR в общем разные вещи ?

как в школе, проверяем в чём измеряется и от чего считается...


первый это справочный параметр из спецификации (или транслируемый DC), не связан с таймфреймами и измеряемый в %

второй статистический за произвольный период конкретного таймфрейма, измеряемый в единицах котировки


для привычного Форекс SYMBOL_PRICE_VOLATILITY не используется и не транслируется. Но у нас тут не только Форекс. 

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

 
Maxim Kuznetsov #:
а ничего так,что  SYMBOL_PRICE_VOLATILITY и ATR в общем разные вещи ?

Максим, хорошо, что отреагировали на данную тему. Честно говоря, сам вообще далёк от темы волатильности и, до сих пор никак не могу понять на кой ляд эта волатильность нужна, а также почему эту тему много раз поднимают, но до конца не раскрывают. Единственное, что понял, это якобы существует зависимость разворота ценового графика при значительном повышении волатильности. Кроме того, прочитал несколько тем, связанных с применением индикатора волатильности ATR, но установив его на график, ни чего такого ценного не увидел. Может Вы в сжатой форме подскажете, чем так ценна волатильность для трейдера? Буду очень признателен.

С уважением, Владимир.

 
MrBrooklin #:
Единственное, что понял, это якобы существует зависимость разворота ценового графика при значительном повышении волатильности. Кроме того, прочитал несколько тем, связанных с применением индикатора волатильности ATR, но установив его на график, ни чего такого ценного не увидел. Может Вы в сжатой форме подскажете, чем так ценна волатильность для трейдера? Буду очень признателен.

если писать многотомник про Форекс (или вообще про ТА), то 2/3 томов будет так или иначе о волатильности :-) 

простейшее практичное применение ATR - в приведённый вами код, добавить параметр "сдвиг".  Потому как 

И повторится все, как встарь:
Ночь, ледяная рябь канала,
Аптека, улица, фонарь.

Рынок цикличен, периодичен и ATR (средний истинный диапазон, амплитуда волатильности) повторяется раз от раза. 

Внутри дня: cдвиньте показания вашего индикатора вправо на PeriodSeconds(PERIOD_D1)/PeriodSeconds(PERIOD_CURRENT)-ATR_PERIOD/2. То есть на кол-во баров за 1 день минус "задержка" от усреднений ATR

получите средний диапазон (дистанция от Open до самого дальнего high/low, разброс цен) каким он был вчера в то-же самое время. Теперь можно сравнить текущий размер свечей с ним и сделать выводы, торговля идёт активнее или наоборот. Уже хорошо

Касаясь вскользь, сугубо техническое: у нас в 99% случаев в TA используются оконные функции, то есть усреднения, сравнения за какой-то период. Они все поголовно барахлят в трёх случаях: когда внутри окон малые почти одинаковые значения, когда на концах окон слишком разные значения и когда значения большие но "в разнобой". Это примерно соотносится с малым и значительным ATR и его разворотами. То есть когда диапазон мал, индикаторы слишком чуствительны и реагируют на малейший шум, а когда резко растёт (или резко падает) то тоже ерунда получается 

можно продолжать и продолжать... :-)

 
Maxim Kuznetsov #:
Внутри дня: cдвиньте показания вашего индикатора вправо на PeriodSeconds(PERIOD_D1)/PeriodSeconds(PERIOD_CURRENT)-ATR_PERIOD/2. То есть на кол-во баров за 1 день минус "задержка" от усреднений ATR ...

Спасибо, Максим, за уделённое внимание и ответ! Теперь есть над чем подумать.

С уважением, Владимир.

 
MrBrooklin #:

Исправленный вариант:

С уважением, Владимир.

Благодарю. Правда, так никто и не ответил, что выдает функция индикатора с количеством периодов 0 и почему копируется только 3 элемента и как, если нужно, и нужно ли, скопировать все:
int copy_buffer = CopyBuffer(Handle_ATR, 0, 0, 3, atr_array_value);

Такое дело... 

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