Jump to content

Учим MQL5 вместе


Programmer

Recommended Posts

Programmer

Всем привет!

 

С момента выхода MQL5 в 2009м году прошло более 3х лет. И только сейчас я замечаю, как начинает постепенно расти спрос / потребность в знаниях в этом языке программирования.

Причиной подобной задержки может быть множество факторов, несколько примеров:

- несовместимость программ, написанных на MQL4, с языком MQL5

- более высокий уровень языка MQL5, а следовательно повышенная сложность

- замедленное внедрение платформы MT5 в торговом мире

и пр.

 

Несмотря на все это, постепенно люди начинают интересоваться MQL5, и поэтому в данной ветке я попробую удовлетворить Ваши потребности в новых знаниях. Однако, ветка не будет структурирована в форме курса. Наоборот, мы будем изучать язык MQL5 вместе. Каждый раз я буду поднимать тему / вопрос, который меня самого интересует, и находить его решение, которое мы с Вами уже будем обсуждать. Возможно, после того, как накопится достаточно знаний, можно будет написать и целый Курс MQL5.

 

Ну что-ж, начнем!

 

PS: На данном этапе, если у Вас будут возникать вопросы - задавайте их прямо в этой ветке

Edited by Programmer
Link to post
Share on other sites
Programmer

Начнем!

Установил терминал, решил посмотреть на MQL5 подробней. Открыл первый советник, попавшийся под руку:

 

post-50854-1404218810,1958_thumb.gif

 

post-50854-1404218810,2971_thumb.gif

 

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

Начал читать сверху вниз. Все понятно, все, как в MQL4 - пока ни дошел до строчки 32:

 

 

 

CExpert ExtExpert;

Такого типа (класса) переменных CExpert в справке не оказалось. Более того, новая переменная ExtExpert используется по всюду в программе. Например, основная функция OnTick вызывает функцию изнутри этой переменной:

 

 

 

 

post-50854-1404218810,4132_thumb.gif

 

Зашел в папку MQL5\Include\Expert, открыл прикрепляемую библиотеку Expert.mqh, чтобы посмотреть на этот новый класс, увидел, что дейстивтельно, это класс:

 

 

 

post-50854-1404218810,4816_thumb.gif

 

Решил прочитать про типы переменных в справке:

 

 

 

 

post-50854-1404218810,7277_thumb.gif

 

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

 

Структура является набором элементов произвольного типа (кроме типа void). Таким образом, структура объединяет логически связанные данные разных типов.

 

Классы имеют ряд отличий от структур:

- в объявлении используется ключевое слово class;

- по умолчанию все члены класса имеют спецификатор доступа private, если не указано иное. Члены-данные структуры по умолчанию имеют тип доступа public, если не указано иное;

- объекты классов всегда имеют таблицу виртуальных функций, даже если в классе не объявлено ни одной виртуальной функции. Структуры не могут иметь виртуальных функций;

- к объектам класса можно применять оператор new, к структурам этот оператор применять нельзя;

- классы могут наследоваться только от классов, структуры могут наследоваться только от структур.

 

 

Т.к. у меня достаточно широкий опыт программирования на C++, я попробую простым языком объяснить понятие классов.

Итак, классы - это некие объекты содержащие в себе набор переменных и функций для работы с этими переменными. Классы - это основное отличие функционального программирования от объектно-ориентированного программирования, C от C++, MQL4 от MQL5.

Edited by Programmer
  • Thanks 2
Link to post
Share on other sites
Programmer

Всем привет!

Сегодня прочитал ну ОЧЕНЬ полезную статью по Объектно Ориентированному Программированию (ООП) в MQL5.

 

Материал написан очень доступным языком и приводимые примеры интуитивно понятны. Поскольку статья расположена на форуме mql5.com, читать ее придется там. Но для упрощения понимания основные моменты мы разберем здесь.

 

Статья: http://www.mql5.com/ru/articles/351

 

В этой статье освещены следующие темы:

 

Введение & Создание библиотек функций & Программа в программе

Основные преимущества и практическая применимость ООП

 

Как выглядит класс & Видимое и скрытое (инкапсуляция)

Знакомство с понятием класса

 

Пример создания библиотеки

Пример простейшего класса и иллюстрация уровней инкапсуляции

 

Загрузка класса

Пример создания объекта выбранного класса

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

 

Делаем библиотеку универсальной для разных типов данных (перегрузка)

Перегрузка - это одна из наиболее важных тем в ООП. На данной часте статьи советую остановиться подробней. Перегрузка является наглядным примером того, насколько мощней MQL5 по сравнению с MQL4: в новой платформе Вы можете объявить две функции (внтури одного класса) с одним и тем же именем, и нужная функция будет выибрана автоматически в зависимости от передаваемых параметров (набора / типов).

 

Еще один способ записи класса

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

 

Объявление переменных в классе

Важное ограничение - в классе нельзя инициализировать переменные при их объявлении.

 

Пример преобразования скрипта в класс

Важный пример и также хороший чек-поинт для самоконтроля: чтобы продвигаться дальше необходимо обязательно понять этот пример полностью. Чтобы понять этот пример, необходимо прочитать и освоить все предыдущие части статьи. Также подразумевается знание принципа работы функции OrderGetTicket(), которое немного отличается от аналога в MQL4 - OrderSelect().

 

Советую прочитать справку по этой функции: http://www.mql5.com/ru/articles/351

 

Обратите особое внимание на следующий текст в справке:

 

Не следует путать между собой действующие отложенные ордера и позиции, которые также отображаются на вкладке "Торговля" в панели "Инструменты". Ордер – это распоряжение на проведение торговой операции, а позиция является результатом одной или нескольких сделок.

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

Мы изучили примерно 1/3 статьи.

Если на данном этапе у Вас есть вопросы - задавайте, я помогу разобраться!

 

С уважением,

Кирилл

Link to post
Share on other sites
Programmer

Сегодня мы продолжаем разбор статьи: http://www.mql5.com/ru/articles/351

 

Немого автоматики (конструктор и деструктор) & Передача параметров в конструктор

О том, что происходит в момент создания объекта класса и в момент удаления этого объекта

А также, важная концепция ООП, отвечающая на вопрос "Почему при создании объекта в него передаются параметры? Как такое возможно?"

 

Использование нескольких экземпляров класса

Примеры создания двух объектов одного класса. Объекты имеют различные свойства

 

Массив объектов

А вот тут мы остановимся поподробнуй. Данный параграф вызвал у меня достаточно много вопросов: "Указатели в MQL5?", "Как правильно создавать обхъекты через операторы new и delete?", "Зачем это вообще нужно?", и пр.

 

Давайте разбираться попорядку.

 

Для начала заметим, что данный раздел статьи имеет три части, и вторая часть имеет две под-части:

1 - Описывается класс CName

2A - Пример создания статического массива cname[] для последущего хранения 10ти объектов класса CName

2B - Пример создания динамического массива cname[] для последущего хранения динамического числа объектов класса CName. Затем переопределение размера этого массива до 10ти элементов: ArrayResize(cname,10);

3 - Цикл загрузки объектов в массив (одинаковый для 2A и 2B) и всё, что находится после цикла

 

Теперь про указатели.

Советую прочитать справку: http://www.mql5.com/ru/docs/basis/types/object_pointers

Программисты C++, обратите внимание на следующий комментарий:

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

Честно говоря, я не до конца понял, что именно имели ввиду под этим разработчики. Для себя я просто взял на заметку правило: "Не использовать указатели MQL5 для прямого обращения к памяти, как в C++. Например не получится обращаться к ячейкам памяти через арифметические операции с указателями"

 

Попробую объяснить концепцию указателей в MQL5 как я ее понял

Допустим, что у нас есть класс Class007 и мы хотим создать объект (в статье еще используется слово "экземпляр") этого класса. Нам доступны два варианта:

 

Вариант 1

Просто объявить объект выбранного класса:

Class007 MyObject1;

В данном случае система автоматически создаст и проинициализирует этот объект, и им можно будет пользоваться. Поэтому этот вариант называется "Автоматический".

 

Вариант 2

Если мы пока не хотим создавать объект выбранного класса. Такое возможно, если, например, на данном этапе исполнения программы недостаточно информации для создания того объетка, который мы хотим. Т.е. мы пока не знаем, какими именно свойствами должен обладать объект (#) / какой именно он должен быть (##). Поверьте, такое возможно - на примеры укажу позже.

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

 

Именно в этом случае мы используем указатели в MQL5, и делается это так:

 

Class007 *MyObject1;

Звездочка (*) означает, что создается указатель на объект, но сам объект пока еще НЕ создан! Такой указатель называется динамическим.

 

Мы как бы переняли часть обязанностей компилятора. Он нам создал указатель (имя) на объект, но не наполнил этот указатель самим объектом. Т.е. мы находимся в некой промежуточной стадии между "ничем" и "созданным объектом". Теперь это наша задача - создать объект, и потом удалить его. Компилятор умывает руки, говоря нам "Если ты хочешь указатель - вот тебе указатель, а объект создашь сам, когда захочешь. И помни, что тебе тоже надо удалить объект, когда ты с ним закончишь, иначе будет утечка памяти"

 

Создание и удаление объекта по указателю (наполнение указателя) производится так:

 

MyObject1 = new Class007;
...//прочий код программы
delete(MyObject1);

 

Для закрепления знаний прочитайте только введение следующей статьи: http://www.mql5.com/ru/articles/36

 

 

Мы разобрали, как работают указатели. Перейдем к более интересному вопросу - зачем они нужны?!

 

Как я писал, можно выделить два явных случая, когда нам может понадобиться указатель: # и ##

# Мы еще не знаем всех свойств объекта - этот пример разбирается в данном параграфе про массив. Мы создаем массив указателей на объекты класса CName, а затем мы заполняем эти указатели экземплярами класса в зависимости от порядкового номера элеметов массива. Т.е. все эти объекты имеют различные свойства (порядковый номер), который на этапе создания массива мы не знаем (точнее - порядковый номер свой для каждого элемента, и поэтому мы не можем указать один конкретный номер при создании массива).

 

## Мы еще не знаем какой именно он должен быть объект - это более важный и частый пример в ООП. Он включает в себя полиморфизм и виртуальный функции и разбирается в следующем параграфе статьи.

 

### Еще один пример использования указателей - это связанный список. Я как-то применял в C++ связанный список. Однако, исходя из личного опыта, могу сказать, что связанные списки применяются крайне редко, и только для решения специфических задач. Я думаю, что в трейдинге Вы сможете легко обойтись без них.

Тем не менее, если Вам инетересно, Вы можете прочитать про связанные списки в следующей статье: http://www.mql5.com/ru/articles/36

В середине статьи Вы найдете раздел "Связанный список"

 

 

Материал для продвинутого изучения

 

Когда Вы начнете часто пользоваться указателями, очень советую прочитать нижеперечисленные разделы статьи http://www.mql5.com/ru/articles/36

 

Критическая ошибка при обращении к некорректному указателю

Проверка указателя перед его использованием

Передача неинициализированного объекта по ссылке

Перегрузка функции для безопасной работы кода

 

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

 

 

Суммарно, мы изучили примерно 1/2 статьи и разобрали уже достаточно сложный материал.

Если на данном этапе у Вас есть вопросы - задавайте, я помогу разобраться!

 

С уважением,

Кирилл

Link to post
Share on other sites
  • 2 weeks later...
Programmer

Сегодня мы продолжаем разбор статьи: http://www.mql5.com/ru/articles/351

 

Использование ООП для изменения логики работы программы (виртуальные функции, полиморфизм)

& Еще об инкапсуляции (private, protected, public)

& Виртуальная функция по умолчанию и наследование

 

Эти три параграфа необходимо читать вместе. Материал немного разбросан, и только после прочтения всех трех частей всё становится на свои места.

 

В этом параграфе автор рассказывает про наследование классов, и виртуальные функции.

Наследование классов + виртуальные функции = полиморфизм.

Полиморфизм - это центральное понятие ООП. Понять и освоить полиморфизм, означает освоить MQL5 наполовину, если не больше!

 

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

- классы-наследники не унаследуют ничего из раздела Private родительского класса

- при определении классов-наследников, можно заменять любые виртулальные функции, унаследованные от родительского класса (но это необязательно - можно не заменять)

PS: мы говорим про определение классов. Напомню, что определение классов происходит ДО создания объектов этих классов

 

Обратите внимание на следующий комментарий автора и соотв. иллюстрацию в статье:

 

С позиции пользователя класса, при использовании потомка, будут доступны все функции базового класса из секции public. Данное явление называется наследованием. Если же в базовом классе функция объявлена как виртуальная, то она будет заменяться на функцию потомка в случае ее наличия у потомка

Теперь мы можем вернуться к примеру ## из параграфа про указатели: ## Мы еще не знаем какой именно он должен быть объект

В статье приводится пример, в котором мы создаем родительский класс CCheckVariant для сравнения двух чисел. Однако, мы не используем этот класс для непосредственного сравнения - вместо этого мы создаем 5 наследующих классов, которые производят 5 различных сравнений. В данном примере полиморфизм осуществляется через виртуальную функцию CheckVariant родительского класса - каждый из 5ти наследующих классов подменяет эту функцию своей.

 

Далее, мы переходим к использованияю этих классов, и сразу натыкаемся на ситуацию, когда нам нужно имя объекта (с которым мы будем потом работать), но при этом на данной стадии программы мы еще не знаем, какой из 5ти классов мы будем использовать. Поэтому, мы поступаем следующим образом: мы объявляем указатель var на (пока несуществующий) объект родительского класса CCheckVariant.

 

MQL5 устроен так, что, когда мы определимся, какой из классов CVariant1, ...., CVariant5 нам нужен, мы сможем "заполнить" наш указатель var объектом выбранного класса. Внимание! Это несмотря на то, что var является указателем на родительский класс!! Вот в чем прелесть совместного использования указателей + полиморфизма! Если Вы освоите эту концепцию, то считайте, что Вы сделаете огромный шаг вперед в изучении MQL5.

 

Некоторые комментарии касательно данного фундаментального приема. Рассмотрим более развернутый пример, нежели тот, что в статье. Допустим, в родительском классе есть некие функции в разделе private, а в классе-наследнике есть свои "лишние" функции - это такие функции, которые объявлены в классе-наследнике, но их нет в родительском классе. Например:

 

Родительский класс:

class CMyParentClass
 {
public:
  virtual int MathematicalOperation(int A, int 
    {
     return(0);
    }

  void PublicFunction(int A)
    {
     Alert("Public Function");
     return(A);
    }     

protected:
  int ProtectedFunction(int A)
    {
     Alert("Protected Function");
     return(A);
    }

private:
  int PrivateFunction(int A)
    {
     Alert("Private Function");
     return(A);
    }
 };

 

Наследующий класс:

class CAddition: public CMyParentClass
  {
public:
  int MathematicalOperation(int A, int 
    {
     return(A+;
    }

  bool NewFunctionSubtraction(int X, int Y)
    {
     return(X-Y);
    }
  };

 

 

 

Объявление указателя, создание и удаление объекта:

CMyParentClass *Var;
...//code

Var = new CAddition;
...//code

delete(Var);

 

 

- при создании указателя Var родительского класса CMyParentClass подразумевается, что если позже "наполнить" этот указатель объектом того же класса CMyParentClass, то в этом объекте будут доступны все функции этого класса: MathematicalOperation(), PublicFunction(), ProtectedFunction() и PrivateFunction(). Однако, в итоге мы "наполняем" этот указатель объектом дочернего класса CAddition. Важно понимать, что в объекте Var будут доступны только следующие функции: MathematicalOperation(), PublicFunction() и ProtectedFunction().

- При этом функция MathematicalOperation() будет иметь определение, данное в классе CAddition (а не в CMyParentClass), т.к. эта виртуальная функция, и она была подменена в дочернем классе.

- Функция NewFunctionSubtraction() в объекте Var доступна НЕ будет. Это важный момент! Так получается, потому что изначально указатель Var был объявлен как указатель родительского класса CMyParentClass, в котором указанной функции нет.

 

Обратите внимание на следующий комментарий автора и соотв. иллюстрацию в статье:

 

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

Еще немного о загрузке классов

В этом параграфе автор закрепляет пройденный материал.

 

Также для закрепления пройденного Вы можете рассмотреть еще один пример полиморфизма в самом конце статьи: http://www.mql5.com/ru/articles/36

 

 

Суммарно, мы изучили примерно 3/4 статьи и разобрали уже очень продвинутый материал.

Я уверен, что на данном этапе у Вас уже возникло множество вопросов - задавайте, я помогу разобраться!

 

С уважением,

Кирилл

Link to post
Share on other sites
  • 1 month later...
Programmer

Сегодня мы продолжаем разбор статьи: http://www.mql5.com/ru/articles/351'>http://www.mql5.com/ru/articles/351

 

Обработка объектов в функции

О том' date=' как передавать объекты в функции

 

[b']Функции и методы, переменные и свойства[/b]

Жаргон программистов. В классах функци на самом деле называются "методами", а переменные - "свойствами"

Структуры данных

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

 

Заключение

Грамотное подытоживание пройденного материала

 

 

На этом завершаем рассмотрение статьи http://www.mql5.com/ru/articles/351 На следующей встрече, мы продолжим дальше изучать MQL5. Поэтому если у Вас есть вопросы по тому фундаментальному материалу, который мы разобрали, пожалуйста задавайте их! Я буду рад ответить на вопросы и обсудить Ваши мнения.

 

С уважением,

Кирилл

Link to post
Share on other sites
  • 3 weeks later...
ГЫ

извините за оффтоп, но может, раз вы изучаете МТ5, то знаете... Появились ли уже крупные брокеры, использующие на реальных торговых счетах МТ5, и можно ли у этих брокеров присоединить счет к zulutrade?

Link to post
Share on other sites
Programmer
извините за оффтоп, но может, раз вы изучаете МТ5, то знаете... Появились ли уже крупные брокеры, использующие на реальных торговых счетах МТ5, и можно ли у этих брокеров присоединить счет к zulutrade?

 

Здравсвтуйте.

К сожалению, по понятным причинам я не могу ответит на этот вопрос.

Link to post
Share on other sites
  • 2 months later...
Wowa

Причины вполне понятны. Тогда вопрос: планируется ли в обозримом будущем внедрение МТ5 на реальных счетах в Альпари? Если нет, то зачем эта ветка вообще?


Мы сами знаем, что проблема не имеет решения. Мы хотим знать, как ее решать. (с) К. Хунта

Link to post
Share on other sites
Programmer
Причины вполне понятны. Тогда вопрос: планируется ли в обозримом будущем внедрение МТ5 на реальных счетах в Альпари? Если нет, то зачем эта ветка вообще?

 

Привествую Wowa,

 

Я не в курсе, когда появится реал-торговля на МТ5, но демо-терминал уже есть, значит учить MQL5 уже можно.

 

Поводов для данной ветки много. Но один из наиболее важных - обучение. Всегда есть люди, которые хотят научиться чему-то новому, попробовать себя в чем-то еще, совершенствоваться. Поскольку в данном разделе мы изучаем программирование на FOREX, тема MQL5 вполне актуальна. Как данные знания будут применяться (на демо счете / для дальнейшего изучения C++ / и тд) уже зависит от самого трейдера.

 

Надеюсь, я ответил на Ваш вопрос.

 

Кирилл

Link to post
Share on other sites
Wowa

Да, спасибо. Тема очень интересна лично для меня. Но хотелось бы учить язык ради практического применения. Что ж, будем ждать, а пока писать на MQL4


Мы сами знаем, что проблема не имеет решения. Мы хотим знать, как ее решать. (с) К. Хунта

Link to post
Share on other sites
  • 2 weeks later...
TatarenkoAV

Доброго времени, уважаемый Кирилл!

Не могли бы Вы написать несколько примеров открытия позиции и выставления ордеров.

Спасибо!

Link to post
Share on other sites
Programmer
Доброго времени, уважаемый Кирилл!

Не могли бы Вы написать несколько примеров открытия позиции и выставления ордеров.

Спасибо!

 

Здравствуйте, уроки по MQL5 немного приостановил. Ближайшие несколько недель планирую посвятить советнику Чебурашка - уж очень много там накопилось интересных идей. Примеры открытия позиций обязательно приведу как только возобновлю публикации по MQL5.

 

Кирилл

Link to post
Share on other sites
TatarenkoAV

Ладно, подождем, надеюсь.

еще вопрос по сохранению исполняемого файла.

терминал и метаредактор установлены в папке: A:\Program Files\MetaTrader\MT5

при создании нового советника в редакторе он сохраняется в C:\Users\User\AppData\Roaming\MetaQuotes\Terminal\7F7458857F20E4E2A5DEF3C395448027\MQL5\Experts и при этом терминал его видит, а если копирую файл.ex5 в папку A:\Program Files\MetaTrader\МТ5\MQL5\Experts, то не видит.

Что это может быть и как это лечить?

Link to post
Share on other sites
Programmer
Ладно, подождем, надеюсь.

еще вопрос по сохранению исполняемого файла.

терминал и метаредактор установлены в папке: A:\Program Files\MetaTrader\MT5

при создании нового советника в редакторе он сохраняется в C:\Users\User\AppData\Roaming\MetaQuotes\Terminal\7F7458857F20E4E2A5DEF3C395448027\MQL5\Experts и при этом терминал его видит, а если копирую файл.ex5 в папку A:\Program Files\MetaTrader\МТ5\MQL5\Experts, то не видит.

Что это может быть и как это лечить?

 

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

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

 

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

 

Кирилл

Link to post
Share on other sites
TatarenkoAV

Ладно, с этим я позже разбираться буду.

Щас возник другой вопрос: набросал на скорую руку помощника себе, проверял на форексе работает четко, перекинул на РТС пишет 2013.06.11 18:42:00 Trades '1002754': failed buy limit 1.00 RTS-6.13 at 125840 [invalid expiration]

выгладит торговый запрос так

         if (i >= total_orders)
        {
         Stop = false;
        //--- готовим запрос
           MqlTradeRequest request={0};
           request.action=TRADE_ACTION_PENDING;         // установка отложенного ордера
           request.magic=magic_number;                  // ORDER_MAGIC
           request.symbol=_Symbol;                      // инструмент
           request.volume=order_send_lot;               // объем в лот
           request.price=order_send_price;              // цена для открытия
           request.sl=0;                                // Stop Loss не указан
           request.tp=0;                                // Take Profit не указан   
           request.type=order_type;                     // тип ордера
           request.type_filling=ORDER_FILLING_RETURN;
           request.type_time=ORDER_TIME_GTC;
           //request.stoplimit=0;
           //request.expiration=D'2013.06.12';
           request.comment=IntegerToString(id_position);// коментарий
        //--- отправим торговый приказ
           MqlTradeResult result={0};
           OrderSend(request,result);
        }
        i++;

я уже пробовал разные варианты type_filling и type_time, но результат такой же.

Что с этим можно сделать?

Link to post
Share on other sites
sergey1294
Ладно, с этим я позже разбираться буду.

Щас возник другой вопрос: набросал на скорую руку помощника себе, проверял на форексе работает четко, перекинул на РТС пишет 2013.06.11 18:42:00 Trades '1002754': failed buy limit 1.00 RTS-6.13 at 125840 [invalid expiration]

выгладит торговый запрос так

         if (i >= total_orders)
        {
         Stop = false;
        //--- готовим запрос
           MqlTradeRequest request={0};
           request.action=TRADE_ACTION_PENDING;         // установка отложенного ордера
           request.magic=magic_number;                  // ORDER_MAGIC
           request.symbol=_Symbol;                      // инструмент
           request.volume=order_send_lot;               // объем в лот
           request.price=order_send_price;              // цена для открытия
           request.sl=0;                                // Stop Loss не указан
           request.tp=0;                                // Take Profit не указан   
           request.type=order_type;                     // тип ордера
           request.type_filling=ORDER_FILLING_RETURN;
           request.type_time=ORDER_TIME_GTC;
           //request.stoplimit=0;
           //request.expiration=D'2013.06.12';
           request.comment=IntegerToString(id_position);// коментарий
        //--- отправим торговый приказ
           MqlTradeResult result={0};
           OrderSend(request,result);
        }
        i++;

я уже пробовал разные варианты type_filling и type_time, но результат такой же.

Что с этим можно сделать?

 

Ошибка в дате экспирации отложенного ордера, обнулите //request.expiration=D'2013.06.12'; и если ошибка пропадет, значит ошибка в значении даты экспирации или нельзя задать на этом типе счета дату экспирации

Link to post
Share on other sites
TatarenkoAV
Ошибка в дате экспирации отложенного ордера, обнулите //request.expiration=D'2013.06.12'; и если ошибка пропадет, значит ошибка в значении даты экспирации или нельзя задать на этом типе счета дату экспирации

зачем обнулят закомментированный код?

во вторых, ошибка изначально была еще до того как в запросе появилась дата истечения.

Link to post
Share on other sites
tol64

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

Link to post
Share on other sites
  • 4 weeks later...
Омск

Я собираюсь изучать MQL, начать можно с темой про MQL4 или надо где-то брать руководства уже по MQL5?

Link to post
Share on other sites
Programmer
Я собираюсь изучать MQL, начать можно с темой про MQL4 или надо где-то брать руководства уже по MQL5?

 

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

 

Все зависит от того, какой терминал Вы планируете использовать для торговли: MT4 или MT5. Если без разницы, то я бы начал с изучения MQL4, т.к. он намного проще.

 

Однако, если у Вас есть опыт программирования на C++ или в других Объектно-Ориентированных языках Программирования, то можно начинать с MQL5.

 

Кирилл

Link to post
Share on other sites
  • 2 weeks later...
Омск

Чем отличаются эти терминалы? Я привык к МТ4, так что поизучаю пока MQL4.

C чего начать изучение MQL4?

Link to post
Share on other sites
Programmer
Чем отличаются эти терминалы? Я привык к МТ4, так что поизучаю пока MQL4.

C чего начать изучение MQL4?

 

Добрый день,

 

Торговые платформы отличаются кардинально. Про МТ5 можно почитать тут:

http://www.metatrader5.com/ru/trading-platform

 

Правильно делаете, что изучаете MQL4 - лучше сначала его освоить. Начать изучение языка я настоятельно советую с моего Курса MQL4, который выложен тут:

https://alpariforum.com/showthread.php?t=42059

 

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

 

Все вопросы Вы можете задавать в ветке "Общие Вопросы".

 

Кирилл

Link to post
Share on other sites
  • 3 months later...
Pavel20

Здравствуйте! Начал недавно изучать MQL5. Потрясная вещь. Начал с учебника по С++ для чайников, потом перешел на статьи. И то и другое очень помогло. В ближайшее время собираюсь переписать своего советника с mql4 на mql5.

 

Но вот в чем загвоздка: Alpari предлагает платформу уже несколько лет, а реальный счет все никак не открыть. Тогда какой резон мучиться? Многие брокеры предлагают платформу за 600 руб./мес. Почему Альпари отстает? Пусть будет хотя бы платная версия.

 

Прошу рассмотреть данный вопрос в срочном порядке. Скоро начинаю писать. :rupor:

Link to post
Share on other sites
kazakov.v
...

Прошу рассмотреть данный вопрос в срочном порядке. Скоро начинаю писать. :rupor:

 

Сейчас уже тестируется бета МТ4 с возможностями mql5.

См. форум mql4.com


Никому верить нельзя.

Мне - можно.

 

Link to post
Share on other sites
  • Capman locked this topic
Guest
This topic is now closed to further replies.
  • Recently Browsing   0 members

    No registered users viewing this page.

×
×
  • Create New...