Как узнать текущие открытые позиции?

 

Я новичок в программировании на MQL4.

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

Мне нужны только ордера ОТКРЫТЫХ позиций а не все позиции по данному символу.

 
WarWolf001:

Я новичок в программировании на MQL4.

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

Мне нужны только ордера ОТКРЫТЫХ позиций а не все позиции по данному символу.

Почитайте документацию и учебник, там всё есть.
 
WarWolf001:

Я новичок в программировании на MQL4.

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

Мне нужны только ордера ОТКРЫТЫХ позиций а не все позиции по данному символу.

советники скрипты и индикаторы так устроены что они ничего не держат в своей памяти, а каждый тик делают что-то с нуля, при этом должны соблюдать стратегию, так и строится логика советников. Одним из основных и неотемлемых "условных" блоков функции start() которая исполняется целиком на каждом тике является перебор ордеров. как мы можем их перебрать и найти наши ордера? у нас есть их общее количество (количество открытых ордеров) и мы может поочередно их выбирать и просматривать по порядковым номерам. Порядковые номера начинаются с нуля, т.е. если у нас всего 5 октрытых ордеров то их номера будут 0 1 2 3 4 (всего 5).

Итак для перебора ордеров воспользуемся оператором цикла for (https://book.mql4.com/ru/operators/for). Общее количество ордеров нам возвращает функция OrdersTotal() (если их 5, то она вернет 5, при этом помним что последний ордер имеет номер 4 а первый 0. Итак:

for(int i=OrdersTototal()-1;i>=0;i--) {
   }

переменной i присваиваем значение количества ордеров -1, таким образом ей присвоится номер последнего ордера (4). цикл for будет работать до тех пор пока i больше или равно 0, т.е. пока не опустимся до -1 а ордера с номером -1 у нас быть не может. После каждого цикла от i отнимем 1 чтобы перейти к следующему номеру.

Теперь нам нужно выбрать ордер чтобы с помощью различных функций OrderXXXXXXX() получить от него информацию, по какой валюте н открыт, с каким меджиком, какой его тип (один из рыночных или отложенный) и так далее. Для этого есть функция OrderSelect (https://docs.mql4.com/ru/trading/orderselect). В нее передается 3 значения: номер ордера (либо его тикет, либо порядковый), способ выбора ордера (по тикету или по порядковому номеру, в зависимости от того что мы передали в начале), и среди каких ордеров мы производим выбор (тех что открыты или тех что закрыты и находятся в истории. В случае если функции по той или иной причине не удалось выбрать ордер, она возвращает ответ false, т.е. если она вернет этот ответ мы должны продолжить цикл for и перейти к следующему номеру, для этого у нас есть оператор continue.

for(i=OrdersTotal()-1;i>=0;i--) {
   if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)==false) continue;
   }

Далее нам нужно проверить ордер на то что он "наш", т.е. относится к нашему советнику. Будем исходить из противного и проверять таким образом что если ордер не наш по тому или иному параметру, перейдем к следующему ордеру. Для получения информации об выбраном ордере есть ряд функций, нас интересуют на данный момент 3: OrderSymbol() - валюта ордера, OrderMagicNumber() - меджик ордера, OrderType() - тип ордера, весь список подобных функций в перемешку с торговыми функциями есть тут (https://docs.mql4.com/ru/trading)

for(i=OrdersTotal()-1;i>=0;i--) {
   if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)==false) continue;
   if(OrderSymbol()!=Symbol()) continue;
   if(OrderMagicNumber()!=magic) continue;
   if(OrderType()>1) continue;
   // вот тут мы можем работать с нашим ордером
   }

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

extern int magic = 432221;

Тип ордера (OrderType()) можем иметь одно из 6 значений соответственно типам ордеров, подряд: бай, селл, байлимит, селллимит, байстоп, селлстоп. Они имеют как свои названия типа OP_BUY или OP_SELLSTOP, так и просто номера что гораздо удобней. (https://docs.mql4.com/ru/constants/trading), таким образом можно рыночные ордера бай и селл по параметру типа имеют значения 0,1. А отложенные 2,3,4,5. Т.е. если ордер имеет тип больше 1, а это от 2 и более, то он нас не интересует.

*важное замечание, мы не зря сделали перебор ордеров с конца, хотя могли начать и с начала for(int i=0;i<OrdersTotal();i++). В случае перебора с начала мы можем попасть в такую ситуацию что не обработаем определенный ордер если в этот момент один из ордеров был закрыт другим советником. Например всего 5 ордеров, мы начали с начала, дошли до 2го ордера и обрабатываем его, в этот момент другой советник допустим закрыл ордер номер 1. Номера всех ордеров выше сместились на 1 вниз. и ордер с номером 3 изменил свой номер на 2. а так как мы обрабатываем ордер 2, следующий ордер который будем обрабатывать имеет номер 3, а это по сути бывший 4й номер и мы пропустили ордер с номером 2 (ранее 3)

 
keep87:

советники скрипты и индикаторы так устроены что они ничего не держат в своей памяти, а каждый тик делают что-то с нуля, при этом должны соблюдать стратегию, так и строится логика советников. Одним из основных и неотемлемых "условных" блоков функции start() которая исполняется целиком на каждом тике является перебор ордеров. как мы можем их перебрать и найти наши ордера? у нас есть их общее количество (количество открытых ордеров) и мы может поочередно их выбирать и просматривать по порядковым номерам. Порядковые номера начинаются с нуля, т.е. если у нас всего 5 октрытых ордеров то их номера будут 0 1 2 3 4 (всего 5).

Нет слов!!! На столько подробно!!!

В школе пора вводить на правах читать\писать дисциплину "искать". Из-за дряхлости извилин, долго читать им не под силу, так хотя бы "искать" сами пробовали... :(

 
Спосибо за помощь
Причина обращения: