나는 처음 두 개의 스크립트를 놓쳤다는 것을 알아차렸다. 첫 번째 New.mq5 스크립트는 주석 이 무엇인지 설명합니다. 이 대본에서는 앞서 약속한 대로 프로그래밍 학교 1학년 학생을 위한 접근 가능한 프레젠테이션에서 모든 것을 그리려고 했습니다.
안부 인사를 전합니다. 블라디미르.
//+------------------------------------------------------------------+//| New.mq5 |//| Copyright 2020, MetaQuotes Software Corp. |//| https://www.mql5.com |//+------------------------------------------------------------------+#property copyright"Copyright 2020, MetaQuotes Software Corp."#property link"https://www.mql5.com"#property version"1.00"/* Уважаемые друзья! С данного скрипта мы начинаем обучение азам программирования на языке MQL5.
Обучение основано на информации полученной из Справочника MQL5, а также много информации взято
из учебника Сергея Ковалёва, расположенного по ссылке https://book.mql4.com/ru/basics/common.
Любое обучение начинается с элементарных понятий, некоторые из них мы рассмотрим в данном скрипте.
Для начала давайте разберемся, что такое скрипт. Скрипт в переводе с английского языка означает
сценарий, т.е. текст с подробным описанием. В каждом скрипте нам придется комментировать все
действия, которые будем осуществлять при его написании.
Понятие комментария
Программа состоит из двух видов записей: тех, которые составляют собственно программу, и тех, которые
являются лишь пояснительным текстом к ней. Комментарий - это необязательная и неисполняемая часть программы.
Готовая программа будет работать в соответствии с заложенным в неё кодом независимо от того, есть в ней
комментарии или нет. Однако комментарии очень облегчают понимание кода программы.
Комментарии могут быть однострочными и многострочными.
Однострочный комментарий - это любая последовательность символов, перед которой стоят две косые черты (//).
Признак однострочного комментария заканчивается вместе с переводом строки.
Многострочный комментарий начинается символами /* и заканчивается символами */// ПРИВЕДЁМ ПРИМЕРЫ КОММЕНТАРИЕВ/* ... <-Это начало многострочного комментария,
...
...
... а конец многострочного комментария показан строчкой ниже.
*///+------------------------------------------------------------------+//| Script program start function | <-Это блок комментария о старте скрипта//+------------------------------------------------------------------+voidOnStart ()
{
//--- <-Это однострочный комментарий// <-Это однострочный комментарий
}
//+------------------------------------------------------------------+ <-Это однострочный комментарий
Vladimir Baskakov : 지난 2년 동안 이러한 지점이 여러 개 있었습니다. 모두가 열정적으로 시작했지만 한 달 만에 사라지고 주제가 사라지고 포럼 사용자가 관심을 잃었습니다.
다시 말하지만 왜 이 언어를 배우느냐는 질문에는 대답하지 않고 망각이 가지를 기다립니다.
안녕하세요 블라디미르님! 동의합니다. 그러나 지금까지 이 주제에 관심이 있는 모든 포럼 참가자에 대한 이야기는 없었습니다. 주제는 리더십을 요구하지 않습니다. 이 주제는 프로그래밍 지식이 전혀 없는 초보자가 읽고 학습 과정에 참여하기 시작할 수도 있습니다. 독학 과정에서 얻은 지식과 누구의 도움 없이 혼자 작성한 스크립트 코드로 백업한 지식을 공유합니다! 포럼 참가자들로부터 최소한의 피드백이 있을 수 있도록 스크립트를 게시합니다. 이 주제가 사라지면 이것은 이미 독학으로 얻은 지식 수준이 원하는 수준에 도달했다는 신호입니다.
New1.mq5 스크립트에서는 환영 메시지 를 인쇄 하는 방법을 고려하고 용어집을 추가했습니다. 이 대본에서는 앞서 약속한 대로 프로그래밍 학교 1학년 학생을 위한 접근 가능한 프레젠테이션에서 모든 것을 그리려고 했습니다.
안부 인사를 전합니다. 블라디미르.
//+------------------------------------------------------------------+//| New1.mq5 |//| Copyright 2020, MetaQuotes Software Corp. |//| https://www.mql5.com |//+------------------------------------------------------------------+#property copyright"Copyright 2020, MetaQuotes Software Corp."#property link"https://www.mql5.com"#property version"1.00"/* Продолжаем обучение азам программирования на языке MQL5. Чтобы посмотреть первый результат
практического применения кода скрипта, мы напишем функцию вывода на печать какого-нибудь
сообщения. Давайте, например, пожелаем всем доброго дня и хорошего настроения!
Для этого нам нужно после "void OnStart() {" указать функцию Print() и внутри двойных
круглых скобок написать приветствие, заключённое ещё и в двойные кавычки.
*/// ПИШЕМ КОД СКРИПТА//+------------------------------------------------------------------+//| Script program start function |//+------------------------------------------------------------------+voidOnStart ()
{
//---Print ( "Всем доброго дня и хорошего настроения!" );
}
//+------------------------------------------------------------------+/* Теперь сделаем некоторые пояснения, которые касаются непосредственно самого кода скрипта, а так же
где и как посмотреть результат выполнения этого кода. Начнем с того, что после блока комментария
Script program start function (что переводится, как Функция запуска скриптовой программы) мы видим
не известное нам "void OnStart()". Чтобы узнать, что же это такое, нам нужно обратиться к
Справочнику MQL5. Для этого делаем так: устанавливаем мышкой курсор на непонятное нам словосочетание
и на клавиатуре нажимаем клавишу F1 (Вызов справки). Сразу откроется небольшое подокно с
предложением выбора раздела. Оставляем всё как есть и жмём на кнопку "Показать". После того,
как откроется Справочник MQL5, мы видим с правой стороны справочника текстовое описание:
"OnStart. Функция OnStart() является обработчиком события Start, которое автоматически генерируется
только для запущенных на выполнение скриптов. Должна иметь тип void, т.к. параметров
не имеет: void OnStart();". Вот теперь мы узнали для чего нужна строка с этим кодом.
Двигаемся дальше. А дальше мы видим две фигурные скобки "{" и "}". Снова обращаемся к справочнику,
но он почему-то не даёт каких-либо определений по фигурным скобкам. Всё дело в том, что эти
фигурные скобки являются частью функции (в нашем случае функции void OnStart()). Открываем в
справочнике раздел "Функции", там находим то, что нас интересует: "Функции. Всякая задача может быть
разбита на подзадачи, каждую из которых можно либо непосредственно представить в виде кода, либо
разбить на еще более мелкие подзадачи. Данный метод называется пошаговым уточнением. Функции служат
для записи программного кода этих непосредственно решаемых подзадач. Код, описывающий, что делает
функция, называется определением функции:
заголовок_функции
{
инструкции
}
Все, что находится перед первой фигурной скобкой, составляет заголовок определения функции, а то,
что находится между фигурными скобками, является телом определения функции. Всё понятно? Отлично.
Вот теперь мы дошли до того момента, когда нужно указать нашу инструкцию (в данном случае - функцию Print,
т.е. печать), которую должен будет выполнить данный скрипт. Снова обратимся к Справочнику MQL5. Находим
раздел Print: "Print. Печатает некоторое сообщение в журнал экспертов. Параметры могут иметь любой тип".
Запомнили куда печатается сообщение? Правильно, в журнал экспертов, который находится в торговом
терминале MetaTrader 5. Давайте запомним и ещё одно уточнение: раз мы решили писать текстовое приветствие,
то этот текст нужно взять в двойные кавычки, т.е. вот так - "Всем доброго дня и хорошего настроения!".
Вот теперь всё! Открываем торговый терминал MetaTrader 5 (нажимаем клавишу на клавиатуре F4), двойным
щелчком мышки запускаем скрипт New1.mq5 и во вкладке "Эксперты" читаем наше приветствие.
*/// ОЧЕНЬ ВАЖНАЯ ИНФОРМАЦИЯ!/* В связи с тем, что при написании кодов будем постоянно применять специальные слова,
используемые в программировании, поэтому у нас под рукой всегда должен быть словарь терминов.
СЛОВАРЬ ТЕРМИНОВ (ссылка на книгу Сергея Ковалёва https://book.mql4.com/ru/appendix/glossary)
Алгоритм - точное предписание выполнить заранее определённую последовательность действий;
управление в исполняемой программе передаётся в соответствии с алгоритмом.
Бар - графическая форма представления графика развития цены. Бар характеризуется: ценой открытия (Open),
ценой закрытия (Close), максимальной ценой (High), минимальной ценой (Low), объёмом (Volume)
и временем открытия (Time) (см. также Свеча).
Буфер - область памяти, содержащая численные значения индикаторного массива.
Валютный инструмент - валютная пара, например, EUR/USD, GBP/CHF; частный случай финансового инструмента.
Внешняя переменная - переменная, значение которой доступно из окна свойств программы; обладает свойствами
глобальной переменной.
Встречный ордер - рыночный ордер, открытый в противоположном направлении по отношению к другому
рыночному ордеру по тому же финансовому инструменту.
Встроенная функция - то же, что стандартная функция.
Вызов функции (то же, что обращение к функции) - запись, исполнение которой приводит к исполнению
функции (см. также Описание функции).
Выражение - последовательность операндов и операций; запись в программе, вычисленное значение которой
характеризуется типом данных.
Глобальная переменная - переменная, объявленная за пределами всех функций. Областью видимости
глобальных переменных является вся программа.
Глобальная переменная клиентского терминала - переменная, значение которой доступно из всех прикладных
программ, запущенных на клиентском терминале (сокращённо - GV-переменная).
Графический объект - изображение в окне финансового инструмента, которое можно выделить, переместить,
изменить или удалить.
Двухсторонняя котировка - связанная пара рыночных цен, предлагаемых брокером для осуществления покупки
и продажи активов по финансовому инструменту в текущий момент.
Заголовок функции - составная часть описания функции; состоит из указания типа возвращаемого значения,
названия функции и списка формальных параметров. Список формальных параметров заключается в круглые скобки
и располагается после названия.
Зацикливание - бесконечное повторяющееся выполнение операторов, составляющих тело цикла; критическая
ситуация, возникающая в результате реализации ошибочного алгоритма.
Знак операции - предопределённый символ или группа символов, предписывающих выполнить некоторую операцию.
Идентификатор переменной - набор символов, состоящий из букв, цифр и знака подчеркивания, начинающийся
с буквы, длиной не более 31 символа. То же, что Имя переменной и Название переменной.
Имя переменной - то же, что идентификатор переменной.
Индикатор - встроенная функция клиентского терминала или программа, составленная на языке MQL4;
основным назначением индикаторов является отображение на экране индикаторных линий; у индикаторов
отсутствует возможность осуществления торговых операций; различают пользовательские и технические индикаторы
(см. также эксперт, советник и скрипт).
Индикаторная линия - графическое отображение на экране некоторой зависимости, построенной на основе
численных значений, содержащихся в индикаторном массиве.
Индикаторный массив - одномерный массив, содержащий численные значения, в соответствии с которыми строится
индикаторная линия.
Инициализация переменной - присвоение переменной значения, соответствующего её типу,
при объявлении переменной.
Итерация - повторное выполнение некоторых вычислений; используется для обозначения факта исполнения
программных строк, составляющих тело оператора цикла (см. Оператор цикла while и Оператор цикла for).
Комментарий - необязательная и неисполняемая часть программы.
Константа - составная часть программы; объект, имеющий значение.
Константное выражение - выражение, состоящее из констант и операций, например: 2+3*7 .
Константное выражение вычисляется на этапе компиляции программы.
Локальная переменная - переменная, объявленная внутри какой-либо функции. Областью видимости локальных
переменных является тело функции, в которой эта переменная объявлена.
Локальное время - время, установленное на локальном компьютере (см. также серверное время).
Массив - упорядоченный набор значений однотипных переменных, имеющих общее название. Различают одномерный
и многомерный массивы. Максимально допустимое количество измерений в массиве - четыре.
Допускаются массивы любых типов данных.
Название переменной - то же, что идентификатор переменной.
Нулевой бар - текущий бар, который ещё полностью не сформировался. В окне финансового инструмента
нулевой бар отражается в крайней правой позиции.
Нормализованная цена - цена, округлённая с точностью до размера одного пункта по финансовому инструменту.
Нормальный выход из цикла - передача управления за пределы оператора цикла в результате исполнения
условия, содержащегося в заголовке оператора цикла (см. также специальный выход из цикла).
Область видимости переменной - место в программе, в котором доступно значение переменной. Каждая
переменная имеет свою область видимости (см. также локальная переменная и глобальная переменная).
Обращение к функции - то же, что Вызов функции.
Объявление переменной - первое упоминание переменной в программе. При объявлении переменной указывается её тип.
Операнд - константа, переменная, элемент массива или значение, возвращаемое функцией константа, переменная,
элемент массива или значение, возвращаемое функцией (см. Вызов функции).
Оператор - составная часть программы; фраза алгоритмического языка, предписывающая определённый порядок
преобразования информации. Различают простые и составные операторы.
Операция - действие, производимое над операндами (см. также знак операции).
Описание функции - именованная, обособленная часть программы, предназначенная для исполнения; состоит из
двух основных частей - заголовка функции и тела функции; используется применительно к специальным и
пользовательским функциям (см. Функции, Описание функции и оператор return и Специальные функции).
Отложенный ордер - торговый приказ на покупку или продажу активов по финансовому инструменту при достижении
заданного значения цены. Отложенный ордер отражается в окне финансового инструмента и в окне "Терминал" до
тех пор, пока он не преобразуется в рыночный ордер либо будет удалён (см. также рыночный ордер).
Переменная - составная часть программы; объект, имеющий название и значение.
Пользовательская функция - функция, созданная программистом (см. Функция).
Пользовательский индикатор - прикладная программа, составленная на языке MQL4 и MQL5, основным назначением
которой является графическое отображение на экране рассчитанных зависимостей. Значения элементов индикаторных
массивов пользовательского индикатора доступны другим прикладным программам через функцию iCustom()
(см. также технический индикатор).
Предопределённая переменная - переменная с предопределённым названием, значение которой определяется
клиентским терминалом и не может быть изменено программным способом (см. Предопределённые переменные).
Приведение типов - изменение (преобразование) типа значения операнда или выражения. Перед выполнением операций
(кроме операций присваивания) происходит преобразование в тип, имеющий наибольший приоритет, а перед
операциями присваивания - в целевой тип.
Прикладная программа - программа, написанная на языке MQL4 и MQL5, используемая в клиентских терминалах
MetaTrader 4 и MetaTrader 5; эксперт, скрипт или индикатор.
Пункт - единица измерения цены по финансовому инструменту (минимально возможное изменение цены,
последняя значащая цифра в значении цены).
Рыночный ордер - исполненный приказ на покупку или продажу активов по финансовому инструменту.
Рыночный ордер отображается в окне финансового инструмента и в окне "Терминал" до тех пор, пока
не выполнен приказ на закрытие ордера (см. также отложенный ордер).
Свеча - графическая форма представления графика развития цены. Свеча характеризуется:
ценой открытия (Open), ценой закрытия (Close), максимальной ценой (High), минимальной ценой (Low),
объёмом (Volume) и временем открытия (Time). Различают чёрные и белые свечи (см. также бар).
Серверное время - время, установленное на сервере (см. также локальное время).
Скрипт - программа, составленная на языке MQL4 и MQL5; отличается свойствами специальной функции start(),
вызываемой клиентским терминалом для исполнения один раз; назначением скриптов является выполнение
любых операций, которые по их смыслу требуется выполнить один раз (см. также эксперт, советник и индикатор).
Советник - то же, что эксперт (см. также скрипт и индикатор).
Специальная функция - функция, имеющая одно из предопределённых имён (init(), start() и deinit())
вызываемая для исполнения клиентским терминалом и обладающая специальными собственными свойствами
(см. специальные функции).
Специальный выход из цикла - передача управления за пределы оператора цикла в результате исполнения
оператора break, содержащегося в теле оператора цикла (см. также нормальный выход из цикла).
Спред - разница между большей и меньшей ценой в двухсторонней котировке по финансовому инструменту,
выраженная в пунктах.
Стандартная функция - то же, что Встроенная функция; функция, созданная разработчиками языка MQL4,
имеющая предопределённое имя и свойства; описание стандартных функций в программе не указывается;
свойства стандартных функций подробно описаны в справочной документации (см. Функции и Стандартные функции ).
Массив-таймсерия - массив с предопределённым названием (Open, Close, High, Low, Volume или Time),
элементы которого содержат значения соответствующих характеристик исторических баров.
Таймфрейм - период времени, в течение которого формируется один ценовой бар; различают стандартные
таймфреймы: М1, М5, М15, М30, Н1, Н4, D1, W1 и MN (1 мин, 5 мин, 15 мин, 30 мин, 1 час, 4 часа, 1 день,
1 неделя и 1 месяц, соответственно)
Тело функции - один или несколько операторов, являющих исполняемую часть описания функции.
Тело цикла - один или несколько операторов, обрамлённых фигурными скобками; располагается непосредственно
после заголовка оператора цикла (см. Оператор цикла while и Оператор цикла for).
Технический индикатор - составная часть информационно-торговой системы MetaTrader 4, встроенная функция,
позволяющая графически отображать на экране определённую зависимость (см. также пользовательский индикатор).
Тик - событие, характеризующееся новой ценой по финансовому инструменту в некоторый момент времени.
Торговая операция - открытие, закрытие или модификации рыночных и отложенных ордеров.
Торговый приказ - приказ, сформированный программой или трейдером с целью осуществления торговой операции.
Торговый приказ может быть исполнен на сервере и отклонён сервером или клиентским терминалом.
Трейдер - человек, который занимается торговлей на финансовых рынках с целью получения прибыли.
Управление - процесс выполнения действий, предопределённых алгоритмом программы и свойствами
клиентского терминала. Управление может передаваться внутри программы от одной программной строки к другой,
а также между программой и клиентским терминалом (см. Некоторые основные понятия).
Файловый описатель – уникальный номер файла, открытого исполняемой программой в текущий момент.
Файловый разделитель - специальный символ; запись, которая заносится в файл для разделения записей данных.
Файловый указатель - место в файле, с которого начинается чтение следующего значения. По мере прочтения
данных файловый указатель смещается вправо на одну или несколько позиций.
Финансовый инструмент - название котируемого объекта.
Флаг - переменная, значение которой ставится в соответствие каким-либо событиям или фактам.
Формальные параметры - список переменных, указанных в заголовке описания функции (см. Функции и Описание
функции и оператор return).
Формат оператора - набор правил форматирования, присущих виду оператора. Каждый вид оператора имеет
свой формат (см. Операторы).
Функция - именованная, обособленная часть программы, описывающая порядок преобразования информации.
Использование функции в программе предполагает наличие описания функции и вызова функции.
Различают специальные, стандартные (встроенные) и пользовательские функции
(см. Функции и Специальные функции ).
Эксперт - программа, составленная на языке MQL4 и MQL5; отличается свойствами специальной функции start(),
вызываемой клиентским терминалом для исполнения на каждом тике; основным назначением экспертов
является программное управление торговыми операциями (см. также советник, скрипт и индикатор).
Элемент массива - составная часть массива; индексированная переменная с одноимённым названием,
имеющая некоторое значение.
Ask - большая из цен в двухсторонней котировке по финансовому инструменту, предлагаемая брокером.
Bid - меньшая из цен в двухсторонней котировке по финансовому инструменту, предлагаемая брокером.
Buy - рыночный ордер, определяющий покупку активов по финансовому инструменту.
BuyLimit - отложенный ордер на покупку активов по финансовому инструменту по цене ниже текущей.
Ордер исполнится (преобразуется в рыночный ордер Buy), если цена Ask достигнет или окажется ниже
цены, заявленной в ордере.
BuyStop - отложенный ордер на покупку активов по финансовому инструменту по цене, превышающей
текущую цену. Ордер исполнится (преобразуется в рыночный ордер Buy), если цена Ask достигнет или
окажется выше цены, заявленной в ордере.
GV-переменная - то же, что глобальная переменная клиентского терминала.
Sell - рыночный ордер, определяющий продажу активов по финансовому инструменту.
SellLimit - отложенный ордер на продажу активов по финансовому инструменту по цене, превышающей
текущую цену. Ордер исполнится (преобразуется в рыночный ордер Sell), если цена Bid достигнет или
окажется выше цены, заявленной в ордере.
SellStop - отложенный ордер на продажу активов по финансовому инструменту по цене ниже текущей.
Ордер исполнится (преобразуется в рыночный ордер Sell), если цена Bid достигнет или окажется
ниже цены, заявленной в ордере.
StopLoss - стоп-приказ; заявленная цена, по которой рыночный ордер будет закрыт при движении
цены финансового инструмента в сторону убытков по ордеру.
TakeProfit - стоп-приказ; заявленная цена, по которой рыночный ордер будет закрыт при движении
цены финансового инструмента в сторону прибыли по ордеру.
*/
//+------------------------------------------------------------------+//| New6.mq5 |//| Copyright 2020, MetaQuotes Software Corp. |//| https://www.mql5.com |//+------------------------------------------------------------------+#property copyright"Copyright 2020, MetaQuotes Software Corp."#property link"https://www.mql5.com"#property version"1.00"//---#property script_show_inputs//---/* Продолжим изучение языка программирования MQL5. На этот раз мы напишем код скрипта,
который будет устанавливать на текущем графике сразу по одному отложенному ордеру BuyStop
и SellStop с фиксированным размером лота на некотором расстоянии от текущей цены.
Если кто-то подзабыл, что это за ордера, то у нас всегда есть под рукой словарь терминов,
написанный в скрипте New1.mq5, который поможет освежить память. Чтобы задавать входные
параметры скрипта снова воспользуемся модификатором input. Мы это уже делали в предыдущем
скрипте New5.mq5. Но, прежде всего, в шаблоне скрипта мы должны прописать свойство
"script_show_inputs" (дословный перевод - показать входы скрипта), иначе мы не сможем
менять входные параметры в момент его запуска. Итак, начнем!
*/
내일 저는 앞서 약속한 대로 프로그래밍 학교 1학년 학생을 위한 접근 가능한 프레젠테이션에서 모든 것을 설명하고 스크립트의 전체 코드를 공개적으로 표시하려고 노력할 것입니다.
Описание настроек скрипта: FixedLot - объем лота каждого ордера. TakeProfit - тейк-профит каждого ордера. Стоп-лосс не используется. Добавить не трудно. Grid_step - шаг сетки в пунктах. Значение для брокеров с пятизначными котировками. N_orders - количество ордеров в одном направлении Distance - отступ в пунктах от текущей цены. Первые ордера в...
나는 새로운 스크립트 New6.mq5를 게시하고 있습니다. 이것은 현재 가격에서 특정 거리에 고정 로트 크기로 한 번에 하나의 BuyStop 및 SellStop 보류 중인 주문을 현재 차트에 배치하는 데 도움이 됩니다. 이 대본에서는 앞서 약속한 대로 프로그래밍 학교 1학년 학생을 위한 접근 가능한 프레젠테이션에서 모든 것을 그리려고 했습니다.
//+------------------------------------------------------------------+//| New6.mq5 |//| Copyright 2020, MetaQuotes Software Corp. |//| https://www.mql5.com |//+------------------------------------------------------------------+#property copyright"Copyright 2020, MetaQuotes Software Corp."#property link"https://www.mql5.com"#property version"1.00"//---#property script_show_inputs//---/* Продолжим изучение языка программирования MQL5. На этот раз мы напишем код скрипта,
который будет устанавливать на текущем графике сразу по одному отложенному ордеру Buy Stop
и Sell Stop с фиксированным размером лота на некотором расстоянии от текущей цены.
Если кто-то подзабыл, что это за ордера, то у нас всегда есть под рукой словарь терминов,
написанный в скрипте New1.mq5, который поможет освежить память. Чтобы задавать входные
параметры скрипта снова воспользуемся модификатором input. Мы это уже делали в предыдущем
скрипте New5.mq5. Но, прежде всего, в шаблоне скрипта мы должны прописать свойство
"script_show_inputs" (дословный перевод - показать входы скрипта), иначе мы не сможем
изменять входные параметры в момент его запуска. Итак, начнем!*//* Сначала создадим для работы скрипта входные переменные Distance, Lots и Pending_magic.*/inputint Distance= 100 ; //Отступ отложенного ордера от текущей ценыinputdouble Lots= 0.01 ; //Фиксированный размер лотаinputlong Pending_magic= 86513 ; //Магический номер ордера//+------------------------------------------------------------------+//| Script program start function |//+------------------------------------------------------------------+/* Чтобы запустить скрипт в работу напишем функцию "Старт".*/voidOnStart ()
{
/* Далее. Для того, чтобы установить один или сразу несколько торговых ордеров сперва
необходимо наладить взаимодействие между клиентским терминалом, который установлен
на нашем компьютере и торговым сервером, который находится у форекс-дилера.
Проведение всех операций по установке торговых ордеров производится посредством торговых
запросов. Сначала мы сделаем запрос на торговый сервер специальной предопределенной
структурой MqlTradeRequest. Эта структура содержит все поля, необходимые для заключения
торговых сделок. Пишем код для торгового запроса:*/MqlTradeRequest request={ 0 };
/* request={0} - здесь мы создаем переменную, в которой будут находится все сведения о запросе.*//* После того, как торговый сервер обработает торговый запрос, мы получим от него ответ.
Результат обработки торгового запроса представлен структурой MqlTradeResult.
Пишем код для получения результата обработки торгового запроса:*/MqlTradeResult result={ 0 };
/* result={0} - здесь мы создаем переменную, в которой будут находится все сведения о результатах запроса.*//* Далее необходимо указать все параметры необходимые для установки отложенного ордера. Во-первых, в коде
скрипта запишем request.action, т.к. мы сначала запрашиваем действие, а потом указываем какое именно
действие нужно совершить: TRADE_ACTION_PENDING - установить торговый ордер на совершение сделки
при определенных условиях, т.е. установить отложенный ордер.*/
request.action= TRADE_ACTION_PENDING ;
/* Во-вторых, в запросе укажем символ текущего графика.*/
request.symbol= Symbol ();
/* В-третьих, в запросе укажем объём фиксированного лота, который прописан во входных параметрах скрипта.*/
request.volume=Lots;
/* В-четвёртых, в запросе укажем допустимое отклонение от цены.*/
request.deviation= 2 ;
/* В-пятых, в запросе укажем магический номер ордера, который прописан во входных параметрах скрипта.*/
request.magic=Pending_magic;
/* Теперь нужно создать переменную price (цена срабатывания ордера) и присвоить ей тип значения,
имеющего дробную часть, т.е. double.*/double price;
/* Дальше создадим переменную point и сразу же присвоим ей возврат соответствующего свойства
SymbolInfoDouble для указанного символа _Symbol, а именно SYMBOL_POINT (т.е. размер одного пункта),
при этом добавим в начале кода, что тип значения имеет дробную часть, т.е. double.*/double point= SymbolInfoDouble ( _Symbol , SYMBOL_POINT );
/* На следующем шаге создадим переменную digits и сразу же присвоим ей возврат соответствующего свойства
SymbolInfoInteger для указанного символа _Symbol, а именно SYMBOL_DIGITS (т.е. количество знаков после
запятой), при этом добавим в начале кода, что тип значения будет int. Перед SymbolInfoInteger также нужно
добавить тип значения int, т.к. в противном случае после компиляции скрипта появится предупреждение:
"возможная потеря данных из-за преобразования типа".*/int digits=( int ) SymbolInfoInteger ( _Symbol , SYMBOL_DIGITS );
/* Далее:
1. отправляем на торговый сервер запрос request.type типа ордера ORDER_TYPE_BUY_STOP (отложенный
ордер Buy Stop);
2. присваиваем переменной price возврат соответствующего свойства SymbolInfoDouble для указанного
символа Symbol(), а именно SYMBOL_ASK (лучшее предложение на покупку), прибавив отступ (Distance)
умноженный на размер одного пункта (point).
3. отправляем на торговый сервер ещё один запрос request.price для нормализации цены NormalizeDouble
до необходимого количества знаков после запятой.*/
{
request.type= ORDER_TYPE_BUY_STOP ;
price= SymbolInfoDouble ( Symbol (), SYMBOL_ASK )+Distance*point;
request.price= NormalizeDouble (price,digits);
}
/* Движемся дальше. После отправки запросов на торговый сервер нам необходимо узнать о том, что был
установлен отложенный ордер или нет. Для это применим функцию OrderSend, которая предназначена для
совершения торговых операций через отправку запросов на торговый сервер. Если отправить запрос
не удалось !OrderSend (восклицательный знак перед любой функцией означает отрицательный результат её
выполнения), то тогда выводим сообщение с кодом ошибки в заданном формате: "OrderSend error %d"
и GetLastError(). Давайте разберемся, что такое "OrderSend error %d" и что такое GetLastError().
Обратите внимание на то, что "OrderSend error %d" взят в двойные кавычки. Это означает, что будет
выведен текст с дословным переводом "Ошибка отправки заказа %d". Теперь давайте поймём, что означает
%d. В Справочнике MQL5 в разделе PrintFormat находим: "Если за строкой формата следуют еще параметры,
то эта строка должна содержать спецификации формата, определяющие формат вывода этих параметров.
Спецификация формата всегда начинается с символа знака процента (%)". А что такое d? В том же разделе
чуть ниже находим: "Тип d - Знаковое десятичное целое". С этим разобрались, осталось понять, что такое
GetLastError(). Снова ищем в справочнике: "GetLastError() возвращает содержимое системной переменной
_LastError, т.е. той переменной, в которой хранится значение последней ошибки, произошедшей во время
исполнения mql5-программы".*/if (! OrderSend (request,result))
PrintFormat ( "OrderSend error %d" , GetLastError ());
/* Выше мы написали код о том, если не удалось отправить запрос !OrderSend. Сейчас мы напишем код о том,
что выведем в сообщении о результатах операции при удачной отправке запроса. Воспользуемся всё той же
функцией PrintFormat. После открытия скобки в двойных кавычках перчисляем всё, что мы хотим вывести в
сообщении: 1. retcode (код возврата торгового сервера); 2. deal (сделка); 3. order (ордер) и сразу
задаем каждому значению тип параметра: %u - int и %I64u - ulong. Кроме того, мы должны указать
результат ответа торгового сервера по result.retcode (результат кода возврата торгового сервера),
result.deal (результат сделки) и result.order (результат ордера).*/PrintFormat ( "retcode=%u deal=%I64u order=%I64u" ,result.retcode,result.deal,result.order);
/* Снова:
1. отправляем на торговый сервер запрос request.type типа ордера ORDER_TYPE_SELL_STOP (отложенный
ордер Sell Stop);
2. присваиваем переменной price возврат соответствующего свойства SymbolInfoDouble для указанного
символа Symbol(), а именно SYMBOL_BID (лучшее предложение на продажу), вычтя отступ (Distance)
умноженный на размер одного пункта (point).
3. отправляем на торговый сервер ещё один запрос request.price для нормализации цены NormalizeDouble
до необходимого количества знаков после запятой.*/
{
request.type= ORDER_TYPE_SELL_STOP ;
price= SymbolInfoDouble ( Symbol (), SYMBOL_BID )-Distance*point;
request.price= NormalizeDouble (price,digits);
}
/* Опять после отправки запросов на торговый сервер нам необходимо узнать о том, что был установлен
отложенный ордер или нет. Для это применим функцию OrderSend, которая предназначена для
совершения торговых операций через отправку запросов на торговый сервер. Если отправить запрос
не удалось !OrderSend (восклицательный знак перед любой функцией означает отрицательный результат её
выполнения), то тогда выводим сообщение с кодом ошибки в заданном формате: "OrderSend error %d"
и GetLastError().*/if (! OrderSend (request,result))
PrintFormat ( "OrderSend error %d" , GetLastError ());
/* Ранее мы уже написали код о том, если не удалось отправить запрос !OrderSend. Сейчас мы напишем код о том,
что выведем в сообщении о результатах операции при удачной отправке запроса. Воспользуемся всё той же
функцией PrintFormat. После открытия скобки в двойных кавычках перчисляем всё, что мы хотим вывести в
сообщении: 1. retcode (код возврата торгового сервера); 2. deal (сделка); 3. order (ордер) и сразу
задаем каждому значению тип параметра: %u - int и %I64u - ulong. Кроме того, мы должны указать
результат ответа торгового сервера по result.retcode (результат кода возврата торгового сервера),
result.deal (результат сделки) и result.order (результат ордера).*/PrintFormat ( "retcode=%u deal=%I64u order=%I64u" ,result.retcode,result.deal,result.order);
}
/* Всё! Наш новый скрипт готов. Компилируем и запускаем скрипт. Как компилировать и запускать скрипт мы
уже узнали, когда создавали скрипт New2.mq5.*///+------------------------------------------------------------------+
나는 처음 두 개의 스크립트를 놓쳤다는 것을 알아차렸다. 첫 번째 New.mq5 스크립트는 주석 이 무엇인지 설명합니다. 이 대본에서는 앞서 약속한 대로 프로그래밍 학교 1학년 학생을 위한 접근 가능한 프레젠테이션에서 모든 것을 그리려고 했습니다.
안부 인사를 전합니다. 블라디미르.
... 청년을 혼동하지 마십시오)
청년에게 감사합니다! 아주 진지하게 말해요 - 나는 정말로 젊음을 느끼고 싶어요!
안부 인사를 전합니다. 블라디미르.
지난 2년 동안 이러한 지점이 여러 개 있었습니다. 모두가 열정적으로 시작했지만 한 달 만에 사라지고 주제가 사라지고 포럼 사용자가 관심을 잃었습니다.
안녕하세요 블라디미르님! 동의합니다. 그러나 지금까지 이 주제에 관심이 있는 모든 포럼 참가자에 대한 이야기는 없었습니다. 주제는 리더십을 요구하지 않습니다. 이 주제는 프로그래밍 지식이 전혀 없는 초보자가 읽고 학습 과정에 참여하기 시작할 수도 있습니다. 독학 과정에서 얻은 지식과 누구의 도움 없이 혼자 작성한 스크립트 코드로 백업한 지식을 공유합니다! 포럼 참가자들로부터 최소한의 피드백이 있을 수 있도록 스크립트를 게시합니다. 이 주제가 사라지면 이것은 이미 독학으로 얻은 지식 수준이 원하는 수준에 도달했다는 신호입니다.
경험 많은 프로그래머가 제안하고 조언하는 내용을 메모합니다. 당신의 관점을 존중합니다!
안부 인사를 전합니다. 블라디미르.
New1.mq5 스크립트에서는 환영 메시지 를 인쇄 하는 방법을 고려하고 용어집을 추가했습니다. 이 대본에서는 앞서 약속한 대로 프로그래밍 학교 1학년 학생을 위한 접근 가능한 프레젠테이션에서 모든 것을 그리려고 했습니다.
안부 인사를 전합니다. 블라디미르.
새 스크립트에 대한 코드 작성을 마쳤습니다. 다음은 그의 설명입니다.
내일 저는 앞서 약속한 대로 프로그래밍 학교 1학년 학생을 위한 접근 가능한 프레젠테이션에서 모든 것을 설명하고 스크립트의 전체 코드를 공개적으로 표시하려고 노력할 것입니다.
안부 인사를 전합니다. 블라디미르.
새 스크립트에 대한 코드 작성을 마쳤습니다. 다음은 그의 설명입니다.
내일 저는 앞서 약속한 대로 프로그래밍 학교 1학년 학생을 위한 접근 가능한 프레젠테이션에서 모든 것을 설명하고 스크립트의 전체 코드를 공개적으로 표시하려고 노력할 것입니다.
안부 인사를 전합니다. 블라디미르.
여기에서 예를 들 수 있습니다 - 빠른 이해를 위해
https://www.mql5.com/ru/code/30709
여기에서 예를 들 수 있습니다 - 빠른 이해를 위해
https://www.mql5.com/ru/code/30709
예를 들어 주셔서 감사합니다.
안부 인사를 전합니다. 블라디미르.
모두 좋은 저녁이고 좋은 분위기입니다!
나는 새로운 스크립트 New6.mq5를 게시하고 있습니다. 이것은 현재 가격에서 특정 거리에 고정 로트 크기로 한 번에 하나의 BuyStop 및 SellStop 보류 중인 주문을 현재 차트에 배치하는 데 도움이 됩니다. 이 대본에서는 앞서 약속한 대로 프로그래밍 학교 1학년 학생을 위한 접근 가능한 프레젠테이션에서 모든 것을 그리려고 했습니다.
스크립트를 작성할 때 MQL5 Reference 에서 가져온 정보만 사용했습니다!
안부 인사를 전합니다. 블라디미르.
앞으로는 독학 계획에 따라 다음과 같이 스크립트의 단계적 수정을 수행하는 것이 과제입니다.