возвращает политику исполнения. - страница 8

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

Вот так я получаю текущие данные движущийся средней, это правильно?

input int      ma_period = 10;
 int ma_handle = 0;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
    ma_handle = iMA(_Symbol,_Period,ma_period,0,MODE_SMA,PRICE_MEDIAN);
   if(ma_handle == INVALID_HANDLE)
     {
      Print("ma_handle == INVALID_HANDLE");
      return(INIT_FAILED);
     }

   return(INIT_SUCCEEDED);


  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  { 
  double   ma[1] ;
   if(CopyBuffer(ma_handle,0,0,1,ma)==1)
     {
     
     
     }
 }

Два вопроса.

1.Ничего, что не ассоциирован номер индикаторного буфера с индикатором. Раз один индикатор, он автоматически получил буфер 0, и я его и указал.

2. Если у меня хэндл индикатора в инициализации, то когда я изменю параметры, которые передаются индикатору, то мне нужно перезалить советник к графику, чтобы настало событие инициализация и новые параметры применились?

Vladimir Karputov
Модератор
207718
Vladimir Karputov  
Ivan_Invanov:

Вот так я получаю текущие данные движущийся средней, это правильно?

Два вопроса.

1.Ничего, что не ассоциирован номер индикаторного буфера с индикатором. Раз один индикатор, он автоматически получил буфер 0, и я его и указал.

2. Если у меня хэндл индикатора в инициализации, то когда я изменю параметры, которые передаются индикатору, то мне нужно перезалить советник к графику, чтобы настало событие инициализация и новые параметры применились?

1. Нет никакой "ассоциации". И никогда не было. 

Читаем справку по  CopyBuffer

int  CopyBuffer(
   int       indicator_handle,     // handle индикатора
   int       buffer_num,           // номер буфера индикатора
   int       start_pos,            // откуда начнем 
   int       count,                // сколько копируем
   double    buffer[]              // массив, куда будут скопированы данные
   );

Есть функция, которой передаётся хендл индикатора (в Вашем случае это переменная ma_handle и номер буфера '0' - ноль, так как индикатор Moving Average имеет всего один буфер).


2. Если Вы меняете входные параметры в советнике - будет новая инициализация советника и в OnInit будет создан хендл индикатора с введенными Вами параметрами.

Документация по MQL5: Доступ к таймсериям и индикаторам / CopyBuffer
Документация по MQL5: Доступ к таймсериям и индикаторам / CopyBuffer
  • www.mql5.com
Отсчет элементов копируемых данных (индикаторный буфер с индексом buffer_num) от стартовой позиции ведется от настоящего к прошлому, то есть стартовая позиция, равная 0, означает текущий бар (значение индикатора для текущего бара). При копировании заранее неизвестного количества данных в качестве массива-приемника buffer[] желательно...
Dmitry Fedoseev
58560
Dmitry Fedoseev  
Vladimir Karputov:

1. Нет никакой "ассоциации". И никогда не было. 

...

Имеется ввиду вызов SetIndexBuffer()

Ivan_Invanov
368
Ivan_Invanov  
Dmitry Fedoseev:

Имеется ввиду вызов SetIndexBuffer()

Да. Не очень понятно, что такое номер индикаторного буфера, как эти буферы создаются, они принадлежат к конкретному индикатору или у них общая нумерация . В документации написано, что надо писать SetIndexBuffer(), а в примере советника Moving Average написано без. Читал и справку и дополнительные статьи искал и только непонятнее стало. Нужно ли указывать буферы препроцессору, и почему буферов должно быть на один меньше чем в директиве препроцессору, а не столько же.
Dmitry Fedoseev
58560
Dmitry Fedoseev  
Ivan_Invanov:
Да. Не очень понятно, что такое номер индикаторного буфера, как эти буферы создаются, они принадлежат к конкретному индикатору или у них общая нумерация . В документации написано, что надо писать SetIndexBuffer(), а в примере советника Moving Average написано без. Читал и справку и дополнительные статьи искал и только непонятнее стало. Нужно ли указывать буферы препроцессору, и почему буферов должно быть на один меньше чем в директиве препроцессору, а не столько же.

Если искать какой-то метафизический смысл... тогда много становится непонятным. А так - это просто номер. Принадлежит конкретному индикатору.

В советниках вообще нет индикаторных буферов, поэтому вызова SetIndexBufer() не может быть.

Не на один меньше, а ровно столько же. При отсчете от нуля, номер последнего на 1 меньше,  чем общее количество.

Ivan_Invanov
368
Ivan_Invanov  
Спасибо.
Ivan_Invanov
368
Ivan_Invanov  

Если не затруднит, ответьте еще на несколько вопросов, пожалуйста.

1. Не пойму, зачем присваивать 0 объявленной переменной, если всё равно потом что-то присваивать? И причем, иногда 0 не присваивается, иногда присваивается.

2. И говорят, что нужно удалять объекты в деинициализации (непонятно зачем), а ведь хэндл индикатора является объектом, но его почему то не принято удалять, почему так?

3.    MqlTradeRequest request={0}; Что это значит? Ну наверно всей структуре присваивается 0, но в ней ведь не только численные типы.

4. И зачем логическая операция тут ?

bool  OrderSend(
   MqlTradeRequest&  request,      // структура запроса
   MqlTradeResult&   result        // структура ответа
   );
Dmitry Fedoseev
58560
Dmitry Fedoseev  
Ivan_Invanov:

Если не затруднит, ответьте еще на несколько вопросов, пожалуйста.

1. Не пойму, зачем присваивать 0 объявленной переменной, если всё равно потом что-то присваивать? И причем, иногда 0 не присваивается, иногда присваивается.

2. И говорят, что нужно удалять объекты в деинициализации (непонятно зачем), а ведь хэндл индикатора является объектом, но его почему то не принято удалять, почему так?

3.    MqlTradeRequest request={0}; Что это значит? Ну наверно всей структуре присваивается 0, но в ней ведь не только численные типы.

4. И зачем логическая операция тут ?

1. По привычке.

2. Это другой объект. Он сам потом выгрузиться, но можно ускорить функцией IndicatorRelease().

3. Очищается и все.

4. Это не логическая операция, а передача переменной по ссылке.

Ivan_Invanov
368
Ivan_Invanov  
Dmitry Fedoseev:

1. По привычке.

2. Это другой объект. Он сам потом выгрузиться, но можно ускорить функцией IndicatorRelease().

3. Очищается и все.

4. Это не логическая операция, а передача переменной по ссылке.

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