Справка по языку MQL5 - страница 57

 
nen писал(а) >>

Перегрузка функций

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

Например, создаем структуру:

struct timeseries
{
datetime time;
double high;
double low;
};

Необходимо в эту структуру скопировать соответствующие элементы из структуры MqlRates. Как это сделать через перегрузку CopyRates?

А в чём проблема? Просто побробуйте написать свою функцию CopyRates со своим собственным набором параметров, отличающимся от уже существующих.

Но я бы не рекомендовал Вам использование имён предопределённых системных функций, во избежание трудноуловимых багов.

 
stringo писал(а) >>

А в чём проблема? Просто побробуйте написать свою функцию CopyRates со своим собственным набором параметров, отличающимся от уже существующих.

Да не проблема. Получается примерно такое:

hTimeBar1 - время бара, с которого начинаем копирование
hQuantityBar - количество копируемых баров

struct timeseries
{
datetime time;
double high;
double low;
};

timeseries ts[];

ArrayResize(ts,hQuantityBar);

double hHA[];

double hLA[];
datetime hTA[];

int i;

CopyHigh(Symbol(),PERIOD_M1,hTimeBar1,hQuantityBar,hHA);
CopyLow(Symbol(),PERIOD_M1,hTimeBar1,hQuantityBar,hLA);
CopyTime(Symbol(),PERIOD_M1,hTimeBar1,hQuantityBar,hTA);

for (i=0;i<hQuantityBar;i++)
{
ts[i].high=hHA[i];
ts[i].low=hLA[i];
ts[i].time=hTA[i];
}

Функция CopyRates производит копирование за один проход.

А в приведенном коде имеем три прохода для копирования трех таймсерий в промежуточные массивы.

Плюс один проход при копировании из промежуточных массивов в нужную структуру.

Итого - полученная функция работает, как минимум, в 4 раза медленнее плюс требуются дополнительные массивы с соответствующим отведением памяти под эти массивы. Такая перегрузка не устраивает.

Можно копировать вместо трех массивов в промежуточный массив типа MqlRates. Но опять же имеем дело с промежуточным массивом.

========

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

 
Будет ли советник компилироваться в x86 код как обещали в давнейшнем видео? Либо он будет опять интерпритироваться mt5?
 

Справка обновлена:

  • добавлены новые возможности по чтению/изменению свойств графиков;
  • изменено определение функции OnDeinit() (потребется внесение изменений в код и перекомпиляция);
  • добавлен параметр shift для вызова функций iAMA(), iDEMA(), iFrAMA(), iTEMA() и iVIDyA() (нужно будет изменить вызов этих индикаторов, если они используются);
  • добавлено новое свойство индикаторов indicator_applied_price (раздел "Основы языка / Препроцессор / Свойства программ ");
  • изменена функции GlobalVariableCheck() и GlobalVariablesDeleteAll();
  • функция GlobalVariableSetTemp() переименована в GlobalVariableTemp();
  • добавлены GlobalVariablesFlush() и GlobalVariableTime();
  • доавлены описания предупреждений компилятора (раздел "Стандартные константы, перечисления и структуры / Коды ошибок и предупреждений / Предупреждения компилятора ")


 

Явно не хватает, либо не нашел, возвращение обьма сделки когда

инстант (возможно и маркет) переходит на исполнение по запросу.

 

Анализируйте код ответа сервера - "Стандартные константы, перечисления и структуры / Коды ошибок и предупреждений / Коды возврата торгового сервера", и смотрите объем у возвращенной сделки "Стандартные константы, перечисления и структуры / Структуры данных / Структура результата торгового запроса "

Описание полей

Поле

Описание

retcode

Код возврата торгового сервера

deal

Тикет сделки, если она совершена. Сообщается при торговой операции TRADE_ACTION_MARKET

order

Тикет ордера, если он выставлен. Сообщается при торговой операции TRADE_ACTION_PENDING

volume

Объем сделки, подтверждённый брокером. Зависит от типа ордера по исполнению

price

Цена в сделке, подтверждённая брокером. Зависит от поля deviation в торговом запросе и/или от типа торговой операции

bid

Текущая рыночная цена предложения (цены реквоты)

ask

Текущая рыночная цена спроса (цены реквоты)

comment

Комментарий брокера к операции (по умолчанию заполняется расшифровкой)

reserved[128]

Зарезервировано для будущего использования

 
Rosh >>:

Анализируйте код ответа сервера - "Стандартные константы, перечисления и структуры / Коды ошибок и предупреждений / Коды возврата торгового сервера", и смотрите объем у возвращенной сделки "Стандартные константы, перечисления и структуры / Структуры данных / Структура результата торгового запроса "

Вы несколько меня не поняли...

Мне важно знать среди прочего, на каком обьёме начнется запрос, например 10 лот и выше.

Эта инфа выставляется сервером, а значится можно её знать наравне с мини. или максилотом.

 
HideYourRichess >>:


Вот тут, три варианта функции под одним именем - совершенно органично и понятно.

Меня тоже поначалу это смутило, но только поначалу...

На самом деле всё проще простого. Весь смысл как использовать функцию.

Если функция должна что изменить, то достаточно знать от неё выполнено или нет - булл.

А если должна вернуть результат, то и возвращает по типу значения...




 
HideYourRichess писал(а) >>

Вот зачем у SeriesInfoInteger есть часть Integer? на самом деле возвращается или long или bool.... Где здесь ясность и понятность...

А там еще два параметра, все-таки, должны возвращаться как datetime, а не long.

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