Меню Рубрики

Как написать цикл перебора ордеров при пяти знаках после запятой

Организация цикла перебора ордеров

Часто в тестере, если бегунок скорости поставить на 31 — это медленно, если поставить на 32 — тест со сверхскоростью устремляется к своему завершению.

Выкручиваюсь, вставляя в код задержку через счетчик:

Задержку через input можно регулировать в зависимости от быстроты советника и мощности процессора.

Теперь на скорости 32 можно двигаться к тем моментам, которые интересуют, с той скоростью, которая меня устраивает.

Ниже будет затронута тема, которая касается не только MT4, но и MT5 с другими платформами. Но для удобного восприятия логика будет написана на MQL4, поэтому в этой ветке.

Чаще всего костяк (мясо наращивается любое) модификации/удаления ордеров сводится к следующей логике

А теперь подход редкий, но гораздо правильнее

После отправки торгового приказа меняется торговое окружение, поэтому желательно сразу после ответа торгового сервера выполнять с нуля всю торговую логику ТС.

А теперь подход редкий, но гораздо правильнее

Этот вариант при любой ошибке зацикливается на модификации последнего в списке ордера, и советник, у которого ордеров больше 1, все остальные «теряет из виду».

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

Этот вариант при любой ошибке зацикливается на модификации последнего в списке ордера, и советник, у которого ордеров больше 1, все остальные «теряет из виду».

Зацикливания не будет из-за этого условия

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

Тогда в журнале терминала можно будет увидеть больше ошибок торговых запросов .

Зацикливания не будет из-за этого условия

Да, неправ, прочел его как !OrderModify.

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

Тогда в журнале терминала можно будет увидеть больше ошибок торговых запросов .

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

Что-то в этой логике неправильно изначально. Тут надо сделать осознанный выбор: лучше один актуальный ордер или много неактуальных.

Пусть OrderModify выполняется 5 секунд. За время его выполнения пусть несколько раз на торговом сервере исполнился частично лимитный ордер, породив десяток сделок.

Что-то в этой логике неправильно изначально. Тут надо сделать осознанный выбор: лучше один актуальный ордер или много неактуальных.

Один ордер не может быть на разных уровнях одновременно. Или заводить под каждый уровень своего советника? Сомнительное решение для подавляющего большинства стратегий.

Как частный случай — несколько позиций (набрали по тренду несколькими входами) и трейлинг-стоп для них. Тянуть СЛ только одной сделки, или модифицировать все? На резком движении с таким же резким последующим откатом вариант модификации только одного ордера сильно проиграет (а до остальных дело не дойдет, потому что каждый новый вызов ОнТик будет модифицировать тот самый первый в списке ордер).

Пусть OrderModify выполняется 5 секунд. За время его выполнения пусть несколько раз на торговом сервере исполнился частично лимитный ордер, породив десяток сделок.

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

Иначе всегда есть риск работать с одной — последней — исполненной частью одного последнего ордера. Возможно, самой маленькой частью. Оставив крупный ордер висеть без присмотра.

Один ордер не может быть на разных уровнях одновременно. Или заводить под каждый уровень своего советника? Сомнительное решение для подавляющего большинства стратегий.

Как частный случай — несколько позиций (набрали по тренду несколькими входами) и трейлинг-стоп для них. Тянуть СЛ только одной сделки, или модифицировать все? На резком движении с таким же резким последующим откатом вариант модификации только одного ордера сильно проиграет (а до остальных дело не дойдет, потому что каждый новый вызов ОнТик будет модифицировать тот самый первый в списке ордер).

Не понимаю, почему OnTick будет модифицировать только один ордер? Все будут модифицироваться.

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

Иначе всегда есть риск работать с одной — последней — исполненной частью одного последнего ордера. Возможно, самой маленькой частью. Оставив крупный ордер висеть без присмотра.

Обращаю внимание на слово «костяк». Мясо в виде выбора приоритета по лоту или что-то иное всегда можно нарастить. Основа логики же остается неизменной: после успешного торгового приказа запусти всю торговую логику с нуля.

Источник статьи: http://www.mql5.com/ru/forum/215783

Управление ордерами – это просто

1. Вступление

В каждом торгующем эксперте есть блок контроля открытых позиций. Это – перебор всех ордеров в цикле, выбор «своей» позиции по символу и и значению MagicNumber и последующее её изменение или закрытие. Выглядят такие блоки очень похоже, и, чаще всего, одинаковы по функциональности. Поэтому можно вынести этот повторяющийся кусок кода из эксперта в функцию – это значительно упростит написание экспертов и сделает код экспертов компактнее.

Для начала, давайте, разделим задачу на три этапа, отличающихся по сложности и функциональности – они будут соответствовать трем видам экспертов:

  • Эксперты, у которых одновременно может быть открыта только одна позиция;
  • Эксперты, у которых может быть открыто по одной позиции каждого типа (например, одна позиция buy и одна позиция sell);
  • Эксперты, у которых может быть открыто любое количество позиций.

2. Одна позиция

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

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

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

Как видите, всё просто: есть 11 переменных, каждая хранит значение одной характеристики позиции (№ тикета, тип, размер лота, и т.д.). В начале функции происходит обнуление этих переменных. Это необходимо потому, что они объявлены на глобальном уровне и не обнуляются при вызове функции, а нам не нужна информация с предыдущего тика – все данные должны быть свежими. Потом идёт стандартный перебор всех открытых позиций и, в случае совпадения символа и значения MagicNumber, запоминание характеристик в соответствующие переменные.

Теперь давайте подключим эту функцию к нашему эксперту:

Как видите, теперь код эксперта намного компактнее и удобнее для восприятия. И это – самый простой случай.

Давайте теперь разберёмся со следующей задачей.

3. Одна позиция одного типа

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

  • При запуске эксперт должен устанавливать два отложенных ордера: бай-стоп на уровне Аск + 20 пунктов и селл-стоп на уровне Бид – 20 пунктов;
  • При срабатывании одного из ордеров второй должен быть удален;
  • Открытая позиция должна сопровождаться Трейлинг Стопом;
  • После закрытия позиции по Стоп Лоссу или Тейк Профиту переходим к пункту первому, то есть опять устанавливаем два отложенных ордера.

Код эксперта будет выглядеть так:

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

А теперь подключим функцию к эксперту:

Здесь разница между исходным и переделанным экспертами намного заметнее – блок контроля позиций очень прост и понятен.

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

4. Контроль над всеми позициями

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

  • При старте, обнуляем все массивы;
  • Потом перебираем все ордера, и записываем в массивы характеристики только тех, у которых символ соответствует символу графика, и MagicNumber равен параметру функции magic;
  • Для удобства использования, добавим одну глобальную переменную, которая будет хранить общее количество ордеров, принадлежащих эксперту – при обращении к массивам это будет очень кстати.

Сразу приступаем к написанию функции:

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

Его код достаточно простой:

Если установить _MagicNumber равным 0, эксперт будет отображать список позиций, открытых вручную:

5. Заключение

В заключительной части статьи хотелось бы сравнить быстродействие экспертов, самостоятельно перебирающих свои ордера, и экспертов, использующих функции. Для этого были протестированы обе версии в режиме «все тики» 10 раз подряд (оптимизация по параметру _MagicNumber). Замер времени тестирования проводил сам Meta Trader – при оптимизации автоматически считается затраченное время.

Время, затраченное на 10 тестов (мм:сс)

CrossMACD_beta (без функции)

DoublePending_beta (без функции)

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

В любом случае, использовать их или нет – решать каждому самостоятельно.

как могу я получить от последних данных по заказа? не от сперва и 2-ое, только всегда получать последнюю информацию.

egt520 писал(а):
как могу я получить от последних данных по заказа? не от сперва и 2-ое, только всегда получать последнюю информацию.

Замените эту строку
на эту:

Если Вас не затруднит, дайте ответ на такой вопрос, я думаю Вы продумывали эту тему.

Наши ордера появляются/удаляются на торговом сервере в нашем активном (ON_TRADE) пуле ордеров разными путями.
1) Немедленное исполние распоряжения на открытие ордера — в результате в пуле появляется ордер со всеми окончательно заполненными полями, за исключением поля OrderClosePrice. Остальные поля либо фиксированы, либо сопровождаются торговым сервером. Поле OrderOpenTime — отображает реальное время (время торговой платформы) открытия ордера. Здесь маленький вопрос-вероятно, он помещается в хвост пула, т.е. ему присваивается следующий по порядку номер ?
2) Установка отложенного ордера — в результате в пуле появляется ордер со всеми окончательно заполненными полями, за исключением поля OrderCloseTime. Здесь маленький вопрос OrderOpenTime — хранит ,скорее всего, время установки отложенного ордера ? И такой же вопрос как и в 1) — ему присваивается следующий по порядку номер в хвосте ?
3) При закрытие ордера (принудительно или по срабатыванию) происходит его удаление из активного пула и перевод в исторический пул(ON_HISTORY) — тут все ясно. И опять же тот самый вопрос-порядок следования ордеров в активном пуле остается прежним ? т.е., происходит простое поджатие ордеров, иди остается «дырка», а нумерация сохраняется прежней ?
4) При срабатывание отложенного ордера, что реально происходит в активном пуле-просто меняются значения полей в том же самом элементе активного пула ? а порядок и нумерация ордеров сохраняются ?

Короче вопросы такие:
— при добавление ордера в пул, он просто ставится в хвост пула, получая следующий в порядке возрастания номер(самый первый номер это нулевой) ?
— при вычеркивание/изменение(как в случае со срабатыванием отложеннонго ордера) как это отражается на порядке и нумерации ордеров в пуле ?

В Вашей функции AllOrderInit нулевые элементы массивов, представляют последний по номеру ордер в активном пуле. Что это за ордер -самый поздний по времени открытия/установки ?

Вы могли бы сами проследить за появлением и исчезновением ордеров — это не сложно 😉

Закрытый/удаленный ордер перемещается в историю («ON_HISTORY»), а все ордера, находящиеся в списке открытых ордеров «выше» закрытого, перемещаются «вниз».

Просто распечатайте время открытия и посмотрите сами 😉
Я, если честно, не проверял.

Кстати, возможно, порядок зависит от сортировки списка ордеров в терминале.

Рассматриваются общие принципы построения учёта ордеров в сложной программе.

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

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

Статья посвящена реализации графиков без пропущенных баров.

Источник статьи: http://www.mql5.com/ru/articles/1404


0 0 голоса
Article Rating
Подписаться
Уведомить о
guest

0 Комментарий
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии