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

 
Andrey Dik:

Да, спасибо!

Нет, но всё равно спасибо!)
Вот уж не думал что может так заклинить...:-)))
 

Добрый вечер.

При использовании iOpen задается shift. Если истории не хватает для указанного шифта, возвращается iOpen самого старого бара.

Вопрос: Как сделать проверку на наличие бара с указанным шифтом? И в случае если истории не хватает не возвращать iOpen?

 
Sergey:

Добрый вечер.

При использовании iOpen задается shift. Если истории не хватает для указанного шифта, возвращается iOpen самого старого бара.

Вопрос: Как сделать проверку на наличие бара с указанным шифтом? И в случае если истории не хватает не возвращать iOpen?


CopyOpen

Функция получает в массив open_array исторические данные цен открытия баров для указанной пары символ-период в указанном количестве. Необходимо отметить, что отсчет элементов от стартовой позиции ведется от настоящего к прошлому, то есть стартовая позиция, равная 0, означает текущий бар.


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

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

Неважно, какое свойство имеет приёмный массив - as_series=true или as_series=false, данные будут скопированы таким образом, что самый старый по времени элемент будет в начале физической памяти, отведенной под массив. Существует 3 варианта функции.

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

int  CopyOpen(
   string           symbol_name,     // имя символа
   ENUM_TIMEFRAMES  timeframe,       // период
   int              start_pos,       // откуда начнем 
   int              count,           // сколько копируем
   double           open_array[]     // массив для копирования цен открытия
   );

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

int  CopyOpen(
   string           symbol_name,     // имя символа
   ENUM_TIMEFRAMES  timeframe,       // период
   datetime         start_time,      // с какой даты
   int              count,           // сколько копируем
   double           open_array[]     // массив для копирования цен открытия
   );

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

int  CopyOpen(
   string           symbol_name,     // имя символа
   ENUM_TIMEFRAMES  timeframe,       // период
   datetime         start_time,      // с какой даты
   datetime         stop_time,       // по какую дату
   double           open_array[]     // массив для копирования цен открытия
   );

Параметры

symbol_name

[in]  Символ.

timeframe

[in]  Период.

start_pos

[in]  Номер первого копируемого элемента.

count

[in]  Количество копируемых элементов.

start_time

[in]  Время бара, соответствующее первому элементу.

stop_time

[in]  Время бара, соответствующее последнему элементу.

open_array[]

[out]  Массив типа double.

Возвращаемое значение

Количество скопированных элементов массива либо -1 в случае ошибки.

Примечание

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

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

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

При запросе данных по начальной дате и количеству требуемых элементов возвращаются только данные, дата которых меньше (раньше) или равна указанной. При этом интервал задается и учитывается с точностью до секунды. То есть дата открытия любого бара, для которого возвращается значение (объем, спред, значение в индикаторном буфере, цена Open, High, Low, Close или время открытия Time), всегда равна или меньше указанной.

При запросе данных в заданном диапазоне дат возвращаются только данные, попадающие в запрашиваемый интервал, при этом интервал задается и учитывается с точностью до секунды. То есть время открытия любого бара, для которого возвращается значение (объем, спред, значение в индикаторном буфере, цена Open, High, Low, Close или время открытия Time), всегда находится в запрошенном интервале.

Таким образом, если текущий день недели Суббота, то при попытке скопировать данные на недельном таймфрейме с указанием start_time=Последний_Вторник и stop_time=Последняя_Пятница функция вернет 0, так как время открытия на недельном таймфрейме всегда приходится на воскресенье, но ни один недельный бар не попадает в указанный диапазон.

Если необходимо получить значение, соответствующее текущему незавершенному бару, то можно использовать первую форму вызова с указанием start_pos=0 и count=1.

 

Приветствую.

Господа, подскажите как прописать условие пересечения ценой уровней с 1-2-3 нулями в конце? 

 
Andrey Sokolov:

Приветствую.

Господа, подскажите как прописать условие пересечения ценой уровней с 1-2-3 нулями в конце? 


Путем сравнения прошлого и текущего значения цены с этим уровнем, если уровень находиться между этими значениями значит произошло пересечение.
 
Sergey Gritsay:

Путем сравнения прошлого и текущего значения цены с этим уровнем, если уровень находиться между этими значениями значит произошло пересечение.


А как прописать эти уровни, для сравнения? 

Или - как прописать чтоб у числа оставалось нужное количество знаков после запятой? Не округляя а именно удаляя .

 
Andrey Sokolov:


А как прописать эти уровни, для сравнения? 

Или - как прописать чтоб у числа оставалось нужное количество знаков после запятой? Не округляя а именно удаляя .

Вот функция по нахождению

//===============================================================================================
//---------------------------- Возвращает ближайший круглый уровень ----------------------------+
//===============================================================================================
double GetUniversalLevel(int ne=100, string symb="0") {
 if(symb=="0") symb=Symbol();
 static double LastBid;
 double _Level=0, PriceStep=0, bid=0, point=0;
 bid=dBid(symb);
 point=dPoint(symb);
  if(LastBid<point) {LastBid=bid;} // Инициализация прошлой цены
   PriceStep=ne*point; // Шаг цены N пунктов.
   _Level=MathRound(bid/PriceStep)*PriceStep; // Круглый уровень
  LastBid=bid;
  return(_Level);
 }
Comment( GetUniversalLevel(50) );
 

Sergey Gritsay, Vitaly Muzichenko спасиб.

Мне вот еще подсказали функцию MathFloor() - Возвращает ближайшее снизу целое числовое значение.

 
Vitalie Postolache:

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

Sergey Gritsay:
Для этого нужно создать сервер вне локального компьютера и передавать данные через этот сервер, для МТ соответственно пишется индикатор или советник, который эти данные обрабатывает, либо ставите терминалы на какой либо ВПС-сервер и там настраиваете копировщик сделок с вашего счета на счета друзей. Еще вариант через сервис сигналы копировать ваши сделки совершенные по данным уровням. В общем тут надо подходить из ваших финансовых возможностей для заказа соответствующего софта.


MosheDayan:

Напомню предисторию. Есть индикатор ежедневно получающий данные из csv и отображающий их(горизонтальные уровни) на графике. Создал сервер из домашнего ноутбука (слабый, но расчетов там не нужно и будет отдавать csv, а они очень маленькие). На сервере для теста связи залил движок обычного форума - все вроде как видно извне. Помогите советом. Что должно быть на сервере для чтения из него индикатором csv файлов? Т.е. как связывается индикатор с базой csv? Может залить движок ФТП сервера или что-то иное и может для MT необходимо открыть какие-нибудь специальные порты? Или я полез не в ту сторону вообще? Спасибо


Друзья, можно еще вопрос. Можно ли не грузить домашний ноут, а воспользоваться, для связи индикатора с csv файлами, бесплатными облачными хранилищами файлов такими как, например Яндекс.Диск или Облако@mail.ru или Box.net и т.д. Спасибо
 
Vitaly Muzichenko:

Вот функция по нахождению

А dBid и dPoint отдельно прописывать нужно? 
Причина обращения: