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

 
Igor Zakharov:

только не календарных. 30 дневных баров назад (воскресенья, субботы)

Судя по функции без параметра shift вы в 5ке делаете, а вопрос в четвёрошной ветке задали :)

Да, 30 баров это 21 рабочий день, если считать от вчера. (24.02.2019 - 25.01.2019)

У меня получились

за Месяц средний размер свечи : 598

за Неделю средний размер свечи: 519

А iATR() выдаёт десятизначные числа...

Так что я пока не пойму как его использовать.

 
Alexander Layzerevich:

А iATR() выдаёт десятизначные числа...

Обычно, десятичные дроби (т.е. как у цены. Чтоб в пункты перевести нужно разделить на _Point).

См. иллюстрацию: евро/доллар на сегодня - 560 пунктов по дневным за месяц.


 
Igor Zakharov:

Обычно, десятичные дроби (т.е. как у цены. Чтоб в пункты перевести нужно разделить на _Point).

См. иллюстрацию: евро/доллар на сегодня - 560 пунктов по дневным за месяц.


Проверил в MQL4. У меня получается так:

iATR

 
Igor Zakharov:

Обычно, десятичные дроби (т.е. как у цены. Чтоб в пункты перевести нужно разделить на _Point).

См. иллюстрацию: евро/доллар на сегодня - 560 пунктов по дневным за месяц.


Проверил в MQL5. Написал такой код для проверки:

//************************************************************************************************/
double iPointOrderStep()
{
   int Awerage30 = (iATR (Symbol(),PERIOD_D1, 21));
   Print ("Awerage30 = ", Awerage30);
   int Awerage7 = (iATR (Symbol(),PERIOD_D1, 5));
   Print ("Awerage7 = ", Awerage7);
   
   double iPointOrderStep = NormalizeDouble(((Awerage30+Awerage7)/2),0);
   Print ("iPointOrderStep = ", iPointOrderStep);
   return (iPointOrderStep);
}   
//************************************************************************************************/

Вот что он выдаёт:

iATR

т.е. получается показывает одно, а выдаёт другое значение...

 
Alexander Layzerevich:

Проверил в MQL5. Написал такой код для проверки:

Вот что он выдаёт:

т.е. получается показывает одно, а выдаёт другое значение...

В MQL5 такая конструкция работы с индикатором не пригодна

   int Awerage30 = (iATR (Symbol(),PERIOD_D1, 21));
   Print ("Awerage30 = ", Awerage30);

Сначала нужно создать хендл, что вы сейчас и сделали, а после этого уже получать значения с CopyBuffer

// этот код в Init()
      int handleATR=iATR(Symbol(),PERIOD_D1,21);
      if(handleATR==INVALID_HANDLE) return;

// это уже в сам советник/индикатор: OnTick()
      double hATR[];
      CopyBuffer(handleATR,0,0,1,hATR);
// double ATR = hATR[0]; // здесь значение ATR
 
Vitaly Muzichenko:

В MQL5 такая конструкция работы с индикатором не пригодна

Сначала нужно создать хендл, что вы сейчас и сделали, а после этого уже получать значения с CopyBuffer

Спасибо, учту и перепишу код.

Я просто пишу в в МТ4 и с помощью #include <MT4Orders.mqh> тестирую в МТ5.

Возможно библиотека не поддерживает Индикаторы.

 
Alexander Layzerevich:

Спасибо, учту и перепишу код.

Я просто пишу в в МТ4 и с помощью #include <MT4Orders.mqh> тестирую в МТ5.

Возможно библиотека не поддерживает Индикаторы.

Да, только торговые функции.

 
Alexander Layzerevich:

Спасибо, учту и перепишу код.

Я просто пишу в в МТ4 и с помощью #include <MT4Orders.mqh> тестирую в МТ5.

Возможно библиотека не поддерживает Индикаторы.

Это очень быстрый вариант совместить две платформы, он рабочий, но так в mql5 лучше не делать

double ATR(string symb,ENUM_TIMEFRAMES tf,int period,int index) {
 #ifdef __MQL4__
  return(iATR(symb,tf,period,index));
 #else
  double buf[1];
  int handle=iATR(symb,tf,period);
   if(handle<0) {
    PrintFormat("Failed to create handle ATR %s/%s, Error: %d",symb,sTF(tf),GetLastError());
    return(WRONG_VALUE);
   } else {
    if(CopyBuffer(handle,0,index,1,buf)<0) {
     PrintFormat("Failed to copy data from the indicator ATR %s/%s, Error: %d",symb,sTF(tf),GetLastError());
     return(WRONG_VALUE);
    }
   }
   return(buf[0]);
 #endif
 }

Ну и применять индикатор подобным образом как в mql4

double atr=ATR(Symbol(),PERIOD_D1, 30);
 
Vitaly Muzichenko:

Это очень быстрый вариант совместить две платформы, он рабочий, но так в mql5 лучше не делать

Ну и применять индикатор подобным образом как в mql4

Огромное спасибо за Код. 

Получилось так:

//************************************************************************************************/
double iPointOrderStep()
{
   double Awerage30 = (int)((ATR(Symbol(),PERIOD_D1,21,1))/Point());
//   Print ("Awerage30 = ", Awerage30);
   double Awerage7 = (int)((ATR(Symbol(),PERIOD_D1,5,1))/Point());
//   Print ("Awerage7 = ", Awerage7);
   
   double iPointOrderStep = NormalizeDouble(((Awerage30+Awerage7)/2/6),0);
//   Print ("iPointOrderStep = ", iPointOrderStep);
   return (iPointOrderStep);
}   
//************************************************************************************************/
double ATR(string symb,ENUM_TIMEFRAMES tf,int period,int index) {
 #ifdef __MQL4__
  return(iATR(symb,tf,period,index));
 #else
  double buf[1];
  int handle=iATR(symb,tf,period);
   if(handle<0) {
    PrintFormat("Failed to create handle ATR %s/%s, Error: %d",symb,sTF(tf),GetLastError());
    return(WRONG_VALUE);
   } else {
    if(CopyBuffer(handle,0,index,1,buf)<0) {
     PrintFormat("Failed to copy data from the indicator ATR %s/%s, Error: %d",symb,sTF(tf),GetLastError());
     return(WRONG_VALUE);
    }
   }
   return(buf[0]);
 #endif
 }
//************************************************************************************************/

Теперь у меня есть усреднённые данные на начало старта Советника. И эти данные пересчитываются при каждом обращении к функции.

Чтобы ограничить обращение, я так понимаю, нужно сделать буферную запись, с рассчитанными данными.

Получается, нужно задать условие для пересчёта. По "Понедельникам" и если в буфере ничего нет.(перезапуск Робота)

т.е. объявить переменную buferStep = -1; и в OnTick() if buferStep <0 или "Понедельник" то пересчёт.

Вот тут опять у меня затык, как Роботу объявить что сегодня "Понедельник" ?

 
Alexander Layzerevich:

Огромное спасибо за Код. 

Получилось так:

Теперь у меня есть усреднённые данные на начало старта Советника. И эти данные пересчитываются при каждом обращении к функции.

Чтобы ограничить обращение, я так понимаю, нужно сделать буферную запись, с рассчитанными данными.

Получается, нужно задать условие для пересчёта. По "Понедельникам" и если в буфере ничего нет.(перезапуск Робота)

т.е. объявить переменную buferStep = -1; и в OnTick() if buferStep <0 или "Понедельник" то пересчёт.

Вот тут опять у меня затык, как Роботу объявить что сегодня "Понедельник" ?

Ну как-бы Я не использовал-бы понедельник, использовал-бы просто количество дней назад. А значения получал-бы на каждом новом баре, чтоб не нагружать советник расчётами на каждом тике.

Причина обращения: