Бета версия онлайновой книги по программированию на MQL4 - автор Сергей Ковалев (SK.) - страница 3

 
Climber:
Неделю назад впервые установил и попробовал в работе Meta Trader. Оказалось что этот терминал намного удобнее ранее использованных мной (Румус и Форекс Трейдер). Еще года два назад, когда я узнал про форекс и открыл свой первый демосчёт, меня мучал вопрос, как это всё автоматизировать. Тут открыв терминал, я увидел в разделе почта сообщение Автотрейдинг. И вот я тут))) Интенсивно читаю книгу и надеюсь, что в ближайшее время я напишу свой первый эксперт по своей сложившейся стратегии. Раньше с программированием абсолютно никак не был связан, даже тяжело было представить, что я когда-либо буду изучать программирование))) По ходу чтения возникали вопросы, но они так же исчезали по ходу. Вопрос появился, посмотрел наперёд и остался доволен, т. к. через пару разделов я увидел ответ, вернулся назад чтоб по порядку всё прочитать. Особенно меня привлекла возможность тестирования стратегии на исторических данных и в результате корректировать стратегию.
Вобщем большое спасибо за книгу.


Замечательно. Вы - новый пользователь МТ. И на текущий момент практически ничего не знаете о программировании.

Разрешите Вам предложить: сообщать хотя бы 2 - 3 раза в месяц как у Вас продвигаются дела (а по желанию можно и чаще). Это было бы чрезвычайно интересно.

А пока, если позволите, у меня вопрос. Вот, Вы говорите, что возник вопрос, на который Вы нашли ответ в следующих разделах. Я старался составить текст так, чтобы не допускать такой ситуации. Не могли бы Вы прояснить, о каком вопросе идёт речь?

 
SK. писал (а):
Climber:
Неделю назад впервые установил и попробовал в работе Meta Trader. Оказалось что этот терминал намного удобнее ранее использованных мной (Румус и Форекс Трейдер). Еще года два назад, когда я узнал про форекс и открыл свой первый демосчёт, меня мучал вопрос, как это всё автоматизировать. Тут открыв терминал, я увидел в разделе почта сообщение Автотрейдинг. И вот я тут))) Интенсивно читаю книгу и надеюсь, что в ближайшее время я напишу свой первый эксперт по своей сложившейся стратегии. Раньше с программированием абсолютно никак не был связан, даже тяжело было представить, что я когда-либо буду изучать программирование))) По ходу чтения возникали вопросы, но они так же исчезали по ходу. Вопрос появился, посмотрел наперёд и остался доволен, т. к. через пару разделов я увидел ответ, вернулся назад чтоб по порядку всё прочитать. Особенно меня привлекла возможность тестирования стратегии на исторических данных и в результате корректировать стратегию.
Вобщем большое спасибо за книгу.


Замечательно. Вы - новый пользователь МТ. И на текущий момент практически ничего не знаете о программировании.

Разрешите Вам предложить: сообщать хотя бы 2 - 3 раза в месяц как у Вас продвигаются дела (а по желанию можно и чаще). Это было бы чрезвычайно интересно.

А пока, если позволите, у меня вопрос. Вот, Вы говорите, что возник вопрос, на который Вы нашли ответ в следующих разделах. Я старался составить текст так, чтобы не допускать такой ситуации. Не могли бы Вы прояснить, о каком вопросе идёт речь?

Когда-то я пользовался для облегчения своей работы программой Sign of Misery, в которой можно написать программу, не зная программирования. Там просто необходимо было указывать действия в порядке их выполнения (в основном я использовал его как автоматизатор, хотя возможностей намного больше). У меня допустим в экселе было много значений в 4х столбцах (данные по электроразведке из геофизики, через каждые 20 см). Для дальнейшей обработки этих данных мне надо было брать данные только с метров (т. е. с 0, 1, 2, 3, 4 ....). Я делал в этой программе автоматизатор действий, командами эмуляций клавиш и изменения координат мыши. Компилировал в ехе. Но это лирическое отступление. В этой программе ингода приходилось делать метки и устанавливать условия переходов к этим меткам, т. е. производить цикл операций, с условием выхода из этого цикла. Придя к вопросу о построении эксперта, я представлял себе общий вид структуры кода. Но начав читать книгу меня немного смутила структура построения программы и потом функция int start (), которая повторяется при каждом тике, при этом если во время её выполнения я узнал цену bid, то она записывается в переменную и хранится в ней всё время выполнения, тогда как я узнаю когда цена изменилась и программа может выполнять какие-либо другие действия, основанные на новой цене? Я думал что цену у меня в программе будет обновлять код какого-то цикла, постоянно её запрашивая. Вопрос у меня возник ещё такой: при вызове функции и её выполнении я себе представлял что далее выполняться будет следующая за ней функция, а оказалось что управление возвращается к фунции, следующей за той что вызывала первоначально указанную функцию. Но этот факт меня особо обрадовал, т. к. это для меня стало ясным (ато я думал, а как же остальные действия, которые шли за этой функцией, они что таким образом пропускаются?). Теперь у меня возник вопрос такого плана: я понял что при исполнении функции init у меня будет вызываться функция подсчёта устраиваемой меня цены открытия ордера, а также подсчёт размера лота, исходя из данных балланса на счёте; после её завершения начнётся исполнение ф-ции start, в которой у меня будет содержаться код "ожидания" нужной цены сделки, и как только она наступит, будет выполнено открытие ордера (тейк профиты не предполагал ставить из-за того что если будет скачок который перепрыгнет значение ТР, то он не сработает, а скачок этот потенциально выгоднее значения ТР, поэтому хочу чтоб формироваля приказ о закрытии ордера по последней известной цене, когда текущая цена или равна, или <, или > указанной) ; далее самое для меня пока загадочное, это где мне писать код ожидания цены "закрытия" ордера и возврат к началу, т. е. опять подсчёт устраиваемой цены для открытия, ожидание этой цены и т. д. Заглянул наперёд в разделы, вроде что-то увидел в названиях, т. е. вроде будет ответ на этот мой вопрос. Пока дочитываю читаю раздел Открытие и установка ордеров. Начал читать вчера утром.
Сообщать продвижение дел конечно буду, как в моём положении и без общения)) Надеюсь на конструктивное общение.
Спасибо за внимание.
 

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

Climber:
Но начав читать книгу меня немного смутила структура построения программы и потом функция int start (), которая повторяется при каждом тике, при этом если во время её выполнения я узнал цену bid, то она записывается в переменную и хранится в ней всё время выполнения, тогда как я узнаю когда цена изменилась и программа может выполнять какие-либо другие действия, основанные на новой цене? Я думал что цену у меня в программе будет обновлять код какого-то цикла, постоянно её запрашивая.

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

Действительно, существует 2 способа:

1й способ состоит в том, чтобы запустить в бесконечном цикле какую-то функцию и из неё периодически запрашивать цену.
Но такой способ имеет недостатки:
- если запросы делать часто, то в результате сильно перегружается канал связи и тратятся ресурсы ПК;
- если запросы делать редко, то есть верочтность пропустить новую цену между запросами.

2й способ (принят как основной в MQ-технологии) принципиально отличается тем, что инициатива запуска нужного кода принадлежит терминалу. Терминал получает сведения от сервера, понимает, что пришёл новый тик (факт новой цены и сама цена), и на этом основании терминал запускает функцию start(). Всё это изложено в разделе Программа на MQL4.

Climber:
Теперь у меня возник вопрос такого плана: я понял что при исполнении функции init у меня будет вызываться функция подсчёта устраиваемой меня цены открытия ордера, а также подсчёт размера лота, исходя из данных балланса на счёте; после её завершения начнётся исполнение ф-ции start..

Неправильно. init() и start() - это специальные функции. Они вызываются клиентским терминалом в соответствии со своими собственными свойствами (а проще говоря в соответствии с правилами, условиями, при которых они вызываются для исполнения). Об этом написано в параграфе Специальные функции . Функция init() исполняется один раз, при загрузке программы в окно. А start() вызывается на каждом тике. Это очень удобно. Пришёл тик, принёс новую цену = терминал запускает на исполнение start(), которая и исполняется пока не исполнится. Вот в неё и надо вставить все расчёты - и вычисление количества лотов, и условия открытия/закрытия ордеров и всё другое.

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

Судя по тому, какие вопросы у Вас возникают, Вам пока не надо писать программы и читать то, что Вы сейчас читаете, тоже не нужно. В этой ситуации настоятельно рекомендуется начать читать книгу сначала. Последовательно и без забегания вперёд. А по ходу дела все представленные примеры собственноручно набирать в МЕ и исполнять на своём ПК. И не переходить к следующему разделу до тех пор, пока не будет достигнута полная ясность по каждой букве кода. Помотрите понятия Тик, Управление, Функция, Специальная функция, Оператор и вообще время от времени заглядывайте в Словарь терминов.

Climber:
Сообщать продвижение дел конечно буду, как в моём положении и без общения)) Надеюсь на конструктивное общение.
Спасибо за внимание.

Надеюсь, что Вы правильно воспримете совет и последуете ему.

 
SK. писал (а):

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

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

Ух, по моему до меня дошла стуктура эксперта.
Быстро накрапал в ворде, вот:

Init

Start

Устанавливаю максимальное количество открытых ордеров = 1;

проверяю сколько открыто ордеров;

если 1 открыт, то вызываю функцию закрытия ордера,

если не открыто ни одного, вызываю функцию «расчёт цены и кол-во лотов»

--------------------------

Необходимые расчеты выгодной цены покупки и продажи и расчет количества лотов;

--------------------------

запрос текущей цены;

если текущая >= выгодной цене для продажи,

то открыть ордер продажи равный количеству уже определённых лотов;

если нет, то сравнить текущую с выгодной ценой покупки;

ели текущая <= выгодной цене покупки,

то соответственно открыть ордер покупки;

--------------------------

вызов функции закрытия ордера;

return

deinit


Правильно понял?
 
Climber:
Правильно понял?

Ну, в целом правильно:) Поздравляю Вас. Это всегда приятно - ещё что-то понять.

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

 
Parabellum:

В книге приводится интересный индикатор ROC - индикатор скорости изменения цены (https://book.mql4.com/ru/samples/iroc). Я понимаю, что эта книга - учебник, и автор не обязан давать ни полу-, ни даже четверть-граальные исходники, но идея индикатора уж больно хороша, и я слегка подшаманил, чтобы запаздывание было ещё слабее.

Кстати, текст индикатора опубликованный на самой странице имеет две опечатки в коде, а потому некомпелируется.
      Line_4[i]=(Line_1[i]+Line_2[i]+Line_3[i])3;// Суммарный массив
      //-------------------------------------------------------- 17 --

      Line_5[i]= Sum(Aver_Bars+1); // Индик. массив сглаженной линии
Два раза пропущен (исчез при создании ХТМЛ файла?) символ деления.
Подлинкованный в тексте файл индикатора нормальный.
 
SK. писал (а):

Ну, в целом правильно:) Поздравляю Вас. Это всегда приятно - ещё что-то понять.

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


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

P.S.: Извините, если перегнул палку:)

 
timbo:Кстати, текст индикатора опубликованный на самой странице имеет две опечатки в коде, а потому некомпелируется.
      Line_4[i]=(Line_1[i]+Line_2[i]+Line_3[i])3;// Суммарный массив
      //-------------------------------------------------------- 17 --

      Line_5[i]= Sum(Aver_Bars+1); // Индик. массив сглаженной линии
Два раза пропущен (исчез при создании ХТМЛ файла?) символ деления.
Подлинкованный в тексте файл индикатора нормальный.


Да, есть такое. В исходных кодах пока ошибок не выявлено, а текстовые коды почему-то местами порченные. Будем разбраться.
 
xnsnet:

P.S.: Извините, если перегнул палку:)

:) Да уж, немного есть)))
 
Ещё небольшое змечание есть по книге. В качестве примеров использовать лучше реальные варианты, в смысле не на кошках тренироваться, а на деньгах или на том что относится к делу. Например когда я дошёл до операторов цикла, то пример с овцами немного отвлекает от сути, ты начинаешь думать как это может использоваться в наших условиях, а это отвлекает от процесса восприятия.

Мне и так туговато циклы давались (буду ещё не раз к этим разделам возвращаться), а тут ещё и овцы эти.

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

У меня такой пример был, меня интересовало каким образом мне открыть ордер на сумму 1/3 от балланса. Вы не представляете какие математические операции были у меня в голове, для того чтоб преобразовать 1/3 в долларах так, чтоб в итоге у меня вышла цифра в лотах (0.1 или 3.5 лотов...). И как же я был рад, когда увидел пример openbuy.mq4, открывающий ордер Buy, стоимостью 35% от суммы свободных средств, с некоторыми заданными значениями стоп-приказов. Я его переглядел вдоль и поперёк, вник в каждую строчку, что, почему, куда. Посмотрел что за стандартные функции в нём используются ( MathFloor, MarketInfo. ....).
Причина обращения: