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

 
kombat писал(а) >>

Смысл моего предложения в том, что-бы просто сравнить голый индикатор и тот-же индикатор но с добавленной графикой.

Вот и всё...

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

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

Проделывать подобное в нынешних условиях, думаю, никто не станет.

Оценить время исполнения можно следующим образом:

.......... запись времени в журнал t1;

.......... for( k=10000 ) { блок расчёта одной и той же точки }

.......... запись времени в журнал t2;

.......... Ta = (t2 - t1)/k;

То же самое проделать с { блок расчёта одной и той же точки с добавками} Получить значение Tb.

Сравнить Ta и Tb : отношение, абсолютную разность и т.д.

 

Справочник MQL5 - Основы языка - Типы данных - Приведение типов
Приведение данных типа простых структур

Фраза: Таким образом компенсируется отсутствие объединений (union) в языке MQL5.

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

Справочник MQL5 - Основы языка - Типы данных - Приведение типов
Преобразование числовых типов

Фраза: Число, преобразованное в в тип float имеет тот же порядок, но несколько меньшую точность.

Два раза в.


Справочник MQL5 - Основы языка - Типы данных - Объект динамического массива
Статические массивы

Примеры:

double stat_array[5]; // 1-мерный статический массив
some_function(stat_array);
...
bool some_function(double& array[])
{
if(ArrayResize(array,100) return(false);
...
return(true);
}


Кажется, непорядок со скобками у if.


Справочник MQL5 - Основы языка - Типы данных - Указатели объектов


Фраза: Еще раз повторим, что в отличие от C++, переменная hobject из вышеприведенного примера не является указателем на память, а является дескриптором объекта.

Вот тут я точно придираюсь. А где ещё говорилось о том что, "переменная бла..бла..бла"? Поменять бы, вот это вот "Еще раз повторим"
Кроме того, кое где встречается слово "описатель", а вот тут вот "дескриптор". Это не одно и то же, что ли. Если одно и то же, то и называться должно одинаково.

Справочник MQL5 - Основы языка - Операции и выражения - Выражения

Примеры:

a++; b = 10; // несколько выражений расположены на одной строчке
//--- одно выражение разбито на несколько строк
x = (y * z) /
(w + 2) + 127;


Наклонная палка, как знак разбиения одной строки на несколько, не описана. Ну, по крайней мере я не нашел её описания.
В Указателе помощи эта наклонная палка ведет на арифметические операции.


Справочник MQL5 - Основы языка - Операции и выражения - Другие операции

Индексирование ( [] )

Нехватает примера двух, трехмерного массива.


Справочник MQL5 - Основы языка - Функции - Передача параметров

//+------------------------------------------------------------------+
//| передача параметров по значению |
//+------------------------------------------------------------------+
double FirstMethod(int i,int j)
{
double res;
//---
i*=2;
j/=2;
res=i+j;
//---
return(res);
}
//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
void OnStart()
{
//---
int a=14,b=8;
Print("a и b перед вызовом;",a,b);
double d=SecondMethod(a,b);
Print("a и b после вызова:",a,b);
}
//--- результат выполнения скрипта
// a и b перед вызовом: 14 8
// a и b после вызова: 14 8



Не SecondMethod а FirstMethod. И нехватает примера использования const.


Справочник MQL5 - Основы языка - Функции - Описание внешних функций

Может следует отметить, что названия входных параметров, но не тип, можно опускать. В Справочник MQL5 - Основы языка - Препроцессор - Импорт функций это ведь указано.

#import "user32.dll"
int MessageBoxW(int hWnd,string szText,string szCaption,int nType);
int SendMessageW(int,int,int,int);


Справочник MQL5 - Основы языка - Функции - Функции обработки событий

Написано: Функция OnStart() является обработчиком события Start, которое автоматически генерируется только для запущенных на выполнение скриптов.

Далее: Событие Start генерируется только после окончания обработки события Init.

Финал: Событие Init генерируется сразу после загрузки эксперта или индикатора, для скриптов это событие не генерируется.

Наверное я тупой, но получается, что для скриптов Start выполняется после Init, который для скриптов не выполняется.


OnCalculate

Фраза: Первая форма вызова предназначена для тех индикаторов, которые могут быть рассчитаны на одном буфере данных.

Что значит "на одном буфере", правильнее наверное "с использованием одного буфера".

Фраза: В данном примере последним параметром передано значение PRICE_TYPICAL (из перечисления ENUM_APPLIED_PRICE ), которое указывает, что пользовательский индикатор будет построен по типическим ценам, полученным как (High+Low+Close)/3.

Слово "типическим" как то совсем не литературна. Может лучше "типичным". Придираюсь, да. Но в Справочник MQL5 - Стандартные константы, перечисления и структуры - Константы индикаторов - Ценовые константы написано "типичная".

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

А если превысит, что будет, ошибка и вылет или просто обрежет? Дайте тогда функцию, которая возвращает этот самый Max bars in chart, или CHART_VISIBLE_BARS - это оно и есть?


Справочник MQL5 - Основы языка - Переменные - Локальные переменные

Что то я упустил этот момент. А локальные переменные можно во внешние подпрограммы передавать по ссылке? На сколько это безболезненно?


Справочник MQL5 - Основы языка - Переменные - Input переменные

Фраза: Существует возможность задать иной способ отображения имен входных параметров на закладке "Inputs". Для этого используется строчный комментарий, который должен располагаться после описания входного параметра в той же строке. Таким образом, входным параметрам можно сопоставить более понятные для пользователя имена.

Опять я придираюсь, но не очень это удачное решение. Вместо комментария в той же строке какую нибудь функцию придумали, что ли, что то типа NameAs или DisplayName.

Фраза: Если в пользовательском индикаторе используется функция OnCalculate первого вида (то есть, индикатор считается на одном массиве данных),

Ну не "считается" а "расчитывается", "используется", "вычисляется". В общем, матёрый лингвист сегодня во мне проснулся.


 

Ну вот опять.


Справочник MQL5 — Стандартные константы, перечисления и структуры — Константы индикаторов — Ценовые константы


Ценовые константы


Технические индикаторы требуют для своих расчетов указания значений цен и/или значений объемов, на которых они будут считаться.



Если технический индикатор для своих расчетов использует ценовые данные, тип которых задается перечислением ENUM_APPLIED_PRICE, то в качестве входного ценового ряда можно указывать хендл любого индикатора (встроенного в терминал или написанного пользователем). В этом случае для расчетов будут использованы значения нулевого буфера индикатора. Это позволяет легко строить значения одного индикатора по значениям другого индикатора. Хендл пользовательского индикатора создается вызовом функции iCustom().


Хэндл - это описатель?


Справочник MQL5 — Стандартные константы, перечисления и структуры — Торговые константы — Информация о счете


ACCOUNT_TRADE_MODE

Account trade mode


Перевода нет, на русский.



Справочник MQL5 — Стандартные константы, перечисления и структуры — Торговые константы — Свойства сделок


DEAL_SYMBOL

Deal symbol



Перевода нет, на русский.


Справочник MQL5 — Стандартные константы, перечисления и структуры — Структуры данных — Структура торгового запроса

expert

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


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


Справочник MQL5 — Программы MQL5 — Выполнение программ


Все возникающие события клиентский терминал складывает в общую очередь.


Не складывает, а помещает или поступают.


Если в очереди уже есть такое событие либо это событие находится в состоянии обработки, то новое событие NewTick в очередь не ставится.


новое событие NewTick игнорируется.


Справочник MQL5 — Программы MQL5 — Вызов импортируемых функций


вызывающая функция (в нашем случае mql5-программа) складывает параметры на стек в обратном порядке, справа налево - именно в таком порядке импортируемая функция считывает переданные ей параметры;


Ну, понятно, да.


Функции, импортируемые из DLL в mql5-программу, должны обеспечивать соглашение о связях, принятое для функций Windows API. Для обеспечения такого соглашения в исходном тексте программ, написанных на языках C или C++ используется ключевое слово __stdcall, которое является специфическим для компиляторов от фирмы Microsoft(r).


На самом деле stdcall используется и в Дельфи и ФриПаскале, и ещё много где. По этому вопрос о специфичности весь спорен. Другое дело, что Майкрософт автор этого соглашения о вызовах. Для обеспечения выполнения этого соглашения в языке Delphi, при объявлении функции или процедуры, используется директива stdcall.


Справочник MQL5 — Стандартные константы, перечисления и структуры — Коды ошибок и предупреждений — Ошибки времени выполнения


GetLastError() – функция, возвращающая код последней ошибки, которая хранится в предопределенной переменной


Вот, было бы совсем отлично, если появилась функция, что то типа GetLastErrorString() что бы возвращала описание ошибки. С учетом языка, конечно.


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


 

Справочник MQL5 — Общие функции — GetTickCount


Функция GetTickCount() возвращает количество миллисекунд, прошедших с момента старта системы.

int GetTickCount();

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

Значение типа int.

Примечание

Счетчик ограничен разрешающей способностью системного таймера. Так как время хранится как беззнаковое целое, то он переполняется каждые 49.7 дней при непрерывной работе компьютера.


В определении функция имеет int, в примечании указано беззнаковое, т.е uint. И это, в общем то правильно, не могут быть миллисекунды отрицательными. Про разрешающую способность - какая она?


Справочник MQL5 — Общие функции — PrintFormat


Вместо функции PrintFormat() можно использовать функцию printf().


ССылка на printf никуда не ведёт. Что это такое - найти ни в поиске, ни в индексах не удалось.

Выделенная фраза встречается в примечании дважды. Второй раз в конце статьи.

А вообще printf() чуждо смотрится, среди других функций.


Справочник MQL5 — Общие функции — Sleep


Слип то же, почему то int, то есть может быть отрицательным. Понятно что это в принципе не должно быть. Нельзя уснуть на -5000 миллисекондов.


Справочник MQL5 — Операции с массивами — ArrayBsearch


У нас есть возможность пользоваться, ну не знаю, наверное 10-20 типами данных, а поиск возможен только по double, float, long, int, short, char? Понятно, что это 1,2,4,8 байтовые целые и 4,8 байтовые нецелые, но всё же.


Справочник MQL5 — Операции с массивами — ArrayGetAsSeries


Возвращает true, если у указанного массива установлен флаг AS_SERIES, то есть доступ к массиву осуществляется задом наперед как в таймсерии. Таймсерия отличается от обычного массива тем, что индексация элементов таймсерии производится от конца массива к началу (от самых свежих данных к самым старым).


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


И "от конца к началу" - то же, зависит от того, что считать концом.


Справочник MQL5 — Операции с массивами — ArrayInitialize


Не рекомендуется инициализировать индексные буферы в функции OnInit() пользовательских индикаторов, так как они инициализируются автоматически "пустым значением" EMPTY_VALUE при распределении и перераспределении буферов.


Вот тут, ребята, что бы вы там не говорили, абсолютно нельзя согласиться. Так же как и с отрицательным временем. Меня всё время учили, что отличный способ программирования состоит в том, что инициализация "чего нужно" должна быть в специальном месте, то есть в Init. Вы мне тут рассказываете что не рекомендуется! Афигеть! Если вы имеете ввиду, что индексные массивы можно (нет необходимости) не инициализировать, так как они автоматически инициализируются бла..бла...бла.. - это другое дело. Но мы тут уже раз спорили, насчет "должен" и "может" - так что даже и не знаю - стоит ли опять. Скажу лишь, что вы таки смогли потрясти меня.


Справочник MQL5 — Операции с массивами — ArrayIsDynamic


Совсем запутался. У нас есть тонкости в обращении к статическим и динамическим массивам?


Справочник MQL5 — Операции с массивами — ArrayIsSeries


Может завести одну функцию, что то типа СкажиМнеЧтоТыЗаМассив? А она в ответ, яТаймсерия, яДинамическийМассив, яСтатическийМассив, яНеМассивВовсе. ы?


Справочник MQL5 — Операции с массивами — ArrayMaximum

Справочник MQL5 — Операции с массивами — ArrayMinimum


У обоих функций массивы для поиска указаны как double. То есть ни в каких других типах искать нельзя? Если мне захочется, а это обязательно произойдет, поискать Мин\Мах в массиве uint - то придется опять dll-шку свою писать. :( Я конечно напишу, но где тогда ООПность.


Справочник MQL5 — Операции с массивами — ArrayResize

Справочник MQL5 — Операции с массивами — ArraySize


Почему опять int у размера массива? Ну не может быть размер отрицательным. Кроме того, получается, что макс.размер массива будет вдвое меньше чем при использовании uint.


Справочник MQL5 — Операции с массивами — ArraySort


bool ArraySort(
number& array[] // массив для сортировки
);


Какие типы сортируются, не указано. В ArrayBsearch не всякое можно искать, с сортировкой то же самое?



Общее моё непонимание ситуации с массивами. Если у нас есть массив строк, с ним вообще ничего нельзя делать, ни сортировать, ни искать в нём?

 
HideYourRichess писал(а) >>


Возможно я придираюсь....

Что такое тестирование? Это когда берется изделие и делается все, чтобы это изделие сломать.

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

И смотреть на реакцию изделия.

Если после таких экзекуций изделие продолжает исправно служить, значит, тест прйден успешно.

Если наблюдаются какие-либо сбои в работе изделия, о сбоях сообщается на завод-изготовитель изделия.

Завод отзывает изделие на доработку.

Например, фирма Тойота на днях отозвала 2 000 000 автомобилей с американского рынка.

Коврики у водительского места могут вызвать какие-то неполадки при движении автомобиля...

===============

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

Изделие, надо думать, будет улучшено.

 
nen >>:

Что такое тестирование? Это когда берется изделие и делается все, чтобы это изделие сломать.

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

И смотреть на реакцию изделия.

Если после таких экзекуций изделие продолжает исправно служить, значит, тест прйден успешно.

Если наблюдаются какие-либо сбои в работе изделия, о сбоях сообщается на завод-изготовитель изделия.

Завод отзывает изделие на доработку.

Например, фирма Тойота на днях отозвала 2 000 000 автомобилей с американского рынка.

Коврики у водительского места могут вызвать какие-то неполадки при движении автомобиля...

===============

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

Изделие, надо думать, будет улучшено.

Тем более, что и тестеры бесплатные. ;)

 
Gans-deGlucker >>:

Тем более, что и тестеры бесплатные. ;)

За всех не скажу...

Но меня, лично, это нисколько не напрягает.

;)

 

Оно не напрягает. Но попытка программирования упирается в нестабиность работы некоторых функций (доступ к таймсериям). И непонятно, как они работают. А пока устойчиво не получается копирование данных в свои массивы, невозможно что-либо делать. Танцуют от печки. А печка работает неисправно. И как дальше тестировать?

Просто так проверять что попало становится неинтересно. Хотелось бы с практическим уклоном.

==========

Примеры программирования, представленные в поставке терминала - тетрис, летающие шары... - это находится где-то в стороне от предметной области. Предметная область - трейдинг.

Вот если бы в качестве примера была создана программа, которая строит, например, модели тактики Адверза. Это действительно была бы стОящая разработка.

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

Я ни в коей мере не хочу преуменьшить эти разработки. Примеры хорошие.

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

 

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

...

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

.

Следует добавить слово типов в конце предложения. Иначе звучит несколько мистически.

================

Про перегрузку функций описание очень туманное.

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

Это предложение необходимо переписать по-другому.

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

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

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

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

 
HideYourRichess >>:



Справочник MQL5 - Основы языка - Функции - Передача параметров

//+------------------------------------------------------------------+
//| передача параметров по значению |
//+------------------------------------------------------------------+
double FirstMethod(int i,int j)
{
double res;
//---
i*=2;
j/=2;
res=i+j;
//---
return(res);
}
//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
void OnStart()
{
//---
int a=14,b=8;
Print("a и b перед вызовом;",a,b);
double d=SecondMethod(a,b);
Print("a и b после вызова:",a,b);
}
//--- результат выполнения скрипта
// a и b перед вызовом: 14 8
// a и b после вызова: 14 8



Не SecondMethod а FirstMethod. И нехватает примера использования const.


Справочник MQL5 - Основы языка - Функции - Функции обработки событий

Написано: Функция OnStart() является обработчиком события Start, которое автоматически генерируется только для запущенных на выполнение скриптов.

Далее: Событие Start генерируется только после окончания обработки события Init.

Финал: Событие Init генерируется сразу после загрузки эксперта или индикатора, для скриптов это событие не генерируется.

Наверное я тупой, но получается, что для скриптов Start выполняется после Init, который для скриптов не выполняется.


Спасибо, исправили.