Субботник по наполнению FAQ (часто встречающиеся вопросы). Поможем товарищам! - страница 5

 

обещался, начну с самого простого)

Вопрос: MQL неправильно производит арифметические операции? Почему при делении одного числа на другое получается 0?

Ответ:

Скорее всего, вы написали выражение вида

c = a/b;  // (1)

объявив при этом переменные a и b как целочисленные:

int a,b;

В этом случае компилятор языка MQL интерпретирует значок "косая черта" как операцию "целочисленное деление". Таким образом, даже если до появления в коде выражения (1) переменным a и b присваиваются какие-либо значения, пусть даже нецелые, в переменную c все равно будет записан ответ "число b умещается в числе a столько-то целых раз". А это, в свою очередь значит, что если до вычисления выражения (1) a было меньше, чем b, то его результат будет равен нулю, причем независимо от типа переменной c (она в приведенном примере может быть и double).

Описанная ошибка довольно часто является причиной случаев "неправильного" поведения программы в терминале - "неизвестно откуда берущегося" сообщения divide by zero в логах экспертов, неотображения одной или нескольких линий индикатора в окне терминала и др.

Решение проблемы:

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

double a,b;
 
Вопрос: Почему 3 деленное на 2 равно 1, а не 1.5?

Alert(3/2);

Ответ: Числа 3 и 2 в этом выражении представляют собой целые числа. Целое число не делиться без остатка. Для того, чтобы получить результат 1.5 необходимо указать, что делимое является числом с плавающей точкой: 

Alert(3.0/2);

* * * 

Вопрос: Почему выражение вычисляется неправильно?

  double price=1.0; // Цена
  double point=0.0001; // Величина пункта
  double level=272.0; // Уровень в пунктах от цены
  double levelprice; // Значение цены уровня
   
  levelprice=price+point*level; // должно быть 1.0272
   
  if(levelprice==1.0272){
  Alert("Правильно");
  }
  else{
  Alert("Неправильно");
  }

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

  levelprice=NormalizeDouble(levelprice,4);

  if(levelprice==1.0272){
  Alert("Правильно");
  }
  else{
  Alert("Неправильно");
  }

* * *

Вопрос: Как в советнике получить значение пользовательского индикатора?

Ответ: Для этого имеется функция iCustom().

* * *

Вопрос: С чего начать изучение MQL4?

Ответ: В редактор MetaEditor встроено очень подробное справочное руководство (Открыть MetaEditor - Главное меню - Вид - Навигатор - Словарь).
В комплект терминала входит два советника MACD Sample и Moving Average, практическую работу можно начать с анализа их кода.
Кроме того, на mql4.com имеется учебник, большое количество статей и всякого разного кода.
 
Вопрос: Почему значение равно 0, хотя оно точно не равно 0?

  double point=0.00001; // Величина пункта
  Print(point);

Ответ: Функциями Print() и Alert() выводится только четыре знака после зяпятой. Если нужно больше, нужно преобразовать число double в string функцией DoubleToStr().
 
Print(DoubleToStr(point,5));
 

Вопрос: Советник выводит функцией Print() большое количество сообщений, но в тестере больше половины сообщений куда-то пропадает.

Ответ: При тестировании, при большой частоте вывода в журнал, часть сообщений не выводится во вкладку "Журнал", но все сообщения можно увидеть в лог файле тестера после тестирования. Файл находится в папке tester/logs.

 
Спасибо всем, пишите еще.
Соберу в FAQ только вечером, когда приеду.
 

Предложение к модераторам, и желающим оказать минимальную помощь.

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

Для начала я создал структуру справки.
Она поделена на 3 больших раздела.

1) КАК. в этом разделе описываются упреждающие ответы на возможные вопросы. Например как получить данные индикатора, как закрыть все ордера, и т.д. также в этом разделе находится большая систематизированная база функций (аналоги функций Кима). И главное - прмеры готовых выполненных примитивных ТЗ с подробным объяснением кода и коментариями. Это очень сложный раздел, так как требует повышенной систематизации знаний и анализа. Будет наполнятся в последнюю очередь.

2) ПОЧЕМУ. в этом разделе описываются появившиеся частые вопросы новичков (их примеры красиво продемонстрировал alsu и integer в этой ветке)

3) ГДЕ. в этом разделе находится в основном ссылки на то, где что искать или лежит. Описывать не буду в общем смотрите сами.
Архив готовой chm-структуры прикладываю (скачайте внизу поста)


1. Структура мануала


2. Демонстрации возможностей - перейдите по ссылке "Где: Полезные ссылки -> Учебник MQL4"

Файлы:
mql4_4.zip  53 kb
 


Дальнейшие действия видятся следующие:

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

2. Все созданые вопросы для подраздела собирает куратор по данному подразделу (1-2 человека). Они обрабатывают их, приводят в общий стиль и формируют перекрестные ссылки по необходимости Это позволит иметь у каждого подраздела своего хозяина, и не будет каши в базе, будет один стиль и шаблон ответа.
Например раздел "Где" поделен на 4 подраздела: Вопросы по тестеру, терминалу, форуму, полезные ссылки. На каждый подраздел достаточно по 1 человеку. Они полностью займутся сортировкой приходящей базы знаний от фрилансеров, которую посчитают нужной, а также все предложения, которые возможно будут поступать от других участников соседних разделов. Ну и конечно они сами должны принимать активное участие в наполнение базы и создания вопросов.

3. По мере заполнения подразделов - они передаются сборщику (например мне). Необходимо собирать их в один файл chm и держать все в одном стиле. Создавать дополнительные перекрестные ссылки, индексировать, добавлять ключевые слова для поисковых запросов.

Подразделы могут быть
пересортированы или расширены по предложению куратора и согласованию новой структуры со сборщиком.

Итог:
Участникам: Милости прошу к нашему шалашу. :) желающие на должность куратора подраздела и те, у кого уже есть что создать - скидывайте свои посты-ответы сюда.
Модераторам: Материала будет много. Прошу не допускать обсуждения и отвлеченных, пустых постов в данной ветке. Также необходимо будет после переноса поста в общую базу - удалять посты участников для облегчения работы секции.
Кураторам: Файл справки создаётся в WinCHM 4.17 (кому надо пишите в личку). Требования к именам и расположению файлов:
- структура папок должна в точности повторять структуру справки
- все имена файлов/папок должны даваться только на английском языке в осмысленных фразах
- пример текущей базы, которую "компилирует" WinCHM в архиве

Файлы:
chm4_2.zip  19 kb
 

sergeev:

... 


1) КАК. в этом разделе описываются упреждающие ответы на возможные вопросы. Например как получить данные индикатора, как закрыть все ордера, и т.д. также в этом разделе находится большая систематизированная база функций (Кима и т.д.). И главное - прмеры готовых выполненных примитивных ТЗ с подробным объяснением кода и коментариями. Это очень сложный раздел, так как требует повышенной систематизации знаний и анализа. Будет наполнятся в последнюю очередь.

...

Алексей, все функции Кима по работе с ордера очень сомнительны по надежности и точности своей работы. Вы тоже на них советников клепаете?

 
Integer:

Алексей, все функции Кима по работе с ордера очень сомнительны по надежности и точности своей работы. Вы тоже на них советников клепаете?

не. клепаю на своих, проверенных реалом. :)

Если честно, то кимовские практически не видел нигде кроме как в рекомендациях на этом форуме. В описании раздела я их привел только для примера, чтоб понимали о чем речь. И не уверен, что кимовские войдут в мануал в своем коде. Будет взята только идея и отработана в общий стиль.

Раздел КАК вообще самый серьезный. Им должны заняться максимум 2-3 человека, так как все разделы КАК - это подведение к последнему разделу - "Примеры ТЗ и их реализация", в котором будут показаны все возможные варианты и использование комбинаций всех предыдущих функций разделов.

 

Вопрос: Как сравнить два действительных числа тип "double" ?


Ответ:

double A;
double B;

if(NormalizeDouble(MathAbs(A-B),Digits)<0.1*Point)return(true);
else return(false);
Причина обращения: