Ордера, сделки, позиции. И прежде всего OrdersTotal() Кто есть что?

 

До конца не могу разделить, что есть что. Мое виденье:

Ордер - заявка на покупку или продажу. Делятся на открытые заявки (висящие в терминале) и закрытые  (т.е. исторические History)

Исторические ордера:

HistorySelect - создаем список (ордеров и список сделок)

HistoryOrdersTotal - получаем общее  количество ордеров

HistoryOrderGetTicket(i) - получаем тикет

HistoryOrderGetDouble(ticket,ORDER_PRICE_OPEN) - получаем данные об ордере. Есть еще string и integer свойства

1) HistoryOrderSelect(ticket)-- вот этот метод мне кажется лишним, я не вижу методов. При которых данные можно было получить без тикета. Зачем выбирать ордер?

Открытые ордера:

2)Список не получаем?

OrdersTotal() - получаем количество ордеров.

3)И тут неожиданность - их количество () OrdersTotal()  равно 0 при отслеживании в OnTrade(). Трайд же идет. Почему?

Хорошая статья  Но мои рыночные заявки словно исполняются без ордера. Что не так? Это из за демо?

OrderGetTicket - получить тикет и выбирает ордер. 

OrderSelect(ticket) - выбирает ордер.

4) И тут получаем дублирование методов. OrderGetTicket выбирает для получения данных, или нет?

OrderGetDouble(ORDER_PRICE_OPEN) - получение данных об ордере

 Позиция - общее направление сделок и их объем. Т.е. лонг в размере  5 позиций.

PositionsTotal() - получаем количество позиций. 

5) И тут я не понял, что такое позиция? Потому что согласно справке - позиция может быть одна. Вверх или вниз. А количество - чего? Потому что при отправке ордера с volume = 0.01 - получаю одну позицию.

PositionSelect(Symbol()) - получаю открытую позицию. 

6) И тут она оказывается одна? А что я вижу в Инструменты -> Торговля ? Там появляется столько строчек, сколько есть позиций. И для каждой прописан ее объем.

PositionGetDouble - получаю данные о позиции

Сделки - положительный результат ордера, который создает позицию. 

Проблем со сделками у меня не возникло. Сомнения только в отношении определения, но все работает как нужно.

7) Вопрос только - общее количество сделок при создании списка методом  HistorySelect(0,TimeCurrent()); когда обнуляются? В смысле они где хранятся? 

Обработка торговых событий в эксперте при помощи функции OnTrade()
Обработка торговых событий в эксперте при помощи функции OnTrade()
  • www.mql5.com
В 5-ой версии языка MQL появилась масса нововведений, в том числе работа с событиями различных типов (события таймера, торговые события, пользовательские и т.д.). Возможность обработки событий позволяет создавать совершенно новый тип программ для автоматического и полуавтоматического трейдинга. В этой статье мы рассмотрим торговые события и напишем для функции OnTrade() код, который будет обрабатывать событие Trade.
 

Просто откройте справку и почитайте.


 
Alexey Viktorov:

Просто откройте справку и почитайте.


Да толку это читать. У меня 7 вопросов возникло. А прочитал я не мало. Почему физически есть  PositionsTotal(), если позиция одна? Или не одна. Как хочешь так и понимай
 
vbymrf:

И тут я не понял, что такое позиция? Потому что согласно справке - позиция может быть одна. Вверх или вниз. А количество - чего? Потому что при отправке ордера с volume = 0.01 - получаю одну позицию.

Дело в том что разработчики сначала сделали в МТ5 банковский принцип учёта чистой нетто-позиции (то есть например 5 объемов лонгов против 3 объемов шортов дают чистую позицию 2 лонг) а потом они добавили хеджинговый принцип когда позиции могут существовать разнонаправленно (5 лонг и 3 шорт одновременно) а в справке просто не дописали про это... [примечание: как выяснилось позже, всё-таки написали]

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

 
transcendreamer:

Дело в том что разработчики сначала сделали в МТ5 банковский принцип учёта чистой нетто-позиции (то есть например 5 объемов лонгов против 3 объемов шортов дают чистую позицию 2 лонг) а потом они добавили хеджинговый принцип когда позиции могут существовать разнонаправленно (5 лонг и 3 шорт одновременно) а в справке просто не дописали про это

Список позиции в истории существует, как со сделками? Или список открытых позиций?

Прежде всего код использования. Потому что есть PositionGetTicket() - и далее пустота. Куда его кинуть, что бы данные о позиции получить?

 
vbymrf:

7) Вопрос только - общее количество сделок при создании списка методом  HistorySelect(0,TimeCurrent()); когда обнуляются? В смысле они где хранятся? 

Они хранятся где-то в эфемерном запредельном пространстве 😁

На практике нужно сначала вызвать HistorySelect чтобы приказать терминалу какой интервал истории сделок и ордеров отфильтровать, а потом вызвать HistoryDealsTotal либо HistoryOrdersTotal чтобы понять сколько всего сделок/ордеров в итоге терминал нафильтровал, после чего можно устроить перебор по циклу выбирая тикет сделки/ордера с помощью  HistoryOrderGetTicket / HistoryDealGetTicket

Получается немного как бы через одно место но если один раз запомнить это шаманство то дальше всё нормально будет, пример можно вот тут посмотреть: https://www.mql5.com/ru/docs/trading/historyselect

Важно: в функцию передаётся индекс позиции/ордера, а она возвращает тикет, по которому можно выбрать ордер/сделку. Тикет это не индекс!

Документация по MQL5: Торговые функции / HistorySelect
Документация по MQL5: Торговые функции / HistorySelect
  • www.mql5.com
HistorySelect - Торговые функции - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
vbymrf:

Список позиции в истории существует, как со сделками? Или список открытых позиций?

Прежде всего код использования. Потому что есть PositionGetTicket() - и далее пустота. Куда его кинуть, что бы данные о позиции получить?

Насколько я знаю, нет, в истории только сделки, позиций нет, позиции существуют только в текущий момент здесь-и-сейчас... 

Мой скромный пример кода для перебора позиций и подсчёта их общего нетто-объёма (наверняка не оптимальный но работает):

   double volume=0; // заводим переменную для подсчета объема
   int positions=PositionsTotal(); // спрашиваем сколько позиций есть сейчас в терминале
   for(int k=0; k<positions; k++) // тут перебираем по циклу все позиции (неважно неттинг/хеджинг)
     {
      ulong ticket=PositionGetTicket(k); // спрашиваем тикет позиции по индексу
      if(!PositionSelectByTicket(ticket)) // выполняем ритуальное действие чтобы терминал выбрал нужную позицию
         continue; // если не выбралась значит случилась какая-то фигня и переходим к следующей позиции
      if(PositionGetInteger(POSITION_MAGIC)!=magic) // спрашиваем магическое число 
         continue; // если магическое число чужое (не нашего эксперта) то пропускаем эту позицию
      long type=PositionGetInteger(POSITION_TYPE); // определяем тип позиции
      if(type==POSITION_TYPE_BUY) // если покупка
         volume+=PositionGetDouble(POSITION_VOLUME); // складываем чиселку
      if(type==POSITION_TYPE_SELL) // если продажа
         volume-=PositionGetDouble(POSITION_VOLUME); // вычитаем чиселку
     } 
// всё! в итоге volume содержит нетто-объем всех наших позиций (нашего эксперта)

 
transcendreamer:

Дело в том что разработчики сначала сделали в МТ5 банковский принцип учёта чистой нетто-позиции (то есть например 5 объемов лонгов против 3 объемов шортов дают чистую позицию 2 лонг) а потом они добавили хеджинговый принцип когда позиции могут существовать разнонаправленно (5 лонг и 3 шорт одновременно) а в справке просто не дописали про это...

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

Вот чего несёшь? Сам-то читал хоть один раз справку? Вот цитата из документации:

Общие принципы

Хеджинговая система

Эта система учета позволяет иметь на счету множество торговых позиций по оному и тому же инструменту, в том числе — разнонаправленных.

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

Ниже приведен пример совершения двух сделок на покупку EURUSD объемом 0,5 лота каждая:

 
vbymrf:
Да толку это читать. У меня 7 вопросов возникло. А прочитал я не мало. Почему физически есть  PositionsTotal(), если позиция одна? Или не одна. Как хочешь так и понимай

Всё-же почитайте… Даже при неттинговой системе одна позиция может быть только на одном символе. На другом уже другая позиция. В итоге их две. Следовательно PositionsTotal() в таком случае вернёт 2. А как тут ещё можно понять???

 
Alexey Viktorov:

Вот чего несёшь? Сам-то читал хоть один раз справку? Вот цитата из документации:

Чего так бычишься на ровном месте, сходи чайку что ли попей 😁

фраза относилась к тому контексту справки, которую топик-стартер привёл, всего лишь

 

P.S. кстати в справке как раз действительно написали (в примечании) 

это просто топик стартер не дочитал в статье PositionSelect ➡ а я и подумал что и правда нет там про это ➡ после чего кое-кто бомбанул (не будем показывать пальцами) 

вот так легко можно устроить холивар  ⚔️😁

https://www.mql5.com/ru/docs/trading/positionselect

Документация по MQL5: Торговые функции / PositionSelect
Документация по MQL5: Торговые функции / PositionSelect
  • www.mql5.com
PositionSelect - Торговые функции - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5