Самообучение языку MQL5 с полного нуля - страница 66

 
Valeriy Yastremskiy:

Оператор цикла и операторы в теле цикла. Не совсем классический русский язык.

Все конечно хорошо, но где итератор i в теле цикла? И для того что бы получить символ позиции и ее магик ее надо сперва выбрать. Описание позиции это структура (в мкл5 все структура и ордера и время и сделки) и она заполняется через выбор, селект по итератору который не тикет позиции, а номер позиции. и надо помнить, что в структуре описания позиции всегда последний выбор позиции.

Здравствуйте, Валерий! Спасибо за пояснение.

В этом-то и была заключена вся моя непонятка, т.к. без оператора цикла for всё работало, а с ним, почему-то нет. Правильно ли Вас понял, что нужно сначала делать все необходимые запросы через request?

С уважением, Владимир.

 
MrBrooklin:

Здравствуйте, Валерий! Спасибо за пояснение.

В этом-то и была заключена вся моя непонятка, т.к. без оператора цикла for всё работало, а с ним, почему-то нет. Правильно ли Вас понял, что нужно сначала делать все нужные запросы через request?

С уважением, Владимир.

нет, не совсем знаю МКЛ5 . Это запрос на исполнение. А нужно выбрать позицию по номеру, для дальнейшей работы с ней.

PositionSelect

думаю так.

 
MrBrooklin:

Всем доброго дня и хорошего настроения!

Ужаемые специалисты! Прошу подсказать, но только не исправленным кодом, а словами, иначе так никогда не изучу язык программирования MQL5.

С уважением, Владимир.

Здравствуйте! Словами; дело в том, что применив цикл перебора открытых позиций Вы его никак не обозначили в условиях "если", тоесть что именно перебирает цикл for, также Вы его ничем не завершили, он должен что то возвращять...

Подсчёт открытых позиций происходит постоянно, и лучше создать блок с циклом а при открытии к нему обращаться, например так;

input int MaxOpenedPositions=1;
.
.
.
int Total=TotalPositions(-1);
if(Total<MaxOpenedPositions && другие условия для открытия) OpenBUY();//например
if(Total<MaxOpenedPositions && другие условия для открытия) OpenSELL();//например

//+------------------------------------------------------------------+
//| Total Positions                                                  |
//+------------------------------------------------------------------+
int TotalPositions(int Type)
   {
int cnt=0;
if(PositionsTotal()>0)
for(int i=PositionsTotal()-1;i>=0;i--)
   
if(PositionSelectByTicket(PositionGetTicket(i)) && PositionGetString(POSITION_SYMBOL)==_Symbol && PositionGetInteger(POSITION_MAGIC)==MagicNumber) 
   {
   if(PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_BUY) {cnt++;continue;}
   if(PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_SELL) {cnt++;}
   }
   return(cnt);
   }
 
Valeriy Yastremskiy:

нет, не совсем знаю МКЛ5 . Это запрос на исполнение. А нужно выбрать позицию по номеру, для дальнейшей работы с ней.

PositionSelect

думаю так.

Перепробовал всё, в том числе и PositionSelect. Ничего не помогло.

С уважением, Владимир.

 
VVT:

Здравствуйте! Словами; дело в том, что применив цикл перебора открытых позиций Вы его никак не обозначили в условиях "если", тоесть что именно перебирает цикл for, также Вы его ничем не завершили, он должен что то возвращять...

Подсчёт открытых позиций происходит постоянно, и лучше создать блок с циклом а при открытии к нему обращаться, например так;

Здравствуйте!

Спасибо за подсказку. Попробую разобраться и применить Ваш вариант перебора открытых позиций.

С уважением, Владимир.

 
VVT:

Здравствуйте! Словами; дело в том, что применив цикл перебора открытых позиций Вы его никак не обозначили в условиях "если", тоесть что именно перебирает цикл for, также Вы его ничем не завершили, он должен что то возвращять...

Кстати, по поводу того, что цикл должен по завершении что-то возвращать, в Справочнике MQL5 ничего не сказано. Может опять не так что-то понял? Или это касается оператора if?

С уважением, Владимир.

 
MrBrooklin:

Перепробовал всё, в том числе и PositionSelect. Ничего не помогло.

С уважением, Владимир.

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

Можно через 

  • PositionGetTicket возвращает тикет позиции по номеру позиции (а у нас номер) и получив тикет позиции мы можем получить ее символ и магик.
Или если это неттинг подумать, и решить, а зачем нам общее количество ордеров или позиций, если у нас на одном инструменте может быть только одна позиция, и нам это и нужно узнать. Поэтому цикл может и не нужен. На нашем инструменте делаем Если ПозишнСелект возвращает Ложь, то открывает позицию, а если Тру, то происходит выбор позиции на этом инструменте и мы можем с ним работать, и модифицировать для трала.
 
Valeriy Yastremskiy:

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

Можно через 

  • PositionGetTicket возвращает тикет позиции по номеру позиции (а у нас номер) и получив тикет позиции мы можем получить ее символ и магик.
Или если это неттинг подумать, и решить, а зачем нам общее количество ордеров или позиций, если у нас на одном инструменте может быть только одна позиция, и нам это и нужно узнать. Поэтому цикл может и не нужен. На нашем инструменте делаем Если ПозишнСелект возвращает Ложь, то открывает позицию, а если Тру, то происходит выбор позиции на этом инструменте и мы можем с ним работать, и модифицировать для трала.

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

С уважением, Владимир.

 
MrBrooklin:

Кстати, по поводу того, что цикл должен по завершении что-то возвращать, в Справочнике MQL5 ничего не сказано. Может опять не так что-то понял?

С уважением, Владимир.

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

 
MrBrooklin:

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

С уважением, Владимир.

Можно применить 

  • PositionGetTicket возвращает тикет позиции по номеру позиции (а у нас номер) и получив тикет позиции мы можем получить ее символ и магик.

Перебрать все тикеты по номеру. И через тикеты узнать символы позиций и сравнить с нашей. Получить магик позиций и сравнить с нашим.

if(PositionSelectByTicket(PositionGetTicket(i)) && PositionGetString(POSITION_SYMBOL)==_Symbol && 
PositionGetInteger(POSITION_MAGIC)==MagicNumber) // вот эта строчка

Но только зачем.

Причина обращения: