Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам - страница 2654

 
Ihar Tsitou #:

Я так и понял) Но вот как найти теперь решение?

Посмотрел первое ваше сообщение, надо в вашем коде типы явно приводить.
 
Sergey Gridnev #:
Посмотрел первое ваше сообщение, надо в вашем коде типы явно приводить.

Спасибо! Как понял, это уже через фриланс. 

 

Добрый день!

Подскажите пожалуйста в чём ошибка? 

Я хочу закрыть позиции (несколько позиций с определённым "magic"). Выборочно. 

 int positions_total = PositionsTotal();

   for(int i = positions_total - 1; i >= 0; i--)
   {
      // Получаем тикет позиции по индексу
      ulong position_ticket = PositionGetTicket(i);

      // Выбираем позицию по тикету и по магику
     if( PositionSelectByTicket(position_ticket) && (PositionGetInteger(POSITION_MAGIC)==m) )
      {
         string symbol = PositionGetString(POSITION_SYMBOL);
         // Закрываем позицию
         if (!trade.PositionClose(position_ticket))
         {
            PrintFormat("Не удалось закрыть позицию %I64u по символу %s. Ошибка: %d",
                        position_ticket, symbol, GetLastError());
         }
         else
         {
            PrintFormat("Позиция %I64u по символу %s успешно закрыта.",
                        position_ticket, symbol);
         }
      }
   }

 Магик задал следующим образом в начале эксперта:


//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int m=222;
#define EXPERT_MAGIC m  // MagicNumber of the expert

int OnInit()  // Задаём магик для всех позиций в блоке инициализации
  {
//--- зададим MagicNumber для идентификации своих ордеров
   int magic=EXPERT_MAGIC;
   trade.SetExpertMagicNumber(magic);
   return(0);
  }


То есть в чём проблема:  позиции продолжают висеть, и не закрываются при достижении условия закрытия

 
Alexey Belyakov #:

Добрый день!

Подскажите пожалуйста в чём ошибка? 

Я хочу закрыть позиции (несколько позиций с определённым "magic"). Выборочно. 

 Магик задал следующим образом в начале эксперта:


То есть в чём проблема:  позиции продолжают висеть, и не закрываются при достижении условия закрытия

int m=222;
#define EXPERT_MAGIC m  // MagicNumber of the expert

Наверное, можно просто 

#define EXPERT_MAGIC 222  // MagicNumber of the expert

Здесь лишнее PositionSelectByTicket(), PositionGetTicket() уже делает позицию активной (см. Справку).

      // Получаем тикет позиции по индексу
      ulong position_ticket = PositionGetTicket(i);

      // Выбираем позицию по тикету и по магику
     if( /*PositionSelectByTicket(position_ticket) && */(PositionGetInteger(POSITION_MAGIC)==m) )
      {

Почему не работает...

Возможно здесь: 

trade.SetExpertMagicNumber(magic);

 или здесь (собственно не закрывается)

if (!trade.PositionClose(position_ticket))

В Терминале, ID эксперта позиции/ордера, правильный ? 222?

 
Putnik #:

Наверное, можно просто 

Здесь лишнее PositionSelectByTicket(), PositionGetTicket() уже делает позицию активной (см. Справку).

Почему не работает...

Возможно здесь: 

 или здесь (собственно не закрывается)

В Терминале, ID эксперта позиции/ордера, правильный ? 222?

Понял. Cпасибо. Убрал лишнее.  Да  ID эксперта позиции/ордера, правильный.  

Кажется нашёл ошибку. Чуть отредактировал. ...

Но стало ещё интереснее. - "когда закрывает, а когда не закрывает!", пока не могу понять от чего это зависит - произвольное закрытие. Вобщем пока сам не пойму работает или нет. ( в тестере не прогонишь, приходится ждать в реале условий)

 int positions_total = PositionsTotal();

   for(int i = positions_total - 1; i >= 0; i--)
   {
      // Получаем тикет позиции по индексу
      ulong position_ticket = PositionGetTicket(i);
      ulong  magic=PositionGetInteger(POSITION_MAGIC); 
 
      // Выбираем позицию по тикету и по магику
     if (magic==EXPERT_MAGIC) 
      {
         string symbol = PositionGetString(POSITION_SYMBOL);
         // Закрываем позицию
         if (!trade.PositionClose(position_ticket))
         {
            PrintFormat("Не удалось закрыть позицию %I64u по символу %s. Ошибка: %d",
                        position_ticket, symbol, GetLastError());
         }
         else
         {
            PrintFormat("Позиция %I64u по символу %s успешно закрыта.",
                        position_ticket, symbol);
         }
      }
   }
 
Alexey Belyakov #:

Но стало ещё интереснее. - "когда закрывает, а когда не закрывает!"

int positions_total = PositionsTotal();

for(int i = positions_total - 1; i >= 0; i--)
  {
// Получаем тикет позиции по индексу
   ulong position_ticket = PositionGetTicket(i);
   ulong  magic=PositionGetInteger(POSITION_MAGIC);

// Выбираем позицию по тикету и по магику
   if(position_ticket>0)
     {
      if(PositionSelectByTicket(ticket)&&magic==EXPERT_MAGIC)
        {
         string symbol = PositionGetString(POSITION_SYMBOL);
         // Закрываем позицию
         if(trade.PositionClose(position_ticket))
           {
            PrintFormat("Позиция %I64u по символу %s успешно закрыта.",
                        position_ticket, symbol);
           }
         else
           {
            PrintFormat("Не удалось закрыть позицию %I64u по символу %s. Ошибка: %d",
                        position_ticket, symbol, GetLastError());
           }
        }
     }
  }
 
Tretyakov Rostyslav #:

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам

Putnik, 2025.08.21 19:36

int m=222;
#define EXPERT_MAGIC m  // MagicNumber of the expert

Наверное, можно просто 

#define EXPERT_MAGIC 222  // MagicNumber of the expert

Здесь лишнее PositionSelectByTicket(), PositionGetTicket() уже делает позицию активной (см. Справку).

      // Получаем тикет позиции по индексу
      ulong position_ticket = PositionGetTicket(i);

      // Выбираем позицию по тикету и по магику
     if( /*PositionSelectByTicket(position_ticket) && */(PositionGetInteger(POSITION_MAGIC)==m) )
      {

Почему не работает...

Возможно здесь: 

trade.SetExpertMagicNumber(magic);

 или здесь (собственно не закрывается)

if (!trade.PositionClose(position_ticket))

В Терминале, ID эксперта позиции/ордера, правильный ? 222?


 
Alexey Viktorov #:

У меня этот вариант работает без ошибок и пропусков
 
Tretyakov Rostyslav #:
У меня этот вариант работает без ошибок и пропусков

Я же не сказал, что не будет работать, или будет работать с пропусками…

Если вам так нравится, можете через строку ставить выбор позиции…

 

Потратил почти 3 часа времени, но решение не нашёл

Как получить вот такой шаг лотов,

начальный 0.01, коэффициент умножения 1.3

--

начальный 0.01, коэффициент умножения 1.4


--

Если коэффициент 1.5 и выше - без проблем

NormalizeLot(Buy.LastLot * Multiplier);

--

Как решить?