Вопросы от начинающих MQL5 MT5 MetaTrader 5 - страница 1515

 

Небольшое уточнение к Вашему коду:

  1. сначала нужно получить тикет позиции по индексу в списке открытых позиций;
  2. затем получить символ у открытой позиции.
Почему именно так, а не наоборот? В документации всё чётко прописано:

Функция PositionGetTicket возвращает тикет позиции по индексу в списке открытых позиций
и автоматически выбирает эту позицию для дальнейшей работы с ней при помощи функций PositionGetDouble, PositionGetInteger, PositionGetString.

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

 
maxvoronin74 #:
Верно ли я понимаю, что в данном случае position_symbol и magic относятся именно к данному ticket? Работает ли конкатенация, вроде ticket.magic  или ticket.symbol? Верна ли запись теперь?

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

    for(int i = PositionsTotal(); i-- > 0;)
     {
      ulong posTicket = PositionGetTicket(i);
      long posMagic = PositionGetInteger(POSITION_MAGIC);
      string posSymbol = PositionGetString(POSITION_SYMBOL);
      if(posSymbol == _Symbol && posMagic == Magic_m)
       {

У каждого свой принцип программирования и на мой взгляд вот эта строка вашего кода выглядит как-то странно

      if(total = 0 || (ticket > 0 && position_symbol==Symbol() && magic != Magic_m))

Зачем проверка if(total = 0 ……… ведь если нет открытых позиций, то и цикл выполняться просто не будет.

Да и проверка if(………magic != Magic_m)) ничего не даёт. Ведь если позиция имеет иной магик, то просто начнётся новая итерация цикла и без дополнительных команд.

Но это всё на любителя. Если нравится так, то пишите так…

 
MrBrooklin #:
автоматически выбирает эту позицию для дальнейшей работы с ней при помощи функций PositionGetDouble, PositionGetInteger, PositionGetString

Благодарю. Выяснял, что конкретно может значить это "автоматически".

 
Alexey Viktorov #:

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

У каждого свой принцип программирования и на мой взгляд вот эта строка вашего кода выглядит как-то странно

Зачем проверка if(total = 0 ……… ведь если нет открытых позиций, то и цикл выполняться просто не будет.

Да и проверка if(………magic != Magic_m)) ничего не даёт. Ведь если позиция имеет иной магик, то просто начнётся новая итерация цикла и без дополнительных команд.

Но это всё на любителя. Если нравится так, то пишите так…

Возможно, это из-за того, что у меня i >= 0. У Вас - больше нуля. И конкатенация, о которой я спрашивал, не принимается MetaEditor-ом. Хотя я взял ее из статьи МетаКвот (https://www.mql5.com/ru/articles/12103)...

А почему Вы не проверяете posTicket на равенство нулю? Ведь равенство нулю по документации свидетельствует об ошибке?

Касаемо ненужности проверки магика я пока не понимаю. Смысл кода - быть уверенным, что не открыта позиция именно этим экспертом на данном инструменте. Экспертов на инструменте несколько. У каждого - свое окно. Эксперты магиком и отличаются.

Тестирование и оптимизация стратегий для бинарных опционов в MetaTrader 5
Тестирование и оптимизация стратегий для бинарных опционов в MetaTrader 5
  • www.mql5.com
Проверяем и оптимизируем стратегии для бинарных опционов в MetaTrader 5.
 
maxvoronin74 #:

И конкатенация, о которой я спрашивал, не принимается MetaEditor-ом. Хотя я взял ее из статьи МетаКвот (https://www.mql5.com/ru/articles/12103)...

По конкатенации выяснил, что, видиимо, класс диктует вместо position писать m_position.

 
maxvoronin74 #:

По конкатенации выяснил, что, видиимо, класс диктует вместо position писать m_position.

Переменную position или m_position можете назвать как угодно, например, pos, posit, k_pos, k_position и т.д. и т.п.

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

 
MrBrooklin #:

Переменную position или m_position можете назвать как угодно, например, pos, posit, k_pos, k_position и т.д. и т.п.

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

С переменными Вы правы. Но в классе CTrade эта строка m_position, наверное, как-то иначе называется. Чтобы открыть позицию, пишем m_trade.Buy(), вместо position.Magic(), как в статье, пишем m_position.Magic(). Везде эта приставка m_.
 

Похоже Вы запутались. Вот посмотрите и прочитайте внимательно комментарии к каждой строке:

#include <Trade\PositionInfo.mqh>  // включим файл PositionInfo.mqh
#include <Trade\Trade.mqh>         // включим файл Trade.mqh
#include <Trade\SymbolInfo.mqh>    // включим файл SymbolInfo.mqh
#include <Trade\AccountInfo.mqh>   // включим файл AccountInfo.mqh

CPositionInfo m_position; // CPositionInfo - класс для работы со свойствами открытой позиции;  m_position - переменная для упрощенного доступа к свойствам открытой позиции
CTrade        m_trade;    // CTrade        - класс для совершения торговых операций;           m_trade    - переменная для упрощенного доступа к торговым операциям
CSymbolInfo   m_symbol;   // CSymbolInfo   - класс для работы со свойствами торг. инструмента; m_symbol   - переменная для упрощенного доступа к свойствам торгового инструмента
CAccountInfo  m_account;  // CAccountInfo  - класс для работы со свойствами торгового счета;   m_account  - переменная для упрощенного доступа к свойствами торгового счета

Надеюсь теперь будет всё понятно. По поводу переменной уже написал в этой теме, что она может быть названа, как position, так и m_position и т.д и т.п.

И, пжл, задавайте вопросы в одной этой теме, так проще будет получить помощь.

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

 
MrBrooklin #:

Похоже Вы запутались. Вот посмотрите и прочитайте внимательно комментарии к каждой строке:

Надеюсь теперь будет всё понятно. По поводу переменной написал Вам в другой теме, что она может быть названа, как position, так и m_position и т.д и т.п.

И, пжл, задавайте вопросы в этой теме, так проще будет получить помощь.

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

Да, извините, не CTrade, а CPositionInfo. Но все равно нельзя написать вместо m_position position или " pos, posit, k_pos, k_position и т.д. и т.п. ", как Вы пишете. Забито в классе именно m_position (CPositionInfo m_position;).

 

Можно писать любое название переменной, главное, чтобы дальше в коде она была с одним и тем же названием. Пример:

#include <Trade\PositionInfo.mqh>  // включим файл PositionInfo.mqh

CPositionInfo k_pos;               // объявим переменную, например, k_pos

// Далее в коде должны использовать только это название переменной

   for(int i=PositionsTotal()-1;i>=0;i--)
      if(k_pos.SelectByIndex(i)) // selects the position by index for further access to its properties
         if(k_pos.Symbol()==m_symbol.Name() && k_pos.Magic()==m_magic)
           {
            if(k_pos.PositionType()==POSITION_TYPE_BUY)
               buys=true;

            if(k_pos.PositionType()==POSITION_TYPE_SELL)
               sells=true;

            if(buys && sells)
               return;
           }

Ещё вопросы остались?

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