Обсуждение статьи "Библиотека для простого и быстрого создания программ для MetaTrader (Часть XXXIV): Отложенные торговые запросы - удаление ордеров, модификация ордеров и позиций по условиям"

 

Опубликована статья Библиотека для простого и быстрого создания программ для MetaTrader (Часть XXXIV): Отложенные торговые запросы - удаление ордеров, модификация ордеров и позиций по условиям:

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

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

Далее откроем две позиции на покупку и установим отложенный ордер на покупку. После чего создадим отложенные запросы на удаление ордеров и закрытие позиций по времени.


Как видно, стоп-приказы были выставлены по пересечению заданного уровня цены активации отложенных запросов, позиции были закрыты по прошествии заданного времени и ордер был удалён.

Автор: Artyom Trishkin

 

День добрый!

Спасибо за серию статей и спасибо за адаптированный под MQL4 код!

Касательно практических примеров.

Стоит задача,

  1. по наступлении определенных рыночных условий открыть несколько позиций в одном направлении с одинаковыми уровнями закрытия по убытку и разными по прибыли.
  2. при наступлении аналогичных условий ниже\выше открыть еще несколько позиций в том же направлении, снова с одинаковыми уровнями закрытия по убытку и разными по прибыли + изменить уровень убытка открытых позиций в ноль.
  3. совокупный размер первого набора позиций определить с учетом 2% убытка от баланса
  4. совокупный размер второго набора позиций определить с учетом 2% убытка от средств 
  5. работа с отложенными приказами не предполагается

В моем советнике MQL4 уже реализован алгоритм поиска точек входа, но пока совсем нет торговых операций.

Внимание, вопрос ))

Какие из  библиотек, классов, методов первой серии помогли бы мне ускорить разработку?


Рынок - новости, аналитика, прогнозы по рынкам - Блоги трейдеров и аналитика финансовых рынков
Рынок - новости, аналитика, прогнозы по рынкам - Блоги трейдеров и аналитика финансовых рынков
  • www.mql5.com
Рынок — это место, где обычно происходит обмен товара на деньги или товара на товар. Если доступ на рынок свободный, то производители и потребители проводят обмен в условиях конкуренции. Существует
 
Nikolai Karetnikov:

День добрый!

Спасибо за серию статей и спасибо за адаптированный под MQL4 код!

Касательно практических примеров.

Стоит задача,

  1. по наступлении определенных рыночных условий открыть несколько позиций в одном направлении с одинаковыми уровнями закрытия по убытку и разными по прибыли.
  2. при наступлении аналогичных условий ниже\выше открыть еще несколько позиций в том же направлении, снова с одинаковыми уровнями закрытия по убытку и разными по прибыли + изменить уровень убытка открытых позиций в ноль.
  3. совокупный размер первого набора позиций определить с учетом 2% убытка от баланса
  4. совокупный размер второго набора позиций определить с учетом 2% убытка от средств 
  5. работа с отложенными приказами не предполагается

В моем советнике MQL4 уже реализован алгоритм поиска точек входа, но пока совсем нет торговых операций.

Внимание, вопрос ))

Какие из  библиотек, классов, методов первой серии помогли бы мне ускорить разработку?


Не полное описание.

1. Открываем позиции, сразу устанавливая им первый одинаковый для них идентификатор группы в магическом номере. Теперь вся первая группа может искаться по идентификатору 1.

2. Открываем позиции, сразу устанавливая им второй одинаковый для них идентификатор группы в магическом номере. Теперь вся вторая группа может искаться по идентификатору 2.
2.1 После открытия второй группы позиций выбрать в список все позиции группы 1 и модифицировать их уровни стоплосс на рассчитанный уровень безубытка для них. Уровень рассчитывать самостоятельно. Список позиций первой группы есть в наличии - его совокупная прибыль/убыток легко рассчитываются.

3. Этот пункт - совокупный объём? Если да, то рассчитывайте его перед открытием первой группы позиций.

4. Этот пункт - совокупный объём? Если да, то рассчитывайте его перед открытием второй группы позиций. Только вот средства будут уже зависеть от занятой маржи для первой группы и её прибыли/убытке - плавающий профит/лосс по свободным средствам.

5. Отложенные запросы удобно использовать как раз для установки всех необходимых условий для открытия групп. Заранее распланировать, и выставить ожидание. Не настаиваю - это средство планирования торговой тактики и техники.

Ответ - всё это есть в первой части для реализации задуманного. Не понятен вопрос - нет попытки что-то пробовать. Соответственно - могу лишь словами.

 

Артем, добрый день

Нереальная по емкости работа, спасибо большое 

Есть одно замечание: в большинстве случаев мои тестовые терминалы МТ4 подключены к реальному торговому счету в режиме инвестора.

Идея в том, чтобы максимально использовать в тестере условия торгового счета (свопы, комиссии, стоп-уровни - все, что не подменяется в ТДС)

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

Может, имеет смысл явным образом расслабить некоторые ограничения для работы в тестере? 

Видимо, вот здесь:

//--- Проверяем разрешение торговли для данного счета (при наличии связи с торговым сервером)
   else if(!this.m_account.TradeAllowed() && !::MQLInfoInteger(MQL_TESTER))
     {
      //--- Записываем код ошибки в список и возвращаем false - нет смысла проверять далее
      this.m_error_reason_flags=TRADE_REQUEST_ERR_FLAG_ERROR_IN_LIST;
      this.AddErrorCodeToList(MSG_LIB_TEXT_ACCOUNT_NOT_TRADE_ENABLED);
      return false;
     }

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

Документация по MQL5: Константы, перечисления и структуры / Состояние окружения / Информация о счете
Документация по MQL5: Константы, перечисления и структуры / Состояние окружения / Информация о счете
  • www.mql5.com
, то позиции по каждому символу разрешается закрывать только в том порядке, в котором они были открыты — сначала самую старую, затем более новую и т.д. При попытке закрыть позиции в ином порядке будет получена ошибка. Уровень залоговых средств, при достижении которого происходит принудительное закрытие самой убыточной позиции (Stop Out). В...
 
Igor Ryabchikov:

Артем, добрый день

Нереальная по емкости работа, спасибо большое 

Есть одно замечание: в большинстве случаев мои тестовые терминалы МТ4 подключены к реальному торговому счету в режиме инвестора.

Идея в том, чтобы максимально использовать в тестере условия торгового счета (свопы, комиссии, стоп-уровни - все, что не подменяется в ТДС)

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

Может, имеет смысл явным образом расслабить некоторые ограничения для работы в тестере? 

Видимо, вот здесь:

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

Спасибо, поправлю.

 

Здравствуйте @Artyom Trishkin, спасибо за этот код.

Я попробовал запустить модифицированную версию в MT4 без кнопок тестирования, чтобы слушать события Account/Trade. но я вижу неправильный результат, когда я открыл и закрыл 3 сделки:

01:17:13.849 removed

01:17:13.733 uninit reason 4

01:15:36.860 OnDoEasyEvent: Позиция закрыта

01:15:36.860 - Позиция закрыта: 2020.08.20 23:45:29.000 -EURUSD Закрыта продажа #573015195 по цене 1.18610, Профит -0.13 USD

01:15:35.489 CEventsCollection::CreateNewEvent, строка 768: Это событие уже есть в списке

01:15:35.019 OnDoEasyEvent: Позиция закрыта

01:15:35.019 - Позиция закрыта: 2020.08.20 23:45:27.000 -EURUSD Закрыта покупка #573015193 по цене 1.18623, Профит -0.13 USD

01:15:30.144 OnDoEasyEvent: Позиция открыта

01:15:30.144 - Позиция открыта: 2020.08.20 23:45:29.000 -EURUSD Открыта 0.01 Sell #573015195 [0.01 Market-order Sell #573015195] по цене 1.18610

01:15:28.724 OnDoEasyEvent: Позиция открыта

01:15:28.724 - Позиция открыта: 2020.08.20 23:45:28.000 -EURUSD Opened 0.01 Buy #573015194 [0.01 Market-order Buy #573015194] at price 1.18623

01:15:28.263 OnDoEasyEvent: Позиция открыта

01:15:28.257 - Позиция открыта: 2020.08.20 23:45:27.000 -EURUSD Открыта 0.01 покупка #573015193 [0.01 Market-order Buy #573015193] по цене 1.18623

01:14:49.639 инициализировано

01:14:22.120 CAccount::Load: Не удалось создать структуру объекта из массива uchar

01:14:22.120 CAccount::Load: Не удалось создать структуру объекта из массива uchar

01:14:22.120 CAccount::Load: Не удалось создать структуру объекта из массива uchar

01:14:22.120 Аккаунт ****: **** (****) **** USD, 1:100, Hedge, Demo account MetaTrader 4

01:14:20.357 успешно загружен


Что возможно не так в моем тестовом коде?

 
Mohammad Bazrkar :

Здравствуйте @Artyom Trishkin, спасибо за этот код.

Я попытался запустить модифицированную версию в MT4 без кнопок тестирования, чтобы слушать события Account/Trade. но я вижу неправильный результат, когда я открыл и закрыл 3 сделки:

01:17:13.849 removed

01:17:13.733 uninit reason 4

01:15:36.860 OnDoEasyEvent: Позиция закрыта

01:15:36.860 - Позиция закрыта: 2020.08.20 23:45:29.000 -EURUSD Закрыта продажа #573015195 по цене 1.18610, Профит -0.13 USD

01:15:35.489 CEventsCollection::CreateNewEvent, строка 768: Это событие уже есть в списке

01:15:35.019 OnDoEasyEvent: Позиция закрыта

01:15:35.019 - Позиция закрыта: 2020.08.20 23:45:27.000 -EURUSD Закрыта покупка #573015193 по цене 1.18623, Профит -0.13 USD

01:15:30.144 OnDoEasyEvent: Позиция открыта

01:15:30.144 - Позиция открыта: 2020.08.20 23:45:29.000 -EURUSD Открыта 0.01 Sell #573015195 [0.01 Market-order Sell #573015195] по цене 1.18610

01:15:28.724 OnDoEasyEvent: Позиция открыта

01:15:28.724 - Позиция открыта: 2020.08.20 23:45:28.000 -EURUSD Opened 0.01 Buy #573015194 [0.01 Market-order Buy #573015194] at price 1.18623

01:15:28.263 OnDoEasyEvent: Позиция открыта

01:15:28.257 - Позиция открыта: 2020.08.20 23:45:27.000 -EURUSD Открыта 0.01 покупка #573015193 [0.01 Market-order Buy #573015193] по цене 1.18623

01:14:49.639 инициализировано

01:14:22.120 CAccount::Load: Не удалось создать структуру объекта из массива uchar

01:14:22.120 CAccount::Load: Не удалось создать структуру объекта из массива uchar

01:14:22.120 CAccount::Load: Не удалось создать структуру объекта из массива uchar

01:14:22.120 Аккаунт ****: **** (****) **** USD, 1:100, Hedge, Demo account MetaTrader 4

01:14:20.357 успешно загружен


Что возможно не так в моем тестовом коде?

Я не знаю, что вы там изменили...

 

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

Но, согласитесь, что ошибка не захвата ВТОРОЙ закрывающейся позиции на покупку не должна быть связана с моими изменениями?

Файлы:
mhdbzr-34.mq4  46 kb
 
Mohammad Bazrkar :

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

Но, согласитесь, что ошибка не захвата ВТОРОЙ закрывающейся позиции на покупку не должна быть связана с моими изменениями?

Работает ли тестовый советник без ошибок?

 
Artyom Trishkin:

Работает ли тестовый советник без ошибок?

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


эти ошибки `CAccount` появляются в стандартном TestDoEasyPart34.ex4

01:14:22.120 CAccount::Load: Не удалось создать структуру объекта из массива uchar

01:14:22.120 CAccount::Load: Не удалось создать структуру объекта из массива uchar

01:14:22.120 CAccount::Load: Не удалось создать структуру объекта из массива uchar

 
Mohammad Bazrkar:
Я запускаю модифицированный советник для наблюдения за событиями, затем вручную размещаю несколько сделок и закрываю их как можно быстрее.
Я не использую тестирование советника для открытия/закрытия позиции.


эти ошибки `CAccount` появляются в стандартном TestDoEasyPart34.ex4

01:14:22.120 CAccount::Load: Не удалось создать структуру объекта из массива uchar

01:14:22.120 CAccount::Load: Не удалось создать структуру объекта из массива uchar

01:14:22.120 CAccount::Load: Не удалось создать структуру объекта из массива uchar

Да, так и будет. Потому что там изменен подход к хранению данных учетной записи. Об этом написано в конце статьи в качестве предупреждения:
-----
Для справки:
Поскольку мы изменили структуру объекта счета (изменили размер массивов uchar для хранения строковых свойств счета и добавили еще одно целочисленное свойство), все ранее сохраненные файлы объектов счета больше не будут загружаться корректно. Если они находятся в общей папке терминалов в каталоге \Files\DoEasy\Accounts\, то их необходимо удалить перед запуском этого тестового советника - они будут заново созданы при переходе от одного аккаунта к другому с новым размером структуры объекта.
-----