Вопросы от "чайника" - страница 162

 
Karlson:
DBL_MAX там будет.
:-)
 

Почему не возвращается инвалид нэндл, хотя хэндл удалён?

   int       indicator_handle=iCustom(
   NULL,
   PERIOD_CURRENT,
   "Examples\\ZigzagColor"
   );
   Print(indicator_handle);
   bool  a=IndicatorRelease(
   indicator_handle//,
   );
   Print(a);
   Print(indicator_handle);

Первый принт - 10, второй - true, третий - опять 10. Ставил слип минуту - всё равно 10.

Думаю, должно быть -1 (INVALID_HANDLE). Неправильно думаю?

Документация по MQL5: Стандартные константы, перечисления и структуры / Именованные константы / Прочие константы
Документация по MQL5: Стандартные константы, перечисления и структуры / Именованные константы / Прочие константы
  • www.mql5.com
Стандартные константы, перечисления и структуры / Именованные константы / Прочие константы - Документация по MQL5
 
Silent:

Почему не возвращается инвалид нэндл, хотя хэндл удалён?

Первый принт - 10, второй - true, третий - опять 10. Ставил слип минуту - всё равно 10.

Думаю, должно быть -1 (INVALID_HANDLE). Неправильно думаю?

Удалённые индикаторы удаляются физически не сразу, а после паузы (возможно несколько минут), на случай переоткрытия этой же или другой программой (вариант кеширования).

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

//  Только в этом случае имеет смысл вообще освобождать индикаторы в программе.

//  Все остальные варианты использования функции IndicatorRelease() "расово неправильные", ибо при завершении работы интикаторы и так освобождаются.

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

На этот случай Ренат как-то озвучивал обещание сделать вариант "мгновенного освобождения", но видимо пока занят сильно. ;)

--

Это вроде как первая часть ответа (без которой вторая будет непонятной).

Теперь про INVALID_HANDLE. Как я понимаю, функции освобождения динамических объектов, так же как и оператор delete сами по себе не присваивают указателю значение INVALID_HANDLE, они занимаются лишь удалением объектов на которые хендл указывает. Насильственно присваивают указателям значения INVALID_HANDLE лишь функции распределения памяти (оператор new в том числе), в случае неудачи.  Поэтому корректный способ проверить валидность указателя - функция CheckPointer(), которая,  как я понимаю, буквально просматривает системную таблицу хендлов, в поисках объекта и возвращает тип хендла, если объект найден, или 0 в случае неудачи. 

Надеюсь теперь логика работы с указателями (хендлами) немного прояснилась. Как и результаты из вашего примера. Там всё правильно : индикатор объект группового доступа, он не удаляется физически по первому свистку (поэтому даже CheckPointer() вернёт не ноль), не говоря уже про глючность надежд получить значение INVALID_HANDLE в переменной указателя после передачи его в функцию IndicatorRelease() по значению.

 

В статье Ордера, позиции и сделки в MetaTrader 5 приведён пример того, что "Каждая сделка базируется на одном конкретном ордере, но один ордер может порождать множество сделок. Например, приказ на покупку 10 лотов может быть исполнен посредством нескольких последовательных сделок при частичном исполнении". Я понял так, что если я хочу открыть позицию напр. на 10 лотов то в истории может появиться несколько сделок. По моей стратегии 1 и 2 позиции в одном и том же направлении советник (на МТ4) открывает допустим 1.0 лотом, 3-ю и далее 2.0 лотом. В МТ5 может получиться так, что открывая 1-ую позиции в истории может появиться напр. 2 или более сделок. Желая открыть следующую (по стратегии 2-ую), бегая по истории советник найдёт, что это будет напр. 3 позиция и откроет не тем лотом, что надо. Как-то неудобно.

Может кто знает, как решить такую проблему или кинет линк.

 
MetaDriver:

Спасибо, то, что нужно.

// нелп по нелпу для чайников - вот что нужно в статьях.

 

Пытаюсь создать индикатор использующий два разных таймфрейма, например М5 (текущий, на экране) и Н1. Как синхронизировать цены между этими разными таймфреймами? Например, при вычислении прошлого значения индикатора на М5, хотелось бы автоматически подкачивать цены из Н1 того же времени (то есть нулевой бар в обоих таймфреймах после ArraySetAsSeries соответствовал бы текущему прошлому времени, как в OnTick, а не самому последнему бару на экране). Если такой возможности нет и надо вручную проверять времена баров, то не плохо бы добавить какую-нубудь синхронизирующую функцию, типа onTick, для индикаторов.

 Сейчас попробовал тестирование индикатора в тестере - классная штука. А почему не сохраняются на экране прошлые вычисленные значения? 

 
gpwr:

Пытаюсь создать индикатор использующий два разных таймфрейма, например М5 (текущий, на экране) и Н1. Как синхронизировать цены между этими разными таймфреймами? Например, при вычислении прошлого значения индикатора на М5, хотелось бы автоматически подкачивать цены из Н1 того же времени (то есть нулевой бар в обоих таймфреймах после ArraySetAsSeries соответствовал бы текущему прошлому времени, как в OnTick, а не самому последнему бару на экране). Если такой возможности нет и надо вручную проверять времена баров, то не плохо бы добавить какую-нубудь синхронизирующую функцию, типа onTick, для индикаторов.

 Сейчас попробовал тестирование индикатора в тестере - классная штука. А почему не сохраняются на экране прошлые вычисленные значения? 

Используй одну из перегрузок функции CopyXXXX()

При отладке сделай проверку в каком направлении копируются данные (если копируются больше 1).

Обращение по начальной дате и количеству требуемых элементов

int  CopyRates(
   string           symbol_name,       // имя символа
   ENUM_TIMEFRAMES  timeframe,         // период
   datetime         start_time,        // с какой даты
   int              count,             // сколько копируем
   MqlRates         rates_array[]      // массив, куда будут скопированы данные
   );
 
 
Urain:

Используй одну из перегрузок функции CopyXXXX()

При отладке сделай проверку в каком направлении копируются данные (если копируются больше 1).

Понял. Спасибо.
 

Здравствуйте!

Не могли бы подсказать код индикатора, рисующего на текущих минутных графиках макс и минимум предыдущих суток?

СПС!

 

Давно не виделись =). 

Допустим. Есть некая точка во времени. Например D'03.07.2005 13:48:12'.

Как я могу узнать время бара (определенного периода), который включает в себя этот отрезок времени?

Хорошо бы если бы была функция типа:

datetime УзнатьВремяБараПоВремениПользователя (datetime времяПользователя, ENUM_TIMEFRAMES периодБаров) 

... И чтобы она возвращала отрицательное значение если торгов не было в этот момент.

Ну, колитесь, есть ли такая функция? 

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