Просто откройте справку и почитайте.
И тут я не понял, что такое позиция? Потому что согласно справке - позиция может быть одна. Вверх или вниз. А количество - чего? Потому что при отправке ордера с volume = 0.01 - получаю одну позицию.
Дело в том что разработчики сначала сделали в МТ5 банковский принцип учёта чистой нетто-позиции (то есть например 5 объемов лонгов против 3 объемов шортов дают чистую позицию 2 лонг) а потом они добавили хеджинговый принцип когда позиции могут существовать разнонаправленно (5 лонг и 3 шорт одновременно) а в справке просто не дописали про это... [примечание: как выяснилось позже, всё-таки написали]
То есть на неттинговом счете будет только одна позиция по инструменту, а на хеджинговом счете может быть много позиций по одному инструменту...
Дело в том что разработчики сначала сделали в МТ5 банковский принцип учёта чистой нетто-позиции (то есть например 5 объемов лонгов против 3 объемов шортов дают чистую позицию 2 лонг) а потом они добавили хеджинговый принцип когда позиции могут существовать разнонаправленно (5 лонг и 3 шорт одновременно) а в справке просто не дописали про это
Список позиции в истории существует, как со сделками? Или список открытых позиций?
Прежде всего код использования. Потому что есть PositionGetTicket() - и далее пустота. Куда его кинуть, что бы данные о позиции получить?
7) Вопрос только - общее количество сделок при создании списка методом HistorySelect(0,TimeCurrent()); когда обнуляются? В смысле они где хранятся?
Они хранятся где-то в эфемерном запредельном пространстве 😁
На практике нужно сначала вызвать HistorySelect чтобы приказать терминалу какой интервал истории сделок и ордеров отфильтровать, а потом вызвать HistoryDealsTotal либо HistoryOrdersTotal чтобы понять сколько всего сделок/ордеров в итоге терминал нафильтровал, после чего можно устроить перебор по циклу выбирая тикет сделки/ордера с помощью HistoryOrderGetTicket / HistoryDealGetTicket
Получается немного как бы через одно место но если один раз запомнить это шаманство то дальше всё нормально будет, пример можно вот тут посмотреть: https://www.mql5.com/ru/docs/trading/historyselect
Важно: в функцию передаётся индекс позиции/ордера, а она возвращает тикет, по которому можно выбрать ордер/сделку. Тикет это не индекс!
- www.mql5.com
Список позиции в истории существует, как со сделками? Или список открытых позиций?
Прежде всего код использования. Потому что есть 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 содержит нетто-объем всех наших позиций (нашего эксперта)
Дело в том что разработчики сначала сделали в МТ5 банковский принцип учёта чистой нетто-позиции (то есть например 5 объемов лонгов против 3 объемов шортов дают чистую позицию 2 лонг) а потом они добавили хеджинговый принцип когда позиции могут существовать разнонаправленно (5 лонг и 3 шорт одновременно) а в справке просто не дописали про это...
То есть на неттинговом счете будет только одна позиция по инструменту, а на хеджинговом счете может быть много позиций по одному инструменту...
Вот чего несёшь? Сам-то читал хоть один раз справку? Вот цитата из документации:
Хеджинговая система
Эта система учета позволяет иметь на счету множество торговых позиций по оному и тому же инструменту, в том числе — разнонаправленных.
Если по торговому инструменту есть открытая позиция и трейдер совершает новую сделку (или срабатывает отложенный ордер), происходит открытие новой позиции. Существующая позиция не изменяется.
Ниже приведен пример совершения двух сделок на покупку EURUSD объемом 0,5 лота каждая:
Да толку это читать. У меня 7 вопросов возникло. А прочитал я не мало. Почему физически есть PositionsTotal(), если позиция одна? Или не одна. Как хочешь так и понимай
Всё-же почитайте… Даже при неттинговой системе одна позиция может быть только на одном символе. На другом уже другая позиция. В итоге их две. Следовательно PositionsTotal() в таком случае вернёт 2. А как тут ещё можно понять???
Вот чего несёшь? Сам-то читал хоть один раз справку? Вот цитата из документации:
Чего так бычишься на ровном месте, сходи чайку что ли попей 😁
фраза относилась к тому контексту справки, которую топик-стартер привёл, всего лишь
P.S. кстати в справке как раз действительно написали (в примечании)
это просто топик стартер не дочитал в статье PositionSelect ➡ а я и подумал что и правда нет там про это ➡ после чего кое-кто бомбанул (не будем показывать пальцами)
вот так легко можно устроить холивар ⚔️😁
https://www.mql5.com/ru/docs/trading/positionselect
- www.mql5.com
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
До конца не могу разделить, что есть что. Мое виденье:
Ордер - заявка на покупку или продажу. Делятся на открытые заявки (висящие в терминале) и закрытые (т.е. исторические 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()); когда обнуляются? В смысле они где хранятся?