Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Смысл моего предложения в том, что-бы просто сравнить голый индикатор и тот-же индикатор но с добавленной графикой.
Вот и всё...
Считаю, что проблема сама по себе надуманная. По нынешним временам (гы. скоростям) - это стрельба по воробьям из пушек.
Раньше, когда это было действительно критично (и где этого требовали условия технологии), подсчитывали количество операций сложения, пересылок и т.п. на такт, определяли число тактов для выполнения модуля, учитывая тактовую частоту микропроцессора, определяли время :))
Проделывать подобное в нынешних условиях, думаю, никто не станет.
Оценить время исполнения можно следующим образом:
.......... запись времени в журнал 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 не всякое можно искать, с сортировкой то же самое?
Общее моё непонимание ситуации с массивами. Если у нас есть массив строк, с ним вообще ничего нельзя делать, ни сортировать, ни искать в нём?
Возможно я придираюсь....
Что такое тестирование? Это когда берется изделие и делается все, чтобы это изделие сломать.
Можно бить кувалдой, топить, жечь огнем... обзывать его нехорошими словами.
И смотреть на реакцию изделия.
Если после таких экзекуций изделие продолжает исправно служить, значит, тест прйден успешно.
Если наблюдаются какие-либо сбои в работе изделия, о сбоях сообщается на завод-изготовитель изделия.
Завод отзывает изделие на доработку.
Например, фирма Тойота на днях отозвала 2 000 000 автомобилей с американского рынка.
Коврики у водительского места могут вызвать какие-то неполадки при движении автомобиля...
===============
Понятно, разрабочикам метатрейдера сейчас не сладко. Много упреков. Но, с другой стороны, все упреки - на пользу.
Изделие, надо думать, будет улучшено.
Что такое тестирование? Это когда берется изделие и делается все, чтобы это изделие сломать.
Можно бить кувалдой, топить, жечь огнем... обзывать его нехорошими словами.
И смотреть на реакцию изделия.
Если после таких экзекуций изделие продолжает исправно служить, значит, тест прйден успешно.
Если наблюдаются какие-либо сбои в работе изделия, о сбоях сообщается на завод-изготовитель изделия.
Завод отзывает изделие на доработку.
Например, фирма Тойота на днях отозвала 2 000 000 автомобилей с американского рынка.
Коврики у водительского места могут вызвать какие-то неполадки при движении автомобиля...
===============
Понятно, разрабочикам метатрейдера сейчас не сладко. Много упреков. Но, с другой стороны, все упреки - на пользу.
Изделие, надо думать, будет улучшено.
Тем более, что и тестеры бесплатные. ;)
Тем более, что и тестеры бесплатные. ;)
За всех не скажу...
Но меня, лично, это нисколько не напрягает.
;)
Оно не напрягает. Но попытка программирования упирается в нестабиность работы некоторых функций (доступ к таймсериям). И непонятно, как они работают. А пока устойчиво не получается копирование данных в свои массивы, невозможно что-либо делать. Танцуют от печки. А печка работает неисправно. И как дальше тестировать?
Просто так проверять что попало становится неинтересно. Хотелось бы с практическим уклоном.
==========
Примеры программирования, представленные в поставке терминала - тетрис, летающие шары... - это находится где-то в стороне от предметной области. Предметная область - трейдинг.
Вот если бы в качестве примера была создана программа, которая строит, например, модели тактики Адверза. Это действительно была бы стОящая разработка.
А так получается, что приведенные примеры - упражнения в абстрактном программировании.
Я ни в коей мере не хочу преуменьшить эти разработки. Примеры хорошие.
Но все-таки, практичнее если примеры программ будут ближе к предметной области - - ближе к трейдингу.
Перегрузка функций
...
Несомненно, строгое соответствие является наилучшим. Для достижения такого соответствия могут использоваться приведения типов.
.
Следует добавить слово типов в конце предложения. Иначе звучит несколько мистически.
================
Про перегрузку функций описание очень туманное.
Например, предложение: Перегрузкой называется практика придания нескольких значений функции.
Это предложение необходимо переписать по-другому.
Написано, казалось бы, много. Но непонятно, как самостоятельно создать перегруженную функцию. Необходимо, например, создать перегруженную функцию со своими типами данных.
Например, создаем структуру:
struct timeseries
{
datetime time;
double high;
double low;
};
Справочник 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, который для скриптов не выполняется.
Спасибо, исправили.